普通地址直接跑代码:EIP-2803 富交易是一次没走通的捷径 图 1
普通地址直接跑代码:EIP-2803 富交易是一次没走通的捷径 · 图 1

两笔签字的老毛病

在去中心化交易所换一次币,钱包常要你连点两次:先授权代币,再调用兑换。两笔交易、两次 Gas、两个失败窗口,还会制造一批”授权了没兑换”的悬空额度。合约钱包本来能解决——一笔交易内部连着调多个合约。但 2020 年时的现实是:合约钱包要先把 ETH 从 EOA 挪进去、浏览器兼容性差、没有统一接口,普通用户根本推不动。EIP-2803 由此走了另一条思路:既然合约钱包一时半会儿铺不开,干脆让普通地址自己拥有执行代码的能力。这份 2020 年 7 月的提案状态 Stagnant,作者的选择理由写得直白:“别让完美成为好的敌人”。

普通地址直接跑代码:EIP-2803 富交易是一次没走通的捷径 图 2
普通地址直接跑代码:EIP-2803 富交易是一次没走通的捷径 · 图 2

一个保留地址当入口

设计出乎意料地轻巧:在预编译地址段里保留一个特殊地址,EOA 只要把交易发到这个地址,交易的数据字段就不再被当作普通的 calldata,而是被当作一段 EVM 字节码,以签名人的身份直接执行。语义规则逐条对照普通合约调用做了标定:执行环境里 ADDRESSCALLERORIGIN 返回的都是签名交易的 EOA;带 ETH 的调用扣 EOA 的钱;DELEGATECALL 保持账户归属不变;SLOADSSTORE 落在 EOA 自己的存储槽里,数据跨交易持久——普通地址第一次”有了自己的存储”。两条硬性限制:交易不得附带价值,而合约(非 EOA)调用这个保留地址没有任何效果,等价于调一个空地址。

用预编译而非新交易类型

提案在实现路线上有一个值得多看一眼的选择:不改交易类型,改用预编译入口。原因是当时 EIP-2718 的类型信封体系刚立起来,用预编译可以让”富交易”叠加在任何一种既有交易类型上——1559 型、legacy 型都行,不与信封格式纠缠。这与”一笔交易只干一件事”的既有假设决裂得最彻底:同一签名者的多个操作被压进同一个原子执行单元,中间态对外不可见。兼容性评估部分预判了两类震动:假设”外部账户无法原子地做两件事”的合约会失灵——作者认为这类假设本就挡不住矿工,不算真防护;其余操作码行为全部保持原样。

让位于后来者的原因

这条路最终没走通,原因几乎全在产品层:让 EOA 直接跑任意字节码,等于把”确认界面该显示什么”变成未解难题——弹窗里那段机器码既读不出意图,也标不出风险,钱包的逐笔核对文化在它面前直接失效。合约钱包路线虽然慢,但至少每笔操作发生在可解标的合约上。今天看,把多个调用合成一步的正解沿着两个方向长成了:批量调用接口走的是账户抽象路线,而”给地址临时挂上代码”的借壳式方案则演化出已上线的委托机制,机制差别见EIP-7702 是什么?地址临时借用合约逻辑会发生什么。EIP-2803 留下的真正遗产是问题本身的提法:一切”帮你少签一次”的优化,最后都要回答同一个问题——省掉的那一签,风险谁来看见?

核对习惯的映射

把提案的历史教训翻译给用户,是两条日常纪律。其一,面对任何”合并交易""一键完成”的产品包装,先弄清合并发生在哪一层:是协议内建的原子调用、钱包代签的批量队列,还是把多个操作塞给一个中介合约——中介持有什么权限、授权能否收回,对照三件事的分工逐项过,见连接钱包、签署消息、授权转账是三件事:各自动了你什么。其二,凡是让你对一段读不懂的数据签字的流程,无论界面多精美,都应触发和当年对这段字节码一样的警觉:执行者看得到的一切,你也应当看得到,否则省下的签名次数,都是从你的审核权里扣的。

本文为技术说明,不构成投资建议;批量与合并操作可能扩大单次授权的影响面,请先核实合约来源与额度。