主页 > imtoken钱包苹果手机下载 > 比特币POW难度调整分析

比特币POW难度调整分析

imtoken钱包苹果手机下载 2023-01-18 21:36:45

比特币POW难度调整分析

时间:2022-05-30

本文介绍比特币POW难度调整分析。 主要内容包括其使用实例、应用技巧、基础知识点总结及注意事项。 具有一定的参考价值,需要的朋友可以参考一下。

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

我们在区块中附加一个随机数(Nonce),这个随机数使得给定区块的随机散列值根据需要出现尽可能多的零。 我们通过反复试验找到这个随机数,直到找到为止,因此我们建立了工作量证明机制。 只要 CPU 消耗的工作量能够满足工作量证明机制,那么除非再次完成相当大的工作量,否则区块的信息是无法更改的。 由于此块之后链接了后续块比特币最高值,如果要更改此块中的信息,则需要重做所有后续块的所有工作量。

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

原理很简单,但细节总是需要追根究底的。

比特币难度值难度

难度值并没有记录在区块中,它只是人类为了直观感受解决问题的难度而进化出的一个浮点数。 难度每 2016 个区块变化一次,公式如下:

1个

diffculty = difficulty_1_target / currentTarget

这里的difficulty_1_target是一个常数,一个非常大的数。 表示矿池挖矿的最大难度。 目标值越小,越难出块。 块中存储的是这个名为目标的值。

难度值如何存储在区块中

Target存储在block中,但是Target通过类似浮点数的表示方式进行了压缩,字段为nbits。 例如,如果块位记录为0x1b0404cb,那么十六进制表示的目标值为:

1个

0x0404cb * 2**(8*(0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000

计算时以后3个字节0x0404cb为基数,前1个字节0x1b代表幂次。具体压缩过程如下:比如要压缩数字1000,先转换为256进制数

1个

1000 = 0x03 * 256 + 0xe8 * 1

然后它由两个数字组成:

1个

03 e8

如果第一个数不超过0x7f比特币最高值,可以不填0,但是两位长度小于三位,最后补零,最终表达式为:0x0203e800

等等,我有点晕,我为什么要用这种拐弯抹角的存储方式? 如何调整难度

目标值的计算公式如下,但在实际计算中有一些特殊处理,将目标值控制在一定范围内。

1个

新目标值=当前目标值*2016年实际出块时间/2016年理论出块时间(2周)。

判断是否需要更新目标值(2016的整数倍),如果不需要,继续使用上一个区块的目标值计算前2016个区块的出块时间。 不足半周的,按半周计算。 防止难度增加4倍以上。 如果超过8周,则按8周计算。 防止难度降到 4x 以下。用当前难度乘以花费的时间,然后除以 2 周。 若超过最大难度限制,则按最大难度处理

代码参考在这里:

认识nbits,如何用一点TIPS计算全网算力

1个

0x00000000FFFF0000000000000000000000000000000000000000000000000000

但是,在大多数矿池中,它表示为

1个

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

以这种方式挖矿时,挖矿软件显示的难度和比特币客户端API调用计算的难度略有差异,可以忽略。这其实是早期挖矿时为了方便而导致的不一致造成的pool实现了,因为比特币客户端使用nbits来判断HASH的合法性,所以不影响最终的计算结果

1个

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

为什么?只是中本聪早期的代码比较粗糙。 当他循环时,他仍然有一个天才块要处理。 可能为了代码整洁,他并没有特别处理。 其实影响不大。