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

BIP-53 禁止 64 字节交易

提议把不计见证数据时恰好序列化为 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 则是把这一项单独抽出来,完整论证其理由与利用方式的一份文档。

它还牵涉:

三、它要解决什么

区块头里包含对本区块交易集合的承诺:把各交易的 txid(交易的双重 SHA256)建成 Merkle 树,树根放进区块头。轻客户端凭一条 Merkle 路径就能被证明“某交易在某区块中”。

原文指出,这种 Merkle 树构造有若干安全弱点,其中与 64 字节直接相关的有两类:

3.1 区块可锻性

一个 64 字节交易的序列化,恰好等于 Merkle 树中两个哈希的拼接(32 字节 + 32 字节)。恶意节点可以构造一笔 64 字节交易,使其序列化等于某个区块里 Txid₀‖Txid₁ 的拼接,再把含这笔恶意交易的“区块”转发出去:

原文注记:无效交易这一路攻击向量曾在 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 向后兼容与已知影响

原文的核查结论包括:

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 要做的正是把这道防线从策略层提升到共识层;在它(或包含同一修复的提案)正式激活之前,这个区别一直存在。

七、延伸

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