主页 > imtoken华为 > 比特币POW难度调整机制

比特币POW难度调整机制

imtoken华为 2023-01-17 12:23:52

比特币POW的难度调整机制在白皮书(Bitcoin: A Peer-to-Peer Electronic Cash System)中有描述。本文重点介绍其中一些值得关注的问题。

比特币白皮书在工作量证明章节中解释了工作量证明 (PoW) 的工作原理:

我们在块中添加一个随机数(Nonce),这样给定块的随机哈希值就可以根据需要包含尽可能多的 0。我们通过反复试验找到这个随机数,直到找到,所以我们建立了一个工作量证明机制。只要 CPU 消耗的工作量能够满足工作量证明机制,区块的信息就不能改变,除非等价的工作量重新完成。由于后续区块是在区块之后链接的,如果想要改变区块中的信息,就需要重新完成所有后续区块的整个工作量。

这个随机数难度值是怎么产生的?

比特币挖矿难度曲线_比特币和莱特币挖矿_比特币挖矿难度调整时间

区块哈希值的计算结果是一个随机数,没有人可以直接控制计算结果。例如,重复N次(N接近无穷大)掷出一个六面骰子,每次掷出一个6个(包括6)个数,但如果要掷一个3个或更少)个数,则取平均值每个结果投掷 2 次;即,掷“3 次或以下(包括 3)”)比掷“6 次或以下(包括 6)”)困难三分之一倍,“工作量”需要加倍。

如果规则“under 6”的难度系数(难度系数)定义为“1”,那么规则“under 3”的难度系数为“2”,表示为了满足要求根据规则,它需要两倍的工作量; “低于1”的难度系数为6,表示该规则需要6倍的工作量。

比特币挖矿难度曲线_比特币挖矿难度调整时间_比特币和莱特币挖矿

在比特币协议中,一个256位整数0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF定义为难度“1”。在当时全网的算力下,大约需要 10 分钟的哈希计算工作才能满足小于等于这个数的规则。 .

如果要保证10分钟的工作时间不变,那么当计算能力增加n倍时,难度值需要增加n倍。 2015年10月比特币挖矿难度调整时间,比特币网络的难度值为608亿。可以估算,全网算力较2009年初增长了608亿倍。

比特币挖矿难度调整时间_比特币挖矿难度曲线_比特币和莱特币挖矿

难度值的计算其实就是一个简单的除法。只是涉及的整数太大(比内置的整数位数多很多),无法直接使用普通数学库的除法进行运算。需要借助高精度算法库(如GMP)来完成,比较麻烦。所以比特币 wiki 给出了一个快速对数算法的例子,在泰勒级数变体的帮助下计算难度值。

block存储时,block_header中有一个字段对应难度值,即bits。使用 32 位整数压缩和存储当前的 256 位目标值。压缩规则很简单,bits域的最高字节是指数(little endian中的第4个字节),里面存放的是对目标值有效的字节数,如果目标值的最高位为1(大于0x80),需要在前面加一个0x00。(比如难度值1的目标值的有效位是0x00FFFF...,加0后还有0x1D字节)。另外3个字节为尾数(mentissa),将目标值截断至3个字节用于存储。

比特币挖矿难度曲线_比特币和莱特币挖矿_比特币挖矿难度调整时间

这样,难度值1对应的目标值以bits格式写入,即0x1D00FFFF。以此类推,当目标值为0x00000000000404CB00000000000000000000000000000000000000000000000时,位的格式为0x1B0404CB。

其实可以用一个简单的算法来计算难度值:除以尾数部分,差值乘以指数部分。 (2^[减去指数部分的结果*8]),比“快速对数法”快很多(但是如果超过double类型的位数会溢出)。

比特币挖矿难度曲线_比特币和莱特币挖矿_比特币挖矿难度调整时间

现有算法中,难度值每2016个区块调整一次,但新的难度值不需要与难度“1”进行比较,而是根据前2015个区块的出块时间计算。

问:为什么是 2015 年?答:因为一开始程序员的代码是错误的,纠正这个错误会导致fork,所以只能做一会

difficulty = [prev_target] * [生成前2015个区块所需的时间] / 1209600(按照标准每10分钟一个区块,2016个区块所需的秒数)

因为算法确定了,分布式计算也可以保证所有节点计算的难度值相同,不会有差异。区块链同步时,节点或客户端会优先选择累计难度最大的链作为主链。只有高度的“锻造慢链”很难被人认出来,分工锻造的难度值也很高。但是,只要一个区块的难度是伪造的,那么后续的所有区块都必须重新计算相应的难度,这往往需要攻击者的算力与当前全网的真实算力相当。

在比特币发展初期,“伪造慢链”攻击应该是难以防范的比特币挖矿难度调整时间,但一旦算力达到一定规模,这种攻击需要巨大的成本和大量的计算时间PoW(不仅是钱,还需要时间),所以一般只需要通过优化算法根据累积难度来识别主链即可。这是PoW付出高昂代价换来算力保护的结果。