说说比特币的 “全网难度”

  最近被好多朋友问到,怎么理解比特币的“全网难度”,大家都在纠结这个东西是什么、有什么意义,以及它是如何调整的。这篇文章会试着把这几个问题讲明白。

  区块头中的Bits字段,标识了当前区块头Hash之后要小于等于的目标值(target)。注意,区块头SHA256的结果,有256位,而Bits,只有32位(4字节)。Bits通过如下运算,得到target。以区块277316为例

  Bits值为0x1903a30c(十进制为419668748),这个值被存为系数/指数格式,前2位十六进制数字为幂,接下来得6位为系数。在这个区块里,0x19为幂(exponent ),而0x03a30c为系数(coefficient),计算公式为

  从中本聪的创世区块中可以看到,Bits为0x1d00ffff(十进制为486604799)时,难度(difficulty)为1(注意,区块头中并没有存储difficulty的字段)

  SHA256运算的结果被认为是一致的随机序列,可以说,SHA256的结果中的某一位的值,为0或为1的概率相同。所以做一次计算,满足上述条件(前32位的值均为0)的概率为1 / (2^32),也就是平均要做2^32次运算,才能找到这个值

  当前比特币全网难度 1.93 T,全网算力 15.32 EH/s(1秒计算15.32E 次Hash),算出来的出块时间约为

  如前所述,区块头目标Hash值(target)决定了难度(difficulty),进而影响比特币的出块时间。根据设计,比特币要保证平均每10分钟的区块生成速度,这是比特币新币发行和交易完成的基础,需要在长期内保持相对稳定。

  挖矿设备不断更新、淘汰,矿工不断加入、流失,导致全网算力保持实时变化,但整体来看在不断提高。为了保证比特币的平均出块时间稳定在十分钟,需要定期调整难度。

  难度调整逻辑被写在代码中,在每个全节点中独立自动发生。每产生2016个区块,网络中的所有全节点都会调整难度。难度的调整公式是由产生最新2016个区块的花费时长与20160分钟(两周,即这些区块以10分钟一个的速率产生所期望花费的时长)比较得出的。难度是根据实际时长与期望时长的比值进行相应调整的(或变难或变易),简单来说,如果网络发现区块产生速率比10分钟要快时会增加难度。如果发现比10分钟慢时则降低难度。

  从代码能看到,为了防止难度变的太快,每个周期在调整的时候,如果需要调整的幅度超过4倍,也只会按4倍(难度调成原来的4倍或1/4)调整

  请再次注意,难度的调整,是通过调整区块头中的Bits字段来实现的,区块头中并没有直接存储全网难度(difficulty)的字段

  到这里,相信你已经知道文章开头问题的答案。简单的说,比特币的全网难度(difficulty)

分享: