6.BTC-挖矿难度

难度调整这个过程是完全自动的,被硬编码在比特币协议中,由网络中的每一个全节点独立计算和强制执行。

  • 调整周期每挖出 2016 个区块,网络就会进行一次难度调整。
  • 目标时间:协议设定的目标是,挖出2016个区块应该花费的时间是: 2016 个区块 * 10 分钟/区块 = 20160 分钟 (也就是整整两周
  • 调整逻辑:在每个调整点(比如第2016、4032、6048...个区块高度),所有节点都会执行以下计算:
    1. 回顾并计算挖完过去这2016个区块,实际花费了多少时间Actual_Time)。
    2. 将这个实际时间目标时间(20160分钟)进行比较。
    3. 如果 Actual_Time < 20160 分钟:这说明过去的周期里,全网的平均算力增强了,导致出块速度快于10分钟。为了让出块速度慢下来,就必须增加挖矿难度。
    4. 如果 Actual_Time > 20160 分钟:这说明过去的周期里,全网的平均算力减弱了(比如有矿工关机),导致出块速度慢于10分钟。为了让出块速度快起来,就必须降低挖矿难度。

难度调整的计算公式

这个调整过程可以用一个非常简单的公式来表示:

新难度 = 旧难度 × (目标时间 / 实际时间)

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%

一个重要的限制:为了防止难度发生过于剧烈的、颠覆性的变化,协议规定每次调整的幅度不能超过4倍。也就是说,新难度最多只能是旧难度的4倍1/4倍

难度与“目标值”的关系

在技术层面,协议调整的不是“难度”这个数字,而是目标值”(Target)**。

  • 目标值是一个256位的数字,区块头的哈希值必须小于这个目标值才算有效。
  • 目标值越低,挖矿就越难,因为符合条件的哈希结果就越少。
  • 难度只是一个方便人类理解的、与目标值成反比的相对概念。

难度 ≈ 初始最高目标值 / 当前目标值

所以,当协议计算出需要提高难度时,它实际上是在降低目标值;当需要降低难度时,它会提高目标值