协议演进 / BIP/比特币改进提案 / BIP-34
BIP-34
把区块升级为版本 2,并把区块高度写进 coinbase 交易的第一项,让每个区块自带唯一标识,也第一次完整演练了软分叉的升级路径。本 BIP 目前处于已激活状态。
一、档案卡
| 编号 | BIP-34 |
|---|---|
| 标题 | Block v2, Height in Coinbase |
| 作者 | Gavin Andresen <[email protected]> |
| 指定日期 | 2012-07-06 |
| 层级 | Consensus (soft fork)(共识(软分叉)) |
| 类型 | Specification(规范类) |
| 状态 | Deployed(已激活) |
| 阅读版 | https://bips.dev/34 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki |
二、放在哪一族
BIP-34 是共识层软分叉族的早期范本,也是区块与交易“版本号升级”这条线的起点。
往前看,它接续的是 BIP-30(重复交易)所暴露的问题:coinbase 交易可能完全重复,交易 ID 会撞车。往后看,它的两阶段阈值升级办法,成为后来软分叉部署的参照,后来的部署方式还包括 BIP-9(version bits)以及把成熟部署“埋入”代码的 BIP-90(Buried Deployments)。
理解 BIP-34,是理解“比特币怎样在不分裂网络的前提下集体同意改规则”的第一课。
三、它要解决什么
原文给的动机有两条:
3.1 演练并明确升级机制
区块与交易都是带版本号的二进制结构,当时都还是版本 1。BIP-34 要引入一条明确的升级路径:网络如何集体同意,把交易的二进制结构、规则与行为一起往前推一版。这次升级本身不大,重点是把机制走通、留档。
3.2 保证区块与交易的唯一性
如果两个 coinbase 交易内容完全相同,它们的交易 ID 也会相同,后一笔会覆盖前一笔的记录,验证与索引都会出问题。给每个新 coinbase 加一个全网独一无二的值——它所在区块的高度——就能从构造上杜绝重复,并帮助未与网络连接时的离线区块验证。
四、规则本身
4.1 规范四条
- 版本号大于 1 的交易视为非标准交易:官方 Satoshi 客户端不挖也不中继这类交易;
- 把区块高度作为第一项加入 coinbase 交易的 scriptSig,并把区块版本升到 2。高度的格式是“最小编码的序列化 CScript”:第一个字节是数字所占的字节数(原文注:在主网上,接下来约 150 年内都是 0x03,因为区块数小于 2 的 23 次方减 1),其后是该数字的小端表示(含符号位)。高度指该区块在区块链中的高度,创世区块高度为 0;
- 75% 规则:最近 1000 个区块中有 750 个版本不低于 2 时,开始拒绝无效的版本 2 区块(testnet3 为最近 100 个中 51 个);
- 95% 规则(不归点):最近 1000 个区块中有 950 个版本不低于 2 时,拒绝一切版本 1 区块(testnet3 为最近 100 个中 75 个)。
4.2 升级是怎样锁定的
阈值分两段:先有四分之三的算力产出 v2 区块,新规则开始对 v2 区块生效;再到 95%,旧版本区块被全体拒绝,升级不可逆。矿工先用脚投票,规则随后才强制——这是典型的矿工激活软分叉节奏。
4.3 结果(原文记录)
原文在 Result 一节记下了落点:区块号 227,835(时间戳 2013-03-24 15:49:13 GMT)是最后一个版本 1 区块。此后主网区块全部为版本 2 及以上。
4.4 向后兼容
所有旧客户端都与此改动兼容,用户与商家不受影响。矿工被强烈建议升级到版本 2;原文同时写明:当 95% 的矿工升级后,仍不升级的矿工产出的区块会被孤立(orphaned)。
五、谁必须动
普通持币人与商家:不必动。原文明确说用户与商家不受影响,钱包照常收付。
矿工:必须动得最实在——要产出版本 2 区块,并在 coinbase 中按规定格式写入高度。拖着不升级的矿工,在 95% 阈值过后产出的 v1 区块会被网络拒绝。
全节点:升级后的节点负责执行两段阈值规则:到点后拒绝无效的 v2 区块,进而拒绝一切 v1 区块。
共识层:这正是本 BIP 改动的对象。它是一次软分叉:新规则比旧规则更严,旧节点仍能接受新链,只是不能完整执行新增加的校验。
六、现在算不算数,以及一个常见误读
状态在原文 preamble 中为 Deployed,本站中文状态记为“已激活”:规则早已生效并成为链历史的一部分,高度写入 coinbase 是今天每个区块的固定结构。今天在区块浏览器里能直接读到的“区块高度”和 coinbase 里的高度编码,都源于这次升级。
常见误读:
“高度写进 coinbase 只是给区块编个号,图个方便。”
不对。编号只是表面作用。原文动机写得很清楚:一是让每个 coinbase 天然唯一,消除重复交易 ID 的隐患;二是借这次小升级把“网络如何集体同意升级版本结构”这套机制正式演练并固定下来。后来历次软分叉的部署思路,都能在这份文档里看到原型。
七、延伸
- 阅读版:https://bips.dev/34
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki
- 相关:BIP-30 重复交易、BIP-9 version bits、BIP-90 埋入式部署
- 仓库总目录:https://github.com/bitcoin/bips
