主页 > 怎么在华为下imtoken > 了解比特币的挖矿难度调整算法

了解比特币的挖矿难度调整算法

怎么在华为下imtoken 2023-03-26 05:21:51

“在比特币的设计中,PoW 共识算法是一个非常令人兴奋的部分。矿工需要花费一定的算力,根据全网当前的挖矿难度来构建合法的区块头,这样才有可能让全网成为可能。接受此区块并将其添加到账本中,然后获得区块奖励。挖矿难度是一个可变参数。节点会根据统一的算法重新计算并设置一个与全网一致的新难度值。在了解难度调整算法之前,需要熟悉区块和账本的生成过程,以及区块头的数据结构。已经熟悉这方面知识的读者可以直接跳到第三部分。”

区块和账本生成过程

1)交易广播:用户签署交易并将交易发送给任意一个或多个网络节点,如果交易正确,节点验证通过后,节点会继续向其他节点广播,最后传递给大部分挖矿节点;

2)出块:矿工节点收到交易后,将交易打包成区块,计算交易对应的默克尔树的根哈希值,通过挖矿操作构造区块头,直到哈希值区块头满足挖矿难度要求。 ;

3)区块广播:任一矿工节点成功挖出区块后比特币难度值,立即将区块广播至全网。与交易广播类似,全网其他节点会验证区块。区块的合法性;

4)账本的接受:如果同一时期只有一个合法区块产生,并且没有其他合法区块与之竞争,则该区块将被计入账本,如果有竞争区块,取决于全网大部分算力的意志,选择继承和扩展哪个区块路径分支,累积难度最大、最长的链最终获胜,不合法的区块记入账本将成为孤儿并被淘汰出局。

“大多数算力的意志所选择的路径”:区块链的矿工可以看作是一支行军与战斗的队伍。在战斗和前进的过程中,这支部队中经常有人。如果落后或误入歧途,如何区分支路和主路?当然,主路是拥有主力军力的主流部队选择的路线。

(图一,累积难度最大最长的链为主链,来自《比特币开发者参考》)

区域块和头数据结构

块头数据只占用80字节的存储空间。由于引入了交易 Merkle Tree Root,区块头可以代表整个区块,可以独立传输和处理。在图 2 和图 3 的简单说明中,并非所有字段都完整给出。真正的区块头数据结构包含6个字段:

版本:4字节,比特币协议的版本,矿工可以在这4个字节中设置空闲比特来投票算力;

Previous Block Hash:32字节,前一个区块头数据的哈希值(双SHA256),通过该字段将每个区块依次链接,形成区块链账本;

交易默克尔根哈希(Merkle Root):32字节,本区块内交易组成的默克尔树根哈希值(Double SHA256);

块生成时间(Time):4字节,使用UNIX epoch时间,必须大于前11个块的时间中值,但不能超过当前时间为2小时;

挖矿难度阈值(nBits,或记为Bits):4字节,目标挖矿难度阈值的简化编码,当前区块的哈希值(Double SHA256)必须小于等于达到这个门槛;

Nonce:4字节,双SHA256对当前区块头数据进行哈希运算,通过多次调整该值达到挖矿难度阈值。

(图 2,块结构,来自“比特币:点对点”电子现金系统”)

(图 3,具有链结构的账本,来自“比特币:点对点电子现金系统”)

出块速度和挖矿难度调整

区块头的哈希值占用32个字节(265位)。块头哈希的取值范围是 0 到 MAX-1,对块头进行双重 SHA256 哈希运算的结果必须在 0 到 MAX 的范围内。在这个范围内取一个阈值 TT(Target_Threshold),并规定区块头的哈希值必须在 0~TT 范围内才合法。因此,挖矿操作就是不断调整区块头中的三个字段:Nonce、Time、Merkle Root,并尽量计算出0~TT范围内的值。哈希函数的哈希值(在TT到MAX范围内无效),得到合法的区块头。

由于哈希函数的设计特点,输出结果基本均匀分布在取值范围内。 ,TT越大,哈希运算结果落在0~TT范围内的概率越高,挖矿难度越低。反之,TT越小,挖矿难度越高。这就好比在射箭中,目标大了容易打中,目标小了就难打了。调整TT的值也调整了挖矿的难度。由于TT需要占用256位,为了缩短块头的总大小,通过简化TT的编码得到块头的Bits字段。

在比特币网络中,挖矿节点随时可能加入或退出,因此整个网络的算力经常发生变化。假设挖矿难度不变,如果全网算力增加,出块速度会变快,平均不到10分钟就可以出块。相反比特币难度值,如果整个网络的计算能力下降,则出块速度会增加。更慢,平均需要 10 多分钟才能产生一个块。为了维持平均 10 分钟产生 1 个区块,挖矿难度(即 Bits 字段的值)必须随着全网算力的变化而动态调整。

之所以采用“每2016个出块做一次难度调整”的算法,而不是每一个出块过程,可能是因为中本聪一开始对比特币的设计,没能预见到矿机的出现,挖矿矿场、矿池,没有预见到大量算力可以在BTC、BCH等使用相同哈希算法的系统之间随意切换,导致全网算力大幅度抖动。毕竟,比特币是前所未有的发明,很难做到完美。人们对区块链技术的探索和完善必然是不断迭代发展的。

假设当前正在生产的区块高度是2016的整数倍(区块高度从0开始计数),那么应该调整TT的值。如果最近 2016 个区块的预期输出时间记为 S(2016*10*60 秒),实际输出时间记为 R,那么 S/R 反映了该区块的实际速度与预期的速度。将 TT 的值调整为 TT*S/R,即根据 S/R 的值放大或缩小哈希值的目标范围,平均出块率将接近预期的每块 10 分钟。

换个角度,先定义一个公式DIFF=MAX/TT,相当于把0~MAX区间划分为DIFF子区间,0~TT是第一个区间,从概率上看,试试DIFF哈希运算,可以打一次0~TT区间,可以认为这个DIFF就是难度值。当 TT 和 MAX 相等时,DIFF 值为 1,即进行 1 次哈希运算即可达到一次命中。但常用的难度值计算方法不是这样的。比特币刚上线的时候,可能是中本聪根据当时的挖矿算力情况给TT设定了一个初始值,记为BMAX:

0x0000000000000000000000000000000000000000000000000000,然后定义公式BDIFF=BMAX/TT,可以得到初始参考难度值BDIFF为1(即最小难度值)。后来在一些矿池中,设置了一个PMAX:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,根据PDIFF=PMAX/TT的公式计算难度值。 BDIFF、PDIFF、DIFF都是用来表示难度的,但是对应的参考最大值(BMAX、PMAX、MAX)不同。 BDIFF比较常用,其直观含义是:与原来的最小难度值1相比,现在难度提高到了BDIFF的倍数。

示例:通过区块浏览器可以查询Block#481,824(2016*239)的头部哈希值为0000000000000000001c8018d9cb3b742ef25114f27563e3fc4a1902167f9893,其头部字段内容为:

>

版本:

0x20000002(以十六进制表示,矿工使用其中一个位投票支持 Segwit)

上一个区块哈希:

0x00000000000000000cbeff0b5338e1189cf09dfbebf57a8ebe349362811b80(以十六显示)

默克尔根:

0x438250cad442b982801ae6994edb8a9ec63c0a0ba117779fbe7ef7f07cad140(以十六回显)

时间:2017年8月24日01:57:37(显示为日期时间)

位:0x18013ce9(显示为十六进制)

Nonce:575,995,682(显示为十进制)

查询上一个区块Block#481,823,可以得到Bits为0x180130e0,而Block#481,824调整挖矿难度,采用新值0x18013ce9。最高字节为18(十进制24)表示TT值的字节长度,013ce9表示TT的最高3字节的值,所以TT的值为0x013ce90000000000000000000000000000000000000000000,前导0填充和extended to 256 bits (32 bytes), then 0x0000000000000000013ce9000000000000000000000000000000000000000000,计算0x00000000FFFF0000000000000000000000000000000000000000000000000000 / 0x0000000000000000013ce9000000000000000000000000000000000000000000,结果(BDIFF)为:888,171,856,257.32,意味着生产B The mining difficulty at lock#481,823 is the lowest difficulty in the初始阶段(888,171,856,257.是1)的32倍,全网算力大幅提升。