挖矿难度
挖矿就是不断尝试block header里面的nonce,使得整个block header 的hash值小于等于给定的目标阈值
H(block header)<= target
target越小,挖矿难度越大,调整挖矿难度就是调整目标空间在整个输出空间中所占的比例,比特币用的hash算法是SHA-256,产生的hash值是256位,输出空间是2256 ,调整目标空间在输出空间的比例通俗说就是hash值前面多少个0,合法的区块要求算出来的hash前面至少70个0,这是一种通俗的说法,不是特别准确,因为目标阈值并不是说前面都是0,从某一位开始后面都是1,严格来说,上面的公式才是对的。
挖矿难度和目标阈值是成反比的
difficulty_1_target表示挖矿难度等于1的时候所对应的目标阈值,挖矿难度最小就是1,这个时候对应的目标阈值是个非常大的数。
为什么要调整挖矿难度?
系统总算力不断增强,挖矿难度保持不变,出块时间就会越来越短。出块时间越来越短会有什么问题,比如说不到1s出一个区块,这个区块在网络上传输可能需要几十s,别的节点在没有收到这个区块时会继续沿着已有的区块链往下继续扩展,如果有两个节点差不多同时都收到这个区块,差不多同时都发布一个区块,这个时候会出现一个分叉。出块时间越来越短,分叉就会越来越频繁,越来越多。分叉过多对于系统达成共识是没有好处的,而且危害了系统的安全性。
比特币协议假设大部分算力是掌握在诚实的矿工手里,系统的总算力越强,安全性就越好,如果恶意节点掌握了51%的算力,那么它就可以做任何事情(51% attack)。假设现在出现个分叉,系统中的总算力就被分散了,节点根据在网络中位置的不同,可能会选择不同的分叉继续扩展,而有恶意的节点可以集中算力就扩展它的分叉,也就是上图的A→A,这样可以很快使得这条分叉成为最长合法链,因为好人的算力被分散了,这个时候可能都不需要51%的算力,10%的算力可能就够了,所以出块时间不是越短越好。那比特币协议设计的10分钟是不是就是最优的呢,这不一定,比如说8分钟,5分钟行不行,应该也行,这个只是说出块时间要有一个合适的波动范围。有人觉得比特币的10分钟出块间隔太长了,对于一个支付系统来说,支付要等这么长时间才能得到确认,这个有点太长了。以太坊的出块时间就降低到了15s(同样需要加大难度保持出块时间稳定),出块时间大幅下降后,以太坊就要设计一个新的控制协议,叫ghost。在这个协议当中,这些分叉产生的叫orphan block,不能简单丢弃,而是要给它一些奖励,这叫做uncle reward。
如何调整挖矿难度
比特币协议中规定每隔2016个区块,要重新调整一下目标阈值,这个大概是每两个星期调整一下,调整按照以下公式:
expected time 就是两个星期,actual time 是系统中最近产生2016个区块实际花费的时间。实际代码中target限制不会一次增大4倍以上,也不会一次减小到1/4以下。
那怎么让所有的矿工同时调整难度呢?
计算target的代码是写在比特币系统的代码里,每挖到2016个会自动进行调整,但是比特币代码是开源的,如果有恶意的节点就是不改target怎么办?因为block header里面有target的编码域(nBits),而没有target域,因为target有256位,直接存要32个字节,nBits只要4个字节,可以认为nBits是target的压缩编码,如果有恶意的节点不改target,检查区块的合法性就通不过,因为每个节点都要独立验证发布的区块的合法性,检查的内容包括nBits域设置的对不对。以太坊也要定期调整挖矿难度,但它不是隔几个区块进行调整,而是每个新出的区块都有可能进行调整,而且调整的方法也比比特币的复杂得多。
来源:CSDN
作者:weixin_43888039
链接:https://blog.csdn.net/weixin_43888039/article/details/103859310