贵在一字不差地重复搬砖
账户抽象的部署模型里,每个用户理论上拥有一份自己的合约账户,而这些账户的代码一字不差地相同。问题出在合约创建的数据费上:按现行每字节 200 Gas 的创建数据计费,一个 10000 字节的合约光把代码写进状态就要 2000000 Gas。提案举的例子正是这个量级——同样的砖,每盖一栋房都从矿山重新运一趟。EIP-5478 在 2022 年 8 月 17 日提交,思路是允许新合约直接从”已经存在代码的合约”取砖:加一条与 CREATE2 几乎相同的新操作码 CREATE2COPY,多收一个参数,指向一份已经躺在状态里的同源代码。

规格:多一个参数,换一种计费
按提案定义,CREATE2COPY 占用 0xf6 槽位,接收五个栈参数:转账金额、内存起止、盐值,外加 existing_contract_address。行为与 CREATE2 完全一致,只多了两道硬约束。第一,发起创建的合约代码哈希必须与 existing_contract_address 的代码哈希相同,也就是只能拿自己的代码”复印”;第二,若 initcode 实际产出的代码与既有合约不一致,创建直接以错误终止,提案原文给出的报错语义是”代码不匹配”并烧光全部 Gas。费用侧的替换是核心卖点:原本按创建数据每字节 200 Gas 的费用,改为一次 EXTCODEHASH 级别的访问费——按 EIP-2929 的规则,冷账户 2600,热账户 100。对照开头那笔两百万的账,节省幅度一目了然。
为什么恰好省在哈希一次
要理解这个省法,得看清 CREATE2 费用结构: intrinsic 费、转账费、押金之外,大头是 initcode 数据费,因为协议必须为”把这么多字节永久写进状态”付账。CREATE2COPY 的前提是代码已经在状态里存过一份,新合约落库只是多一个指向相同代码哈希的条目——代码库不增重,新增的只是一条账户记录。那么为这次创建付出的”搬运费”自然降级为”查一次已有代码的哈希费”。冷 2600 与热 100 的区别也来自这里:同一笔交易里先访问过参照合约,第二次就按热价收。
与现实世界的距离
必须写清楚:EIP-5478 是 Stagnant,从未在任何网络激活。今天智能账户生态解决”人人部署同款合约”的方式是另一条路——用工厂代理共享实现合约(每个账户只是薄薄的壳),或者干脆用地址预测加首次使用再部署的惰性模式,把创建费延后甚至由第三方代付,比如用户操作框架里的付费方机制,见 ERC-4337 Paymaster 怎么理解?。CREATE2COPY 相当于给这些方案提供了一个更省Gas 的地基版本,但地基停在图纸上。另外它也没有为”代码不同”留余地:账户抽象里常见的按初始所有者个性化字段的代码写法,与这份提案的前提直接冲突。
0xf6 号槽的三张认领书
顺带一个编号掌故:0xf6 这个槽位在提案仓库里至少被三个提案认领过。最早是 2020 年 9 月的 EIP-2997 IMPERSONATECALL,同年 10 月 EIP-3074 又把 AUTH 放在 0xf6,最后就是 5478。三份认领互不知情,全都处于 Stagnant 或 Withdrawn 状态——3074 的撤回理由写明由 EIP-7702 取代。操作码空间的分配从来不是先到先得,而是看哪条路线最终活着进升级清单。想理解这类同槽竞争的另一面,见 《合约替另一个地址办事的草图:EIP-2997 的 IMPERSONATECALL 与 0xf6 号槽》 对 2997 的拆解。
把三种创建的账单排在一起
同一段代码上链,一共有三种常见路径,账单形状各不相同。传统 CREATE 用内存里的完整 initcode,代码字节数直接决定数据费;CREATE2 同样带完整 initcode,只是多了按盐预测地址的能力;CREATE2COPY 则是把”这段代码长什么样”换成”照着那个地址抄”,代价是必须现场提供一份 initcode 产出同样代码——注意这不是免费午餐:提案的调用方仍要执行 initcode 让新合约的代码哈希成立,省下的只是把同样字节永久写入全局状态的那份押金性开销。因此它的甜区非常窄:代码已在状态里、且 initcode 本身廉价可复用。对只想”用相同字节码克隆地址”的场景,它是最锐利的一把刀;代码稍有个性的场景,它连出场机会都没有。
对费用敏感的读者该带走什么
这条提案即使永不上线也留下一条实用的读账方法:任何”复制已有代码”的链上动作,真实成本都在新增状态字节数,而不是动作次数。评估批量部署方案时,先问实现代码是不是共享的、壳地址是不是预测的、创建费由谁付,比问工具品牌更能估算账单。本文所有 Gas 数字均以提案原文与所依赖提案原文为准,属于机制说明而非费用承诺;本文不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。