一次签多笔的钥匙孔:ERC-7821 最小批量执行接口
模块化智能账户把签名验证、花费限额、会话密钥拆成一个个模块(EIP-7579 的世界),但“把一串调用原子地执行掉”这个动作本身,各家账户合约的入口函数名和参数各不相同。ERC-7821 用一个极小的接口统一这个钥匙孔:一个 execute 函数、一个 supportsExecutionMode 查询,加一套模式字节的写法。提案在 ercs 仓库的状态是 Draft(草稿),创建于 2024 年 11 月 21 日。
Call 结构与三种模式
接口里最基础的是一枚 Call 结构体:to、value、data 三件套,规范特别写明 to 填零地址时应被替换为账户合约自身地址——这样“调用自己”这种高危操作也有标准写法。执行入口 execute(mode, executionData) 收两段字节:mode 声明这次执行的形状,executionData 装内容。规范定义了三种模式:0x010000000000... 是单批、不带可选 opData,executionData 就是 abi 编码的 Call 数组;0x01000000000078210001... 是带 opData 的单批,opData 里可以携带签名等附加数据;0x01000000000078210002... 是批中批——executionData 编码一个 bytes 数组,每个元素本身又是一整批执行数据,内部会以带 opData 的模式递归执行。批中批的用场写得很具体:装多个不同签名者签过的批次,一次原子执行。

授权检查的分寸
批量执行最敏感的问题是“谁有权触发”。规范给的规则分三档:opData 为空时,实现应当要求 msg.sender 就是账户自身——即批量只从账户内部逻辑发起;opData 非空时,实现应用其中编码的签名判定调用者资格;若 msg.sender 是授权的入口合约(4337 的 EntryPoint 一类),execute 可以接受。这些措辞里 SHOULD 与 MAY 的密度不低,说明接口刻意最小化,把权限模型的裁量留给账户实现。对用户,这意味着 ERC-7821 只保证“问法一致”,不保证“规则相同”——同样支持该接口的两个钱包,批量操作的授权门槛可以完全不同。
对 NFT 场景的实际意义
NFT 日常操作是批量执行的天然客户:一次“授权加铸造”、一次“撤单加换仓”、多枚 ERC-1155 的分批转移。有统一入口后,应用可以为不同账户钱包准备同一份 executionData,而“批中批”打开一个新场景——多签成员各自签好自己的批次,由任意一人合成一次上链,签名与执行解耦,链上只落一笔。排障角度也清爽了:批量失败时,用 supportsExecutionMode 先确认账户声明支持哪种模式,再核对 opData 里的签名者顺序,比在各家钱包的私有接口里乱撞高效。
排障清单与模式误配
批量执行出问题时,按四步排查最有效。第一步确认支持:对账户合约调 supportsExecutionMode 传入你用的模式字节,返回 false 则一切免谈,先换模式或换钱包。第二步核对 to 段:Call 里出现零地址会被替换为账户自身,如果你的意图是对外调用,这一处笔误等于把交易打给自己。第三步看 opData:带 opData 的单批与批中批的签名判定路径不同,多签场景漏一个签名者、或把批中批当单批提交,都会在授权检查处回滚。第四步查 msg.sender 角色:从外部账户直发与从入口合约代发,触发的授权分支不同。对钱包开发者,接口虽小,字节前缀一字之差(0001 与 0002)行为即不同,写死任何模式前应实测;对用户,模式差异是排障词汇表,报错信息里出现 execution mode 相关字样时,按上面的顺序定位比盲目重试更快。
费用视角也别忽视:批量里任何一笔失败就整批回滚,一次 revert 把几笔调用的 gas 一起烧掉,所以成熟的调用方会把前置检查放在链下,把 execute 当最后一步棋。
再记一个术语:delegation(委托合约)在本文语境指被委派逻辑的共享合约,不是 7702 那种账户委托,读到同名概念先看接口签名再站队。
顺带提醒与 EIP-7702 的配合:7702 让 EOA 临时挂上执行逻辑后,同一套 execute 入口也能被普通地址借用,批量体验的普及正来自这种组合。
草稿阶段、模式字节一字之差行为就不同,接入前务必读目标钱包的实现合约。本文为机制说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。