两种时代叠在一起的编码世界
2021 年之后,以太坊的交易统一穿上有类型字节的封套(EIP-2718,见 交易封套是什么?EIP-2718 为什么给交易加类型字节):首字节声明类型,载荷按类型规则解析。但在这之前整个十年,交易都是裸的 RLP 编码列表,没有任何前缀,签名规则由 EIP-155 的链号修补过一轮(链号历史见 签过的消息会因链号改变作废吗:EIP-1959 与 1965 的链ID历史之问)。两套编码就这样叠在生产环境里:节点的网络层、签名层要为”没有类型字节的交易”永久保留一条特殊分支。EIP-2972 在 2020 年 9 月 12 日提交,作者 Micah Zoltu 想体面地结束这个双层结构:给旧式交易做两种包装类型,让旧签名原封不动地住进新封套。它的最终状态是 Withdrawn(已撤回)。

双格式规格:签名不动,外壳更新
提案引入两个新交易类型:类型字节 0x00 包装不带链号的旧式交易,0x01 包装带链号的 EIP-155 版本。关键在于”包装”二字:被包住的载荷仍是那串旧式字段列表,签名、处理、计费规则与旧式交易完全一致,任何客户端都能把收到的旧交易自动升级成包装形式——协议不必翻译语义,只换信封。作为交换,提案要求自升级区块起,裸的旧式编码不再有效,收据也同样提供 0 与 1 两个包装类型。这个”签名兼容优先”的思路值得玩味:它关心的不是让旧交易获得新能力,而是保证历史签名的可继承性。
为什么必须这样设计:关乎资金出路
动机部分写得很实在:社区想最终废掉旧式交易,删掉网络层与签名层的旧代码;但废之前必须回答一个问题——那些用旧格式签好、还没来得及广播的交易怎么办?若旧签名随格式一起作废,签名者将被迫用新格式重签,而有些场景(例如离线预签好的长尾交易)意味着资金卡死。2972 的包装让”格式迁移”与”签名有效性”解耦:格式想怎么淘汰就怎么淘汰,签名密码学上永远可解析。这是基础设施演进的通用一课——真正难的不是加新东西,而是给旧东西写遗嘱。
撤回与 0x01 的归属反转
这个提案的戏剧性在后半段。它自己占用的类型字节 0x01,在现实时间线里先被 EIP-2930 的访问列表交易使用,随后伦敦升级落地的 1559 交易拿了 0x02——带类型的世界扩张速度远超 2972 的推进速度,包装格式的地盘被新类型的实际部署挤掉,提案随后被作者撤回。后来的故事里,“淘汰旧式交易”改走了另一条路:生态一边继续接受旧格式,一边让新工具链只生产类型二交易,自然淘汰(想把这条路线写成明文规则的尝试见 0x01 开头的交易几乎灭绝了:EIP-3709 当年想把类型一请出钱包)。同一块占位编号,两种迁移哲学的交接,2972 的 withdrawn 状态正是这场交接的化石记录。
你今天还会撞见旧式交易吗
会的场景依然不少:年份久远的一次性签名工具、部分交易所与冷钱包的离线签名默认值、低兼容链上工具链,都可能继续产出无类型字节的交易。识别很简单:节点接口取回交易对象看 type 字段,没有该字段、只有 gasPrice 一组费用字段的,多半是 legacy;回执核对逻辑见 预估和账单对不上:用回执里的 gasUsed 与 effectiveGasPrice 反算实际手续费。对做自动化转账与对账的团队,核查清单里应包含签名库默认输出的交易类型——旧格式在费用高峰时缺少 1559 的双层费用结构,容易被卡在队列里,这比任何理论风险都更常发生。
最后把这段历史压缩成三条可迁移的经验。其一,任何平台的技术债清算,都有一份”旧签名遗嘱”问题:先保证历史凭据在未来格式下仍可解析,再谈淘汰,顺序颠倒就会制造资金事故。其二,编号资源比想象中稀缺:一个类型字节牵动多份提案与升级的排期博弈,读标准史时留意”谁先落地谁占有”这条铁律,2972 的 0x01 被 2930 抢先就是标本。其三,判断一条迁移路线是否走完,别看宣言看默认值——当最后一批工具链的默认输出也不再是旧格式时,旧格式才算真正退役,而这通常比提案文本里写的 FORK_BLOCK_NUMBER 晚很多年。本文为机制科普,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。