概述
- 为何调整挖矿难度
- 如何调整挖矿难度
为何调整挖矿难度
全网的算力可能会增强,可能会减弱,比特币系统会系统的出块时间控制在10分钟左右(中本聪没有说为什么是10分钟)。
中本聪并没有说明为何是10分钟,可能是他/她喜欢。
如果挖矿难度过低
如果挖矿难度太低,则代表出块时间会非常短,看起来是好事,因为我发布一笔交易会很快地被写入到区块中。但是也会出现很大的问题。
- 因为出块时间缩短,所以会出现很多节点几乎在同一个时间发布区块。
- 在出块慢的时候10分钟的时间基本足够将出块信息广播给网络中的绝大多数节点,而在十分钟内基本不会出现大量的区块被广播。而如果出块速度加快,则在某个区块的广播过程中别的节点也很容易算出自己的区块并广播,这就会导致网络中的节点收到的区块不是基本一致的,而是多种多样的。
- 所以很容易造成区块链的分叉,而且可能不是两叉,数量可能会很多。
- 这样全网的算力就被分散到十分多的分叉上了。
- 此时如果攻击者发起一些攻击如 Double Spending Attack,可能就不需要全网51%的算力了,因为全网的算力被分散了,而不是集中在一条最长链上。
如果挖矿难度过高
这个就很容易理解了,出块速度过慢则会导致整个比特币系统十分低效,也会打击矿工的积极性。比如我发布一笔交易可能要等一个月甚至更久才会被确认,这太慢了。
如何调整挖矿难度
比特币系统会在每产生2016个区块后调整难度,下面是调整公式。
中本聪也没有说明为何是每2016个区块才调整难度,可能是他/她喜欢。
难度调整的公式如下
\[ target=target \times \frac{ActualTime}{ExpectTime} \]
调整难度实际上就是调整target值,target 越小则难度越大,反之则难度越小。
同时为了保证挖矿难度不会出现大幅度的波动,一旦$\frac{ActualTime}{ExpectTime} < \frac{1}{4}$,则一律按照等于$\frac{1}{4}$计算,一旦$\frac{ActualTime}{ExpectTime} > 4$,则一律按照等于$4$计算,保证挖矿难度不会有大幅度变动。