协议演进 / BIP/比特币改进提案 / BIP-90
BIP-90
把 BIP-34、65、66 当年靠矿工版本信号触发的激活逻辑,替换成写死的激活高度,删掉每次验块都要回看 1000 个区块的旧代码。本 BIP 目前处于已部署状态。
一、档案卡
| 编号 | BIP-90 |
|---|---|
| 标题 | Buried Deployments |
| 作者 | Suhas Daftuar <[email protected]> |
| 指定日期 | 2016-11-08 |
| 类型 | Informational(信息类) |
| 状态 | Deployed(已部署) |
| 阅读版 | https://bips.dev/90 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0090.mediawiki |
注:本 BIP 的文件头没有 Layer 字段;其内容是共识校验代码的简化,故本站将其归入共识层。
二、放在哪一族
软分叉部署机制族里的一篇“事后清理”文档,涉及的都是已成历史的部署:
BIP-34:区块 v2、coinbase 中写入高度
BIP-65:OP_CHECKLOCKTIMEVERIFY
BIP-66:严格 DER 签名
这三者当年都用区块版本号的矿工信号激活。BIP-9(version bits)出现后,旧的信号机制已被淘汰。BIP-90 不提出任何新规则,只做一件事:既然这三项规则在主网上早已越过激活点,就把“是否已激活”从动态计算改成与固定高度比较,旧的触发逻辑随之从代码里删除。它与后来处理 SegWit 激活的 BIP-91、BIP-148 方向相反——那两篇是想办法把未激活的规则推过线,本篇是把已激活规则的部署脚手架拆掉。
三、它要解决什么
旧机制的运作方式(以 BIP-34 首创的回看测试为例):
- 75% 规则:前 1000 个区块中有 750 个版本号达到 N+1 或更高时,版本号达标的区块必须正确执行新规则;
- 95% 规则:前 1000 个区块中有 950 个达标时,版本号低于 N+1 的区块直接判为无效。
这套机制有两个问题。一是效率与复杂度:验证每个区块都要回看它之前的 1000 个区块来判断触发条件是否满足。二是技术债:这类部署方式已被 BIP-9 取代,继续在共识代码里保留整套信号统计逻辑,只会增加维护与审计成本。
而现实前提已经成立:到 2016 年 11 月,三项规则全部早已生效,其中最晚的 BIP-65(2015 年 12 月生效)其上也已累积了近 50,000 个区块。触发高度在主网链上已是既成事实,完全可以“缓存”下来。
四、规则本身
4.1 写死的激活高度
原文规定主网上的激活高度直接取各项部署当年 95% 规则触发的高度:
- BIP-34:227931
- BIP-66:363725
- BIP-65:388381
4.2 校验逻辑的替换
此后验证区块时,不再执行 1000 区块回看测试,改为两类简单的高度比较:
- 版本下限检查:区块高度达到 BIP34Height 后,版本号低于 2 的区块无效;达到 BIP66Height 后,版本号低于 3 的无效;达到 BIP65Height 后,版本号低于 4 的无效(原文给出对应的拒绝代码,错误名为 bad-version);
- 规则执行检查:高度达到 BIP34Height 起,强制校验 coinbase 开头写入的序列化区块高度;达到 BIP66Height 起,置位 SCRIPT_VERIFY_DERSIG(严格 DER 签名);达到 BIP65Height 起,置位 SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY。
原文给出了参考代码片段,实际实现见其引用的 Bitcoin Core PR #8391。
4.3 理论上的不兼容,与为何可以接受
原文明言:这在技术上可能构成不向后兼容的改动。设想一条分叉链,其 BIP-34 的 95% 触发高度 H’ 低于主网的 H,则在 H’ 与 H 之间,旧软件会判版本号 1 的区块无效、新软件不会;又如从主网 H-1 分叉出的版本 2 区块若漏写 coinbase 高度,旧软件判无效、新软件则接受。
但这种分歧只有在发生极深重组、把激活区块都重组掉时才会演变成共识分裂;而真到那一步,比特币的安全假设本身已出大问题,其严重程度远超本改动的影响。因此原文结论是:理论风险存在,现实中极不可能,简化收益值得。
五、谁必须动
普通持币人:无感知。交易格式、地址、钱包都不受影响。
钱包开发者:无须改动。
全节点与矿工:只有维护完整节点实现的人需要动——按本 BIP 简化共识校验代码,删去回看统计逻辑。这属于实现内部重构,不改变主网区块的有效性结论。
共识层:规则的“内容”不变(三项规则照旧执行),变的只是“何时开始执行”的判定方式:由信号统计改为高度比较。
六、现在算不算数,以及一个常见误读
状态为 Deployed,表示这一简化已被实际部署进节点实现。它是 Informational(信息类):记录一项共识代码整理的做法与理由,本身不引入新的共识规则。
常见误读:“BIP-90 是一次新的软分叉,又改了三项共识规则。”
不对。它没有给 BIP-34、65、66 增加或删减任何规则,只是把这三项规则的生效判定从“回看 1000 个区块数信号”换成“高度到了没有”。对主网历史与现状而言,两套判定给出的答案完全一致。
