协议演进 / 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 首创的回看测试为例):

这套机制有两个问题。一是效率与复杂度:验证每个区块都要回看它之前的 1000 个区块来判断触发条件是否满足。二是技术债:这类部署方式已被 BIP-9 取代,继续在共识代码里保留整套信号统计逻辑,只会增加维护与审计成本。

而现实前提已经成立:到 2016 年 11 月,三项规则全部早已生效,其中最晚的 BIP-65(2015 年 12 月生效)其上也已累积了近 50,000 个区块。触发高度在主网链上已是既成事实,完全可以“缓存”下来。

四、规则本身

4.1 写死的激活高度

原文规定主网上的激活高度直接取各项部署当年 95% 规则触发的高度:

4.2 校验逻辑的替换

此后验证区块时,不再执行 1000 区块回看测试,改为两类简单的高度比较:

原文给出了参考代码片段,实际实现见其引用的 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 个区块数信号”换成“高度到了没有”。对主网历史与现状而言,两套判定给出的答案完全一致。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。