协议演进 / BIP/比特币改进提案 / BIP-34

BIP-34 区块 v2:coinbase 中加入高度

把区块升级为版本 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. 版本号大于 1 的交易视为非标准交易:官方 Satoshi 客户端不挖也不中继这类交易;
  2. 把区块高度作为第一项加入 coinbase 交易的 scriptSig,并把区块版本升到 2。高度的格式是“最小编码的序列化 CScript”:第一个字节是数字所占的字节数(原文注:在主网上,接下来约 150 年内都是 0x03,因为区块数小于 2 的 23 次方减 1),其后是该数字的小端表示(含符号位)。高度指该区块在区块链中的高度,创世区块高度为 0;
  3. 75% 规则:最近 1000 个区块中有 750 个版本不低于 2 时,开始拒绝无效的版本 2 区块(testnet3 为最近 100 个中 51 个);
  4. 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 的隐患;二是借这次小升级把“网络如何集体同意升级版本结构”这套机制正式演练并固定下来。后来历次软分叉的部署思路,都能在这份文档里看到原型。

七、延伸

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