协议演进 / BIP/比特币改进提案 / BIP-53
BIP-53
提议把不计见证数据时恰好序列化为 64 字节的交易定为无效,以堵住区块 Merkle 树可被混淆利用的弱点,包括区块可锻性与针对 SPV 客户端的攻击。本 BIP 目前处于草案状态。
一、档案卡
| 编号 | BIP-53 |
|---|---|
| 标题 | Disallow 64-byte transactions |
| 作者 | Chris Stewart <[email protected]> |
| 指定日期 | 2025-04-11 |
| 层级 | Consensus (soft fork)(共识(软分叉)) |
| 类型 | Specification(规范类) |
| 状态 | Draft(草案) |
| 阅读版 | https://bips.dev/53 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0053.mediawiki |
二、放在哪一族
共识清理(consensus cleanup)一族:专修区块 Merkle 树构造的历史弱点。它与 BIP-54(Consensus Cleanup)关系最紧——BIP-54 把“64 字节交易无效”作为其打包修复中的一项;BIP-53 则是把这一项单独抽出来,完整论证其理由与利用方式的一份文档。
它还牵涉:
- BIP-37:部分 Merkle 树格式,SPV 客户端据此验证交易是否在区块中;
- BIP-30/BIP-34:原文在讨论有效 64 字节交易攻击成本时引用;
- BIP-66:原文用它说明隔离见证之前的 64 字节交易不可能花费受数字签名保护的 UTXO;
- BIP-141:原文引用其关于未确认交易依赖链可锻性的说明。
三、它要解决什么
区块头里包含对本区块交易集合的承诺:把各交易的 txid(交易的双重 SHA256)建成 Merkle 树,树根放进区块头。轻客户端凭一条 Merkle 路径就能被证明“某交易在某区块中”。
原文指出,这种 Merkle 树构造有若干安全弱点,其中与 64 字节直接相关的有两类:
3.1 区块可锻性
一个 64 字节交易的序列化,恰好等于 Merkle 树中两个哈希的拼接(32 字节 + 32 字节)。恶意节点可以构造一笔 64 字节交易,使其序列化等于某个区块里 Txid₀‖Txid₁ 的拼接,再把含这笔恶意交易的“区块”转发出去:
- 若这笔 64 字节交易按共识规则无效:收到它的节点会把整个区块标记为无效,而其他节点收到的是含原始两笔交易的真区块——先收到假区块的节点将无法与同伴达成共识。原文估算,找到这样的碰撞约需 2²² 量级的工作量。
- 若这笔 64 字节交易按共识规则有效:构造它约需 2²²⁴ 量级的工作量,计算与资金上都昂贵,但理论上可能,并可导致网络持续分裂。
原文注记:无效交易这一路攻击向量曾在 Bitcoin Core 0.6.2 修复(CVE-2012-2459),在 0.13.x 被重新引入,又在 0.14 再次修补。
3.2 对 SPV 客户端的攻击
BIP-37 的部分 Merkle 树格式不承诺 Merkle 树的高度。设一笔有效的 64 字节交易 T 在某区块中,其后 32 字节(约束比前 32 字节宽松)被构造成与另一笔伪造的无效交易 F 的哈希碰撞,攻击者就能让 SPV 客户端误以为 F 被收进了区块;原文估算这约需 2⁸¹ 量级的工作量(外加构造其资金来源交易的约 2⁴⁰ 工作量)。
原文还交代了现状缓解:自 2018 年起,Bitcoin Core 的中继策略与 RPC 接口已经限制过小交易(先是小于 82 字节不中继,后把标准交易最小尺寸下限从 82 字节降到 65 字节)——但那是策略层,不是共识层。
四、规则本身
4.1 规则只有一条
原文的规范部分只有一句话:禁止不计见证数据时序列化长度恰好为 64 字节的比特币交易。即把这类交易从“非标准、不中继”提升为“共识无效”。
4.2 为什么替代方案不够
针对 SPV 攻击,一种缓解法是让 SPV 客户端同时索取 coinbase 交易与待证明交易,借此推知 Merkle 树的深度。原文的评价是:这会让 SPV 证明体积增大约 70%,且在攻击者愿意付出 2²²⁴ 量级工作量时理论上仍可构造同深度的有效 coinbase。因此本 BIP 选择从源头上让 64 字节交易无效,降低 SPV 钱包的实现复杂度。
4.3 向后兼容与已知影响
原文的核查结论包括:
- 截至原文写作时,链上共出现过 5 笔 64 字节交易,最后一笔在区块高度 419,606;
- 隔离见证之前的 64 字节交易无法花费受数字签名保护的 UTXO:BIP-66 激活后签名不可能小于 9 字节,而这类交易的 scriptSig 至多 4 字节;
- 链上有 6 个非标准 hashlock UTXO,理论上可能被 0–3 字节原像花费,但经核查它们都没有这样的原像,因此无法被 64 字节交易花费;
- 本 BIP 会禁止一类隔离见证交易:单输入单输出、付给 2 字节见证程序的交易。原文指出,这类交易目前已知的用途是 ephemeral anchor outputs(临时锚点输出)。
4.4 参考实现要点
原文给出的参考实现把检查放在区块 Merkle 根校验之前:在部署激活后,逐笔检查区块内交易,若某笔交易去掉见证后的序列化大小等于 64 字节,则以 “64-byte-transaction” 为由判区块无效(BLOCK_MUTATED)。原文链接的样例实现位于 bitcoin-inquisition 项目的一份开放 PR 中。
五、谁必须动
普通持币人:正常交易不会是 64 字节,无直接影响。它目前仍是草案,更谈不上要求任何人现在行动。
钱包开发者(尤其 SPV/轻钱包):本 BIP 的主要受益方。若规则生效,就不必再为“64 字节交易冒充 Merkle 树内节点”这类情形做额外的证明校验与变通处理。
全节点与矿工:若将来激活,需在验证区块时执行这条检查,并在造块时不纳入此类交易——它们此前在策略层已被拒收多年。
共识层:这是对交易有效性规则的收紧,属于软分叉式的规则收紧;但再次强调,它现在的状态是 Draft。
六、现在算不算数,以及一个常见误读
状态为 Draft(草案)——不算数,尚未生效,也未在本页写作时成为共识规则。现在实际拦住 64 字节交易的,是 Bitcoin Core 自 2018 年以来在中继与 RPC 层面的策略限制,而不是共识。同一项修复也被打包写进了 BIP-54,两份文档的状态要分开看。
常见误读:
“64 字节交易现在已经被共识禁止了,反正也广播不出去。”
不对。广播不出去是策略(standardness)的效果:节点默认不转发、不打包,但它不等于共识无效。BIP-53 要做的正是把这道防线从策略层提升到共识层;在它(或包含同一修复的提案)正式激活之前,这个区别一直存在。
七、延伸
- 阅读版:https://bips.dev/53
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0053.mediawiki
- 相关:BIP-54 共识清理、BIP-37 部分 Merkle 树、BIP-66、BIP-141
- 仓库总目录:https://github.com/bitcoin/bips
