首页/ 技术/ 比特币挖矿原理探秘二
投诉
取消
提交

比特币挖矿原理探秘二

文| 财神

在之前的一篇文章当中,已经介绍过比特币的挖矿原理了,不过再查了很多资料后,发现还是有些知识被遗漏了,而且也解决了我一直存有的疑惑,有种豁然开朗的感觉。 所以,今天又特写了一篇补充稿。

继续学习一下吧。

第一,我们要学会看懂区块链浏览器中的信息,我找当前最新一个区块,通过浏览器可以查到以下信息:

比特币挖矿原理探秘二配图(1)
  1. 区块高度: 610558

  2. 当前版本号: 0x20000000

  3. 挖矿难度: 12.95T(前面的31.73T 是当前块的实际难度,只要这个值比12.95T大都是合格的)

  4. 难度位/bits: 0x1715bcd0

  5. 随机数/nonce: 0x10deaef5

  6. 区块时间戳: 2019-12-31 10:29:36

  7. 当前区块哈希值: 

  8. 上一个区块的哈希值

  9. 默克尔数根 /Merkle Root   

这些信息都是在区块头里面,一个区块包括了区块头和区块体,而区块体的所有信息被神奇的哈希函数压缩到了默克尔数根 /Merkle Root 里面了。

整个挖矿过程,都与上面的这些字段密切相关,下面再分别介绍。

1. 哈希函数

每一个区块都有一个唯一的哈希值,比如上图中的6。可以理解为区块的身份证号码,全网唯一值。比特币采用了Sha256加密算法生成哈希值。

比如该区块的哈希值是:

00000000000000000008dedd5caa11b5827f142c08c2277df4241d745b666ea5

它只能是0-9和abcdef这16个值,用计算机术语叫“十六进制”。

比特币在很多的地方都使用了这个哈希函数,它的神奇就在于:它不管你的输入参数是什么,计算后的结果都是一个长度为256位的值,如果用十六进制表示长度就是64。

并且还有2个特征:

1、无法通过结果推导出输入,只是一个单向的过程;

2、结果很随机,只要输入变化一点,结果就相差万里。

2. 难度位| target bits

为了表明当前区块的挖矿难度,在区块头中有一个"难度位",或者"目标阀值",也就是"bits" 来表示,图中的4。它确实是一个阀值,只要你算出来的值比这个值更小都是可以的。

为了减少空间采用了压缩的方式存储,比如bits: 0x1903a30c,它的意思是0x19 为 幂,而 0x03a30c 为系数。

计算难度目标的公式为:

target = 0x03a30c * 2^(0x08 * (0x19 - 0x03))

target = 0x03a30c * 2^(0x08 * 0x16)

转为十进制的话:

target = 238,348 * 2^176

对数学不好的来说,不要紧,只要知道目标值为0x1903a30c最后计算出来的结果是:

0x0000000000000003A30C00000000000000000000000000000000000000000000

也就是说当前难度,新生成的【区块哈希】必须满足前15位为0, 这是区块277316的难度。(来源:精通比特币)

在比特币区块中,你找到任意一个区块的哈希值出来,会发现前面有很多的0,这其实就隐含了挖矿的难度。区块哈希前的0越多,就代表难度越大,因为生成的区块哈希必须小于目标值。

这么打个比方:

有一个箱子,里面放着1-100个号码,让你随机抓出一个号码(挖矿),抓出来号码小于50(目标值)就中奖,说明你有50%的概率。如果这个时候把目标值调为10(挖矿难度调整),说明你有10%的中奖概率,如果再调为1,说明只有1%的概率中奖。

道理相同:比特币通过调整挖矿难度,使区块哈希值越来越小,前面的0越来越多。

3. 挖矿难度: difficulty

前面刚刚介绍完"bits",又来一个挖矿难度?

它的出现完全是为了让人更容易理解,“比特币的挖矿难度又要增加了”,这句话说的就是这个difficulty。

目前是12.95T。T代表了单位。 

 

其实它们本质是一个东西,只是两种不同的表现手法。

 difficulty_1_target = difficulty * target

difficulty_1_target 代表了比特币网络最初的目标值,是一个固定了不变的数:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF。

数学公式表明,挖矿难度difficulty 越高,target值就越小,它们是一个倒数的关系。

4. 随机数/Nonce

挖矿的意思就是要生成一个新的区块,而构建新区块首先就是要生成一个区块头。区块头中的字段如第一张图中所示,大部分字段都是固定好了的。

矿工的工作就是用区块头去生成新区块的哈希值,并使它是满足一个这样的公式来的:

SHA256(区块头)< target

对于版本号,区块高度,难度位,前区块哈希,这些字段都是已经固定的,不能改的。

通过哈希函数原理我们已经知道了,只要有一点变化,结果就会变化很大,所以矿工只需要去穷举其中的这个nonce值就可以了。

而区块头中的每个字段长度都是固定的,nonce字段只有4个字节,也就是nonce值取值范围是0-2^32,并不是无限大的,如果全试过了 依然没有满足目标值,这也是经常发生的,那就生成不了区块啦?

当然不是了。如果你把其中的一笔交易撤出,暂时不打包这笔了,那就需要重新生成Merkle Root,图中的9。(一般不会这么干,少一笔交易就少一点交易费)。

所以,矿工会在区块的第一笔交易,创币交易,也叫Coinbase交易,这笔交易是给自己发矿工奖励的特殊交易,可以在备注里加一些特殊字符,以此达到修改该笔交易的哈希值,最终修改Merkle Root的值,这等于变相的扩展了nonce的取值范围,又没有丢掉交易。

如下图红框里就是这笔coinbase交易当中附加的一些文字,但看上去乱码是由于编码原因,有可能是中文。

比特币挖矿原理探秘二配图(2)

5. 验证区块

找到合格的nonce值虽然非常困难,但要验证nonce值就非常简单了,只需要一次计算就够了。difficult to solve,but essay to verify。

验证一个区块的合法性,包括很多项必要的检查,如:时间戳,是否指向前一区块,难度值是否满足,交易是否合法,区块大小,挖矿奖励等等。

对于非法的区块,就直接丢掉了,但如果合法,会第一时间延长自己的链,并基于这个新的区块开始竞争下一个区块,不然又输在起跑线上了。

6. 难度调整

比特币出块的平均时间是10分钟,至于为什么是10分钟,太短了会使网络的攻击成本大幅降低,这不是本文重点。

每隔2016个区块要进行一次较正,使出块时间维持在10分钟。2016*10分钟=20160分钟,大约2周。

调整方式为:

新的难度值 =  旧的难度值  * 去2016个区块花费的总时间  /  20160)

如果不作难度的调整,随着算力的提高,出块时间会越来越快,或者没有算力而变得特别的慢,对比特币网络都是不能接受的。这种自动调节功能,体现了中本聪的大智慧。

7. 总结

通过这一次的查阅,又明白了二件事:

  1.  难度与目标阀值的关系

  2. nonce取值有是限的,是不够用的,所以会需要调整coinbase交易里的字段来弥补,总之要尝试各种情况找到那个适合的nonce值

参考资料

《精通比特币》,最好的比特币资料。

本文来源:陀螺财经 文章作者:财神下山
收藏
举报
财神下山 个人认证
累计发布内容12篇 累计总热度10万+

陀螺财经现已开放专栏入驻,详情请见入驻指南:https://www.tuoluocaijing.cn/article/detail-27547.html

财神下山专栏:https://www.tuoluocaijing.cn/columns/author153327/

本文网址:https://www.tuoluocaijing.cn/article/detail-180363.html

免责声明:
1、本文版权归原作者所有,仅代表作者本人观点,不代表陀螺财经观点或立场。
2、如发现文章、图片等侵权行为,侵权责任将由作者本人承担。

相关文章

财神下山
个人认证

12篇

文章总数

10万+

总热度

扫描二维码关注

热门文章

rss订阅