18910140161

比特币pow难度调节机制

顺晟科技

2021-06-16 10:46:47

360

阐述了比特币POW的难度调整机制白皮书,重点阐述了几个值得注意的问题

比特币白皮书在工作负载证明部分解释了工作负载证明(PoW)的方式:

我们向该块添加一个随机数(Nonce),这使得给定块的随机哈希值根据需要显示尽可能多的零。我们反复尝试寻找这个随机数,直到找到为止,所以我们构建了一个工作量证明机制。只要CPU消耗的工作负载能够满足工作负载证明机制,除非重新完成相当大的工作负载,否则块的信息是不能改变的。由于后续块链接在此块后面,如果要更改此块中的信息,需要再次完成所有后续块的所有工作负荷。

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

块哈希值的计算结果是一个随机数,没有人可以直接控制计算结果。比如你重复掷出一个六面骰子N次(N趋近无穷大),每次都可以掷出一个6以下(含6)的数,但是如果你想掷出一个3以下的数,那么在得到每个结果的时候,平均要掷两次雪;也就是说,投“3以下”的难度是投“6以下”的两倍,需要的“工作量”是后者的两倍。

如果定义规则“6以下”的难度系数(难易程度)为“1”,那么规则“3以下”的难度系数为“2”,即需要两倍的工作量才能满足规则的要求;“1以下”的难度系数是6,也就是说规则需要6倍的工作量。

在比特币协议中,将一个256位的整数0x 00000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

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

难度值的计算其实就是简单的除法。只是涉及到的整数太大(远远超过内置整数位数),不能直接用普通数学库的除法来计算,需要借助高精度算法库(比如GMP)来完成,比较麻烦。所以比特币wiki给出了一个用泰勒级数变式实现的快速对数算法计算难度值的例子。

在块存储中,block_header中的一个字段对应于难度值,即位。32位整数用于压缩和存储当前的256位目标值。压缩规则很简单。位字段的更高字节是指数(小端字节中的第四个字节),它存储目标值的有效字节数。如果目标值的更高位为1(大于0x80),则需要用0x00进行补充。(例如,难度值1的目标值的有效位为0x00FFFF.被0补后为0x1D字节)。另外3个字节是mentissa,更大目标值被截取3个字节存储。

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

其实可以用一个简单的算法来计算难度值:将尾数部分除,再乘以指数部分带来的差值。(2[指数部分减法的结果* 8]),计算速度比“快速对数法”快得多(但如果超过双精度型允许的位数,就会出现溢出)。

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

问:为什么是2015年?答:因为一开始程序员的代码写错了,改正这个错误会导致分叉,我只能将就了

难度=[prev _ target]*[生成前2015块所用时间]/1209600(按照标准,每10分钟生成一个块,2016块所需的秒数)

因为算法是确定的,所以可以保证所有节点计算的难度值一致,没有发散。区块链同步时,节点或客户端会优先选择累计难度更大的链作为主链,只有高度“假慢链”难以识别,分部伪造的难度值也很高。但只要伪造一个块的难度,后续的所有块都必须以相应的难度重新计算,这往往需要攻击者的计算能力相当于整个网络的真实计算能力。

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

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航