难度调整里的差一错误:比特币时间跳跃问题从哪来、社区怎么补 图 1
难度调整里的差一错误:比特币时间跳跃问题从哪来、社区怎么补 · 图 1

规则先摆清楚

比特币大约每 2016 个区块(名义两周)重算一次难度:取本窗口首块与末块的时间戳,用实际经过时间除以目标两周,再缩放难度。同时每条链有两条时间戳护栏:区块时间不得早于前 11 块的中位时间(中位时间过去规则),也不得比当前真实时间超前太多(历史上按两小时量级约束)。护栏的本意是防矿机时钟漂移污染链上时间轴。

差一在哪

关键细节:首块与末块之间只包含 2015 个区块间隔,公式却拿它去对照 2016 块的两周目标。诚实计时下,这带来一个微小但系统性的偏差——难度比纯算力映射略高一点,平均出块节奏和两周整的窗口周期会有分钟级的累积差。这段行为被开发者整理成笔记公开分析过,也常被称作难度公式里的差一问题。偏差本身人畜无害,问题出在它和护栏的化学反应。

反应是什么:时间跳跃

想压低难度,就要让公式”看见”更长的经过时间;想冲高算力红利,又想让实际时间更短。拥有控制窗口边界块能力的矿工可以反复在窗口首块打出被允许的最大超前时间戳,把窗口起点钉在超前两小时的位置,而由于差一的存在,这段水分不会在下一窗口被等量补偿。分析笔记给出的结论很克制:诚实网络里它只是噪声;但对能持续产出窗口边界块的矿工——尤其是高份额或完全合谋者——存在压缩可见经过时间、把难度往下压的通道。在现实主网上,单个矿工长期稳定命中每 2016 块一个的边界块概率微乎其微,因此这始终停留在理论攻击面而非已观察到的事故。

社区怎么补

修正思路不是重写公式,而是再钉一条小护栏:约束每个重定目标窗口首块的时间戳不得低于上一窗口末块时间减去一个出块间隔量级,让”提前钉起点”失效。以共识清理为名的公开提案讨论了这个方向的修复,同时捆绑处理其他若干历史角落。截至本文写作时,它停留在提案与评审阶段,没有走完部署所需的信号与激活流程——把它读成”已生效规则”或”被忽视的致命漏洞”都是失真。

给读者的坐标

共识细节的常态就是这样:一个自 2009 年就在的边角行为,被反复分析多年,风险量化在”现实里几乎不可用、理论上应修”的区间,于是修复按它自己的节奏走公开流程。判断任何”比特币重大漏洞”新闻,先找这三问:已发生还是理论攻击面?需要什么算力份额?修复走到哪一步。

风险提示:本文讨论挖矿共识机制,不构成对挖矿收益的任何预测或建议,不构成投资建议。

为什么护栏不能反过来改公式

直觉方案是让公式真的数满 2016 个间隔,即把窗口首尾块各用邻居锚定。这条路被否掉的原因很朴素:它会立即改变所有历史区块的重算结果口径吗?不会,但对”下一块难度是多少”给出与既有节点不同的答案,等于未走完部署流程就先造成行为分裂。共识修正的通行原则是”只加护栏、不动旧账”:新规则只约束未来块的时间戳取值,旧块继续按原规则被接受,这样旧节点与新节点对历史保持沉默一致,只在增量上对齐。理解这条原则,就能理解为什么一个 2011 年就被公开讨论的问题,修复提案二十多年依然要走完整的信号流程——不是没人会写补丁,而是补丁必须让全世界自愿、无痛、可验证地同时上岗。

阅读相关提案时的三把尺

第一把尺量收益:修复消除了什么攻击面,需要什么资源门槛才摸得到。第二把尺量成本:给诚实网络加了什么限制,会不会误伤时钟不友好的矿场。第三把尺量流程:部署阈值、信号窗口、超时规则怎么定,失败后怎么办。三把尺都清楚,你对任何”共识清理”新闻的判断就会比标题党慢半拍、准很多。