Gas 可以由别人垫付:ERC-1077 的签名消息代执行机制 图 1
Gas 可以由别人垫付:ERC-1077 的签名消息代执行机制 · 图 1

Gas 可以由别人垫付:ERC-1077 的签名消息代执行机制

2018 年的以太坊有一个劝退新手的死结:应用要用户调用合约,合约执行要 Gas,Gas 要 ETH,而新用户手里只有应用发给他的 ERC-20 代币。ERC-1077 给出一种绕法:用户不用发交易,只签一条消息表达意图;一个不特定的第三方看到消息、替他把动作送上链、垫付 ETH,事后从用户的代币余额里扣回等值 Gas。标准创建于 2018 年 5 月 4 日,作者是 Ethereum Foundation 的 Alex Van de Sande 与 Ricardo Guilherme Schmidt,仓库记录状态为 Stagnant。

一个接口四条规则

标准的接口很薄。executeGasRelay 接收执行数据、油价、气量上限、结算代币地址、中继者地址与签名,由账户合约执行并给中继者结算 Gas 成本;executeGasRelayMsg 与 executeGasRelayERC191Msg 分别还原待签消息与其 EIP-191 封装;lastNonce 暴露当前序号防重放。签名消息本身必须含六个要素:nonce 或时间戳、被账户合约执行的字节数据、以所选代币计价的油价、预留气量、结算代币(零地址表示 ETH)、Gas 返还对象(零地址表示出块者)。

Gas 可以由别人垫付:ERC-1077 的签名消息代执行机制 图 2
Gas 可以由别人垫付:ERC-1077 的签名消息代执行机制 · 图 2

消息怎么拼才安全

签名不是随便签。消息必须按 EIP-191 组装:0x19 起始字节保证这串东西永远不会被误当合法交易,版本字节 0 后面跟验证者地址——也就是执行它的账户合约自己,再往下依次拼入 EIP-1344 的链标识、执行 nonce、执行数据、约定的油价气量、结算代币与中继者。链标识与账户地址进摘要的用意很朴素:换一条链或换一个合约,同一份签名就作废。发起签名的外部账户或合约还要实现 ERC-1271 供账户合约回验——这套校验闭环使中继者是陌生人也没关系,条件不符账户合约直接拒付。

与转发器路线的分工

签名要素的每一项都在为某类事故买保险。nonce 或时间戳防重放:同一份签名没有序号护栏就会被中继者反复兑现;链标识按 EIP-1344 写进摘要,测试网攒下的签名到主网即作废;结算代币地址与中继者地址进摘要,防止一份本该用 A 代币结算的授权被悄悄换成 B 代币结算、或者回报被转给不相干的第三方。Gas 返还对象留零默认给出块者这条规则,也暴露了设计年代的生态:当时没有打包 MEV 的收益分配问题,中继经济还是矿工副业。账户合约侧的核验责任同样清晰:收到 executeGasRelay 调用后,重组消息、恢复签名者、比对账户 owner、扣减余额、执行执行数据——任何一步不过都整笔回滚,中继者白付 Gas。这套不依赖信任的结算闭环,正是它比同时代代付方案超前的地方,也是它最终没能活下来的原因:闭环的另一半——愿意垫钱的账户合约生态,等了三年才以智能账户的形式出现。

对读者还有个直观的对照物:这类账户合约的签名消息在钱包里显示的往往是一串编码后的域数据,普通签名弹窗只能给出哈希级摘要——这正是后来 EIP-712 与账户抽象各自解决易读性与通用性的起点。把 ERC-1077 当作账户抽象演化链上的一环来读比当工具用更有价值:它的六要素、它的 191 拼装、它对结算双方的中立性,都能在今天的 ERC-4337 用户操作与 paymaster 配置里逐一对号,看到的历史就越清楚,面对新奇按钮时就越不容易把付款条款签成模糊摘要。

后来解决同一问题的主流路线是 ERC-2771 一系的可信转发:目标合约自己信任某个转发器,从数据尾部还原真实发送者。ERC-1077 的差异在于信任重心放在用户自己的账户合约上——中继者只需要观察链下签名,不需要任何一方预先信任它,代价是每位用户先要有一个合约账户。这个架构判断影响了后来 ERC-4337 智能账户加 paymaster 的格局。停在 Stagnant 的直接原因则是时代条件:当时账户抽象没有落地,单有代付协议撑不起生态。今天它教给读者的是一句可复用的判断:替你垫付 Gas 的人从不免费,看清楚消息里结算代币那栏指向什么资产、Gas 返还对象填了谁的地址,比什么都重要。本文为机制说明,不构成任何投资建议。