区块链/等级 II · 运作机制/2.3 区块与链/课程 5
每2016个区块调整一次难度
让时钟持续走动的两周调速器
材料显示难度历史记录的区块浏览器界面用于计算比值的计算器
好奇
- 为什么网络每两周调整一次难度,而不是在每个区块之后调整?
- 在没有中央权威发布更新的情况下,去中心化系统如何就一项数学修正达成一致?
- 在全球算力大幅下降后的头几天里,出块速度会发生什么变化?
探索
- 比特币的安全模型依赖于大约每十分钟一个区块的稳定节奏。这一节奏在交易最终性与网络拥堵和资源消耗之间取得平衡。然而,挖矿硬件发展迅速,ASIC的效率会随时间呈指数级提升。如果不加干预,计算难度固定不变,随着算力增长,出块时间将从几分钟缩短到几秒。这种剧烈波动会破坏链的安全属性,也会让用户对确认时间的预期变得难以把握。
- 为了维持这一节奏,比特币实现了一个称为“目标值重设”(retargeting)的自动反馈循环。每隔2,016个区块(平均约十四天),每个节点都会独立重新计算工作量证明的目标值。2,016这个数字来自14天乘以每天144个十分钟间隔。这一频率取得了平衡:既足够短,能够响应算力的显著变化;又足够长,能够平滑网络参与度的暂时波动或异常。
- 该计算将挖出前2,016个区块实际耗费的时间与预期的20,160分钟进行比较。公式为:新目标值 = 旧目标值 × (实际时间 / 目标时间)。如果矿工的平均出块时间快于十分钟,实际时间就较短,得到一个小于1的比值,从而降低目标值、提高难度。反之,如果出块耗时更长,目标值就会上升,以降低谜题难度。这种按比例的调整确保平均出块时间回归到十分钟左右。
- 为了防止短期冲击造成剧烈波动,每个周期的调整幅度在任一方向上都以四倍为上限。无论算力变化多大,单次调整最多只能使难度乘以四或除以四。这一上限限制了失真时间戳可能造成的破坏,并在剧烈的市场事件或硬件更替期间让变化保持平缓。
- 一个典型例子发生在2021年7月中国禁止加密货币挖矿之后。全球算力骤降,出块速度明显慢于十分钟一个。随后的难度调整是比特币历史上最大的一次下调,降幅接近28%,以反映计算能力的减少。这次快速修正在一个周期内就让平均出块时间回到目标附近,展示了该机制对现实世界经济与监管冲击的响应能力。
- 在两次调整之间,网络以固定难度运行。如果在这两周的窗口期内算力发生变化,出块时间就会偏离十分钟,直到下一次目标值重设。这种滞后是周期性调整固有的取舍;另一些链则改为每个区块都重设目标值,以牺牲比特币的简洁性和可预测性为代价换取更快的响应。用户和矿工可以通过任意区块浏览器监测这一周期,浏览器会显示距离下次调整的剩余区块数,以及根据当前挖矿速度估算的难度变化百分比。
关键事实
- 难度每2,016个区块调整一次,大约相当于两周。
- 该调整公式通过实际经过的时间与预期时间20,160分钟的比值来对旧目标值进行缩放。
- 为避免难度出现剧烈波动,每个周期内难度变化幅度最多为四倍。
- 原始代码中的差一错误(off-by-one)使计算实际只使用了2,015个间隔,从而产生了一个可忽略不计的、偏向更高难度的偏差。
- 2021年7月的难度调整是比特币历史上最大的一次下调,接近28%。
- 每个节点都会独立进行这一计算,从而在无需中央协调的情况下达成共识。
练习 九、六、三、一
9收集列出区块浏览器历史记录中的9次难度调整,注明每次调整的日期及百分比变化。
6归类将这9个按大小和方向分为6组:大幅上升、中度上升、小幅上升、小幅下降、中度下降、大幅下降。
3提炼将这6组归纳为引发最大幅度调整的3类事件。
1凝结用一句话说明比特币的两周周期如何在去中心化环境中平衡响应速度与稳定性。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。
- Bitcoin Core source code, pow.cpp (CalculateNextWorkRequired)
- A. M. Antonopoulos & D. A. Harding, Mastering Bitcoin, 3rd ed. (2023), ch. 12
- Bitcoin difficulty history, block 689,472 (July 2021)