难度调整这个过程是完全自动的,被硬编码在比特币协议中,由网络中的每一个全节点独立计算和强制执行。
- 调整周期:每挖出 2016 个区块,网络就会进行一次难度调整。
- 目标时间:协议设定的目标是,挖出2016个区块应该花费的时间是:
2016 个区块 * 10 分钟/区块 = 20160 分钟
(也就是整整两周) - 调整逻辑:在每个调整点(比如第2016、4032、6048...个区块高度),所有节点都会执行以下计算:
- 回顾并计算挖完过去这2016个区块,实际花费了多少时间(
Actual_Time
)。 - 将这个实际时间与目标时间(20160分钟)进行比较。
- 如果
Actual_Time < 20160 分钟
:这说明过去的周期里,全网的平均算力增强了,导致出块速度快于10分钟。为了让出块速度慢下来,就必须增加挖矿难度。 - 如果
Actual_Time > 20160 分钟
:这说明过去的周期里,全网的平均算力减弱了(比如有矿工关机),导致出块速度慢于10分钟。为了让出块速度快起来,就必须降低挖矿难度。
- 回顾并计算挖完过去这2016个区块,实际花费了多少时间(
难度调整的计算公式
这个调整过程可以用一个非常简单的公式来表示:
新难度 = 旧难度 × (目标时间 / 实际时间)
New_Difficulty = Old_Difficulty * (20160 minutes / Actual_Time_for_last_2016_blocks)
- 举例:
- 假设过去2016个区块只用了10天就挖完了(
10天 = 14400分钟
),这说明算力太强了。那么新难度就会被调高:新难度 = 旧难度 * (20160 / 14400) ≈ 旧难度 * 1.4
,即难度提高40%。 - 假设过去2016个区块花了20天才挖完(
20天 = 28800分钟
),这说明算力下降了。那么新难度就会被调低:新难度 = 旧难度 * (20160 / 28800) ≈ 旧难度 * 0.7
,即难度降低30%。
- 假设过去2016个区块只用了10天就挖完了(
一个重要的限制:为了防止难度发生过于剧烈的、颠覆性的变化,协议规定每次调整的幅度不能超过4倍。也就是说,新难度最多只能是旧难度的4倍或1/4倍。
难度与“目标值”的关系
在技术层面,协议调整的不是“难度”这个数字,而是目标值”(Target)**。
- 目标值是一个256位的数字,区块头的哈希值必须小于这个目标值才算有效。
- 目标值越低,挖矿就越难,因为符合条件的哈希结果就越少。
- 难度只是一个方便人类理解的、与目标值成反比的相对概念。
难度 ≈ 初始最高目标值 / 当前目标值
所以,当协议计算出需要提高难度时,它实际上是在降低目标值;当需要降低难度时,它会提高目标值。