跳过正文

5. 比特币挖矿难度

·57 字·1 分钟
Chuck Chan
作者
Chuck Chan
分享技术、思考与生活

挖矿难度
#

前面提到了挖矿是不断地调整 block header 中的nonce值,使得 hash(block_header) 的值小于等于一个目标值target。可以看出,target越小,挖矿的难度越大,他们之间是反比的关系。 $$ difficulty = \frac{difficulty1(最小挖矿难度)}{target} $$

调整挖矿难度原因
#

在比特币系统中,出块的平均时间保持在10min左右,但随着参加挖矿的人增加及设备性能的提升,系统的总算力会不断地增强,出块的时间会越来越短,挖矿的难度越来越低。实际上,在比特币系统开发过程中,中本聪便考虑到了这个问题,并设计了一个相应的难度调整算法

出块时间太短会带来什么问题?
#

出块时间太短,会导致区块链分叉过多,不利于系统达成共识,会让各个节点处于不一致的状态,且会造成算力分散,大大降低了黑客发动51%攻击的成本。

出块时间10min是最优解吗?
#

不一定,比特币选择 10 分钟作为出块时间,是中本聪在设计时权衡多方面因素的结果,10 分钟的间隔让交易有足够时间在全网传播,同时又降低了上述分叉攻击带来的风险。但是无论如何,这个出块时间都要维持在一个稳定的值。

如何调整挖矿难度
#

比特币中规定每出2016个区块,就要对挖矿难度进行一次调整。比特币中是通过修改target值来实现挖矿难度调整,按照10分钟出一个区块来算,那么大概是14天就要修改一次target值。具体的调整公式如下: $$ \text{new_target} = \text{old_target} *\frac{\text{actual_time}}{\text{expected_time}} $$ 其中actual_time为最近挖出2016个区块实际使用的时间,expected_time为挖出2016个区块理想的时间,即14天。当 actual_time > expected_time 时,target会变大,相对应的挖矿难度就降低。同理,当 actual_time < expected_time 时,target会变小,挖矿难度就会变大,通过这样的方式能够让挖矿难度动态平衡。另外这个 actual_time 是有限制的,其涨幅范围会限制在[0.25,4],这么做主要是为了避免系统中一些异常case导致 actual_time 无限大或者无限小的情况。

挖矿历史数据
#

from: https://bitinfocharts.com/comparison/bitcoin-hashrate.html#alltime

上图是比特币挖矿的总算力,可以看出,比特币挖矿的总算力是一直在提升的。

https://bitinfocharts.com/comparison/difficulty-btc-nmc.html#3m

上图是近半年的挖矿难度,可以看出这个难度曲线呈阶梯状,大概14d左右会上升到一个新的台阶,验证了我们上述的每隔14d会调整到一个新的难度的论述。挖矿难度的增加说明大家对挖矿热情的提升,如果某个加密货币的挖矿难度长时间持续下降,说明这个币就要开始凉凉咯~

from: https://bitinfocharts.com/comparison/bitcoin-confirmationtime.html#3y

上面是比特币最近3年的出块时间,可以看出都是稳定在10m上下,与我们前面说的挖矿难度动态动态平衡想佐证。