作者:Zarten

本文首发于区块链技术详解知乎专栏,题目:比特币工作量证明难度值及难度调整详解

【作者按】在比特币系统中工作量证明是有一定难度的,难度保持在整个系统中平均10分钟才能增加一个区块,那是如何维持这样的一个水平的呢?是通过区块头中的一个难度目标值(target)来决定的。

下面讲解比特币系统中的这个难度值和如何调整难度值。

难度值

在每个区块头中都有一个“Bits”字段,被称为“目标位”,也就是所谓的难度值。如下所示:

新人科普丨什么是比特币的“挖矿难度”?

我们知道,在比特币系统中满足下面公式即为挖矿成功:

H(block header) <= target

那么这个target是通过Bits得来的。

难度目标值(target)计算公式

target以指数形式存在,以十六进制表示,总共有8位,前2位为指数,后6位为系数。

所以上图中,指数为0x17,系数为0x1320bc

计算公式为:

难度值(target) = 系数 * 2^(8 * (指数 - 3))

因此上图中的难度值为:

难度值(target) = 0x1320bc * 2^(8 * (0x17 - 3))

这个算出来是个很大的数,结果为:

十进制为:1832085838499075985755083973639154607251969422303166464

十六进制为:0x1320bc0000000000000000000000000000000000000000

在比特币系统中,难度值越小,挖矿难度就越大,因为哈希值可落的范围会越小;反之难度值越大,挖矿难度就越小。

难度值调整

比特币系统中,难度值是系统动态调整的,目的是使整个系统平均10分钟出一个块。

为什么调整难度值

随着挖矿设备的进化升级,系统的总算力会越来越强,如果难度值保持不变的话,出块时间会越来越短,一方面是提高了对系统的响应时间和效率的考验,另一个方面是出块时间缩短后在同一时间将会产生多个区块,必然会导致区块链形成多分叉,这样就导致系统的总算力分散到各个分叉链中了,这时系统的安全性大幅度降低,黑客可以集中算力进行分叉攻击等攻击行为。

因此,比特币系统需要调整难度值。

难度值调整规则

目标是:系统平均每10分钟产生一个区块。

调整的周期是:每2016个区块产生后会调整一次(大约2周14天)

调整的计算公式是:

新难度值 = 旧难度值 * (最近2016个区块的真正时间 / 最近2016个区块的预期时间)

最近2016个区块的预期时间,当然是:2016 * 10min。

从上面公式可以得出,最近2016个区块的真正时间越小,说明系统中出块时间更短了(算力更强了),新难度值也就越小,所以挖矿难度就动态的提升了。

但是为了防止难度变化的过快,调整的时候有个4倍的幅度限制,也就是若调整的幅度大于4倍了,就按4倍调整。