区块链学习笔记6——比特币的挖矿难度调整

六、比特币的挖矿难度调整

H(block header)<=target

target越小,挖矿难度越大,调整挖矿难度,就是调整挖矿空间在整个输出空间中所占的比例,比特币中用的哈希算法是SHA-256,这个产生的哈希值是256位,所以整个输出空间是2的256次方。调整比例通俗地来说就是,哈希值前面有多少个零,假如是256位的哈希值,要是合法的区块,前面至少有70个零,这只是通俗的说法。严格的话,还是按照定义去看这个问题。

挖矿难度跟目标域值成反比

区块链学习笔记6——比特币的挖矿难度调整_第1张图片

difficulty_1_target:是指挖矿难度等于1的时候所对应的目标域值

挖矿难度最小就是1,对应的目标域值是个非常大的数,对于H(block header)<=target就是target越大,挖矿是越容易的,因为目标空间占的比例非常大。用这个很大的数除以当前的目标域值得到的就是当前的挖矿难度。

调整挖矿难度的原因

如果不调整挖矿难度,会有什么问题

系统里的总算力越来越强,挖矿难度保持不变的话,出块时间是越来越短的,一开始没有多少人参与比特币游戏,可能按照设计是十分钟出一个区块,后来参与的人多了,变成一分钟就能出一个区块,再到后来挖矿的人越来越多,用的设备越来越先进,可能只要十秒钟就出一个区块,甚至到最后不到一秒就出一个区块,出块时间会越来越短。

出块时间越来越短会有什么问题吗?

比如说,不到一秒钟就出一个区块,在网络上传播的时间可能需要几十秒,才能被其他节点收到,那么别的节点在没有收到这个区块之前呢,还是继续沿着已有的区块链往下扩展。如果有两个节点,差不多同时都发布了一个区块,这个时候会出现分叉。

就是两个节点同时挖到矿,这两个区块被同时发布出来,就出现了一个二分叉

区块链学习笔记6——比特币的挖矿难度调整_第2张图片

那么如果出块时间越来越短的话,这种分叉会成为常态,而且就不仅仅是二分叉,可能出现很多的分叉,比如说,如果有十个区块差不多同时都被挖出来了,那么这个系统中会出现一个十分叉

区块链学习笔记6——比特币的挖矿难度调整_第3张图片

分叉如果过多的话,对于系统达成共识,是没有好处的,而且也危害了系统的安全性,比特币协议是假设大部分算力掌握在诚实的节点手里,系统中的总算力越强,安全性就越好,因为要发动51%的攻击所需要的算力就越大,这个叫做51% attack,意思就是有恶意的节点掌握系统当中51%以上的算力,这时候就可以干各种坏事,包括分叉攻击,比如说在第三个区块中有一笔交易A->B一大笔比特币,转了很多钱,假设后面跟着六个确认区块,就经过六个确认之后,B就认为这个转账交易已经成功了,这个时候,A从接着第二个区块开始分叉,回滚这个交易,把钱转给他自己,正常情况下,这个攻击的难度是比较大的,如果大部分算力是掌握在诚实的矿工手里,想要回滚的这个链比上一个链长,是有一定难度的,但是如果出现了很多个分叉,那么这个时候,系统当中的总算力就被分散了,假设出现了十个分叉,那么节点根据在网络中位置的不同,可能会选择沿着其中某个分叉继续扩展

区块链学习笔记6——比特币的挖矿难度调整_第4张图片

而这个有恶意的节点,可以集中算力就扩展他这个分叉,这样很快就会使这个分叉变成最长合法链,因为好人的算力被分散了,所以这个时候可能就不需要51%的算力才能发动攻击,可能百分之十几的算力就够了

区块链学习笔记6——比特币的挖矿难度调整_第5张图片

所以出块时间不是越短越好,当然了,出块时间不是越短越好,是不是说,比特币协议中设计的十分钟的出块间隔就是最优的呢,这个不一定,比如,如果把他改成八分钟,五分钟行不行,应该都是可以的,这个只是说出块时间要有一个常熟的波动范围,不能无限的减小下去,有的人觉得比特币中的十分钟出块间隔有点太长了,对于一个支付系统来说,做一个支付,要等那么长的时间才能得到确认,这个时间间隔太长了,后面会讲到以太坊,以太坊里的出块时间就降低到了十五秒,所以以太坊的出快速度是比特币的40倍,这个出块时间大幅度下降之后,以太坊就要设计一个新的共识协议叫ghost,在这个协议当中,这些分叉产生的叫orphan block,这些orphan block不能简单的丢弃掉,而是你要给它一些奖励,这个叫做uncle reward。

以太坊中同样也需要调整挖矿难度,保持出块稳定,他降到十五秒后,这个十五秒也要保持不变,这个出块时间到底设置成多长,这个没有一定之规,但是不论设置成多长,都要保持稳定,不能无限制的减小下去。

怎么调整挖矿难度

比特币协议中规定的是,每隔2016个区块,要重新调一下目标域值

,大概是每两个星期调整一下
区块链学习笔记6——比特币的挖矿难度调整_第6张图片

具体是怎么调整呢

是有一个公式的

区块链学习笔记6——比特币的挖矿难度调整_第7张图片

这里的expected time 就是2016 x 10(就是两个星期),理想情况下,每十分钟产生一个区块,产生2016个区块就要这么多的时间,这是他预期的时间。

actual time 是最近系统中产生2016个区块实际花费的时间。

这个公式的意思是,如果实际时间超过了两星期,说明平均下来出块间隔超过了十分钟,这个时候应该把挖矿难度调低一点,让出块更容易,这个时候,actual time /expected time 是大于1的,乘完之后,target会变大,挖矿难度就降下来了。如果实际时间是小于两星期的,说明出块速度太快了,这个时候应该提高挖矿难度,actual time /expected time 就会小于1的,和target相乘之后,target就变小了,挖矿难度就变大了。

实际代码当中,上调和下调都是有4倍的限制的,比如这个实际时间非常长超过了八个星期,算的时候也只按照八个星期来算,这个时候,目标域值最大也是增大4倍,不会一次性超过4倍,这个是避免系统中产生意外情况,导致这个目标域值特别大的作用,相反这个实际时间非常短,不到半个星期,这个时候,也按照半个星期来算,最多也是减小4倍。

怎么让所有的矿工同时调整目标域值呢,因为是去中心化的系统,怎么才能让大家听话,都调呢,如果你不调的话,你发布的区块,诚实的矿工是不会认的,nBits是target的编码的版本,就是在block header里,没有直接存储target,因为这个target是256位的,直接存的话要32个字节,而nBits只有四个字节,可以认为是他的压缩编码,如果遇到有恶意的矿工,该调的时候,他不调,那么这个时候检查这个区块的合法性就通不过,因为每个节点要发布区块的合法性,检查的就包括这个nBits目标域值设的对不对,如果投机取巧,设一个过大的目标域值,使得你自己挖矿很容易,但是别人算出来,你这个设的不对,这个区块是不会被接收的。

区块链学习笔记6——比特币的挖矿难度调整_第8张图片

这张图显示了比特币系统中总算力的系统情况,在比特币没有流行起来之前,有很长一段时间,算力没有得到增长,前面这几年,看上去都是贴着x轴,其中也有增长,只不过是后面这几年算力增长太快了,所以前面这部分看上去像是一条直线

区块链学习笔记6——比特币的挖矿难度调整_第9张图片

后面这几年几乎成指数级的增长,可以看出,算力也不是单调递增的,中间也有很多波动,但总的来说是增长得非常快的

区块链学习笔记6——比特币的挖矿难度调整_第10张图片

这是挖矿难度的变化情况,跟算力增长基本上是同步,这也符合难度调整的设立目标,通过调整挖矿难度使得出块时间保持稳定

区块链学习笔记6——比特币的挖矿难度调整_第11张图片

这是最近的难度调整曲线,可以看出很明显是一段一段的,每隔两个星期,难度上一个台阶,说明挖矿的人越来越多,用的设备越来越先进,反映出大家对比特币的热情越来越高,如果出现相反的情况,比如加密货币的挖矿难度越调越小,说明挖矿变得越来越容易,说明大家对币的热情是逐渐减少的,如果持续出现这种情况,这个币就慢慢不行了

区块链学习笔记6——比特币的挖矿难度调整_第12张图片

这个图显示的每天的出块时间,2011~2018,可以看到总的出块时间在十分钟上下振动,说明难度调整达到了预期目的

区块链学习笔记6——比特币的挖矿难度调整_第13张图片

这是2018上半年的出块时间,也是按天做的平均,也是维持在十分钟左右

你可能感兴趣的:(区块链,区块链,比特币)