签名替我付 Gas:ERC-2770 的中继转发合约为何主动退场 图 1
签名替我付 Gas:ERC-2770 的中继转发合约为何主动退场 · 图 1

签名替我付 Gas:ERC-2770 的中继转发合约为何主动退场

新手钱包里还没有 ETH,应用却想让他点一个按钮就完成上链动作——元交易是常被提起的解法:用户把意图签成一条数据,别人替他包装成真交易并垫付 Gas。ERC-2770 为这件事设计了一个公共组件:一个通用的转发者合约,专职验签,让成百上千个应用不必各自重复写验签代码。标准创建于 2020 年 7 月 1 日,在仓库里的最终状态是 Withdrawn,撤回理由简短:单一实现无需标准化。

一条请求里的七个字段

转发合约处理的请求结构 ForwardRequest 有严格的字段顺序:from 是发起意图的外部账户,to 是目标合约,value 与 gas 约定转账额和执行上限,nonce 是链上跟踪的序号,data 是转交给目标的调用数据,validUntil 给出请求可被转发的最高区块号、填零表示不限时。结构可以扩展出更多字段甚至嵌套结构,但前提是先用 registerRequestType 把类型注册进转发者——它靠注册表约束字段名,注册参数里那段字符串是 ERC-712 风格的类型说明。

签名替我付 Gas:ERC-2770 的中继转发合约为何主动退场 图 2
签名替我付 Gas:ERC-2770 的中继转发合约为何主动退场 · 图 2

验签和执行各管一段

verify 方法做检查:输入请求实例、domainSeparator、注册过的类型哈希、余下字段的编码和签名,对拼接数据做 ERC-712 签名校验。execute 则真正办事:验签通过后把签名者地址追加到数据尾部,再调用目标合约。为什么多此一举追加地址?标准点破了元交易的核心陷阱——msg.sender 由 EVM 担保是这笔链上交易的发送者,可元交易里发送者是垫付 Gas 的中继方,真正的意图签名者必须另走还原路径写进数据里,目标合约才能识别你到底是谁。

从提案到撤回

结构里的两个字段值得新手多看一眼。nonce 是链上跟踪的递增序号,防的是同一条签名被重放执行第二次;validUntil 则是请求的保质期,以区块号为单位,过期后转发者应当拒绝——这两个闸门加在一起,决定了你能安心让一条签名在链外停留多久。规范还写明 domainSeparator 由调用方提供,作用与 ERC-712 相同:给不同应用划出互不相通的签名域,防止 A 应用骗你签的请求被原样搬到 B 应用上执行。这些机制本身不新鲜,全部继承自 ERC-712,转发合约的贡献只是把它们收进一个公共合约。也正因为零件都是现成的,撤回理由里那句单一实现无需标准化才显得诚实——机制都对,只是这个协议天生不需要多份实现,写一份好文档比立一份标准更有用。

把这份撤回提案和今天的免 Gas 按钮放在一起核对,会发现它的担忧全部应验在细节上:如今点击铸造页面替你执行转发的,多是各家封装好的中继或 bundler,界面上往往不再展示 ERC-712 的结构化字段,只剩一句确认。标准撤回没有撤回你对 from、to、validUntil 的知情权——用钱包的高级弹窗或原始 JSON 视图仍能看到请求各字段,养成在敏感动作前展开原始结构的习惯,等于给被撤回的规范在自己设备上留了一份本地实现。这也是读旧提案的实际收益:标准会退场,机制长存,弹窗里的每一个字段都值得对得上号。

撤回理由其实预告了它的命运。转发者合约天然是个共享基础设施,实践中往往由少数规范实现承担全网验签,其余项目直接复用这些实现而不是再造接口。当一个协议只容得下少数实现时,把它写成 ERC 的价值就剩下文档作用,作者选择撤回并让实现回到各自代码库,是务实而非失败。读这份标准的现实意义在安全侧:今天遇到代付 Gas 的免 Gas mint 或按钮代付功能,仍要养成在 ERC-712 弹窗里看清 from、to、validUntil 的习惯——有效期一栏写着不限时的签名尤其要掂量;同时记住,替你看懂 msg.sender 与真实签名者区别的,从来不是 UI 上那个按钮,而是这类被撤回也没消失的机制设计。本文为机制说明,不构成任何投资建议。