账户不必部署代码也能共享实现:EIP-7819 的 SETDELEGATE 设想 图 1
账户不必部署代码也能共享实现:EIP-7819 的 SETDELEGATE 设想 · 图 1

以太坊上最浪费的东西,可能是同一份代码的第很多份副本。智能账户工厂今天造一个账户实例,要么部署一个几百字节的克隆合约,要么再套一层每次都去读存储的代理。2024 年 11 月提交的 EIP-7819 提出了一个新操作码 SETDELEGATE,让合约直接借用 EIP-7702 的委托指示器来充当免部署代码的账户实例。提案目前是 Draft,依赖的 7702 已定稿,但它自己尚未激活。它想改写的,是智能账户的出厂方式。

克隆与代理各有一半难处

传统方案的两端各有代价。ERC-1167 式克隆把目标地址直接焊死在字节码里,部署便宜,但永远升不了级;可升级代理把实现地址放进存储槽,能升级,代价是每次调用都要多一次存储读取,OpenZeppelin 的 ERC-1967 代理光本体就约 708 字节。提案引用了 Geth 团队在 EthCC9 演讲公布的研究:约五千万次合约部署中 97.1% 是重复部署的同一份代码,去重后的独立字节码里有 28.6% 小于一千字节——重复且微小,正是克隆与代理扎堆的地盘,也是状态膨胀的大头。把这些实例换成 7702 的委托指示器,每个账户位置在状态里只占 23 字节,调用重定向也从用户代码层上移进了协议层,每笔交互都省下一截 Gas。

账户不必部署代码也能共享实现:EIP-7819 的 SETDELEGATE 设想 图 2
账户不必部署代码也能共享实现:EIP-7819 的 SETDELEGATE 设想 · 图 2

操作码怎么执行

规范给新指令分配的编号是 0xf6。执行时先从栈上弹出盐值与目标地址两个参数,扣除一个空账户成本,并直接拒绝在静态模式下运行。部署位置由一条哈希公式决定:把委托前缀标识、执行合约自己的地址与调用方自选的盐值拼接后取哈希,截取后 20 字节——思路与 CREATE2 用部署方加盐寻址平行,区别是把账户 nonce 换成了合约自由选取的盐,工厂可以为每个实例算出确定的落点。位置确定后,写入恰好 23 字节的委托指示器,即前缀加目标地址;目标参数必须恰好 20 字节,短了左补零、长了截去高位。规则另有三条讲究:目标若为全零地址,则不写指示器而是清空该位置代码,相当于卸载;该位置若已存有非委托代码,直接停机,防止踩踏已有资产;实例 nonce 若为 0 则顶到 1。

升级权收归工厂

设计里最巧的是升级语义的落点。克隆不可升级、可升级代理把升级逻辑写死在每个实例里,而在 7819 的方案中,升级与锁定都由调用 SETDELEGATE 的工厂合约自己决定:工厂可以量产可升级实例,也可以对某些地址永远不再调用这条指令,实现选择性焊死。升级机制不必复制进每个账户,状态里也不必养一个实现地址槽。对 ERC-4337 智能账户和 Safe 这类多签合约来说,同一份入口逻辑既省 Gas 又留了安全补丁的通道;提案还把这条路线称为通往量子抗性账户路上少造一次性合约的台阶之一。

钱包用户的观察位

对普通用户,这类变化最终落在你交互的地址里到底装了什么。7702 已定稿进入主网,外部账户可以携带委托指示器(参见 EIP-7702是什么?智能账户变化);若 7819 落地,合约工厂量产的实例也会带同一种结构。识别手段目前很朴素:看该地址代码是否以 0xef0100 委托前缀开头,看区块浏览器是否标注委托或代理字样,看钱包确认页有没有目标实现的提示。安全边界则始终没变:委托指示器本身不含任何逻辑,一切以它指向的实现合约为准——那个地址的验证状态、升级权限归谁,才是确认交易前该核对的东西。账户看起来是个智能账户,本身不构成任何信任证明。

小结

EIP-7819 可以视为 7702 的工厂化放大:委托指示器从给自己的账户临时装上执行能力,扩展为批量量产可升级账户。Draft 状态意味着寻址公式与 Gas 参数仍可能调整,但它依托的委托机制已被主网验证过一半,是智能账户工程里值得持续跟踪的一条线。