ERC-2771 可信转发器:代付 Gas 时合约眼里"谁在发消息"是怎么改的 图 1
ERC-2771 可信转发器:代付 Gas 时合约眼里"谁在发消息"是怎么改的 · 图 1

ERC-2771 可信转发器:代付 Gas 时合约眼里”谁在发消息”是怎么改的

免 Gas 时最先出问题的不是钱

很多 NFT 站点挂着”免费 mint""零 Gas 领取”的按钮。钱的问题最直观:新用户手里没有 ETH,付不了手续费。但还有一个不那么显眼的问题:如果由别人的地址替你提交交易,合约会以为那笔操作的发起人是那位代付者。白名单校验、按地址 mint 数量限制、空投资格检查全都靠”谁在调用”来判断,判断错了,白名单就等于向任何人开放。ERC-2771 要解决的就是这个身份传递问题。

这份 EIP 的创建日期是 2020 年 7 月 1 日,现在的状态是 Final。它的定位说清楚在摘要里:一套让接收方合约(Recipient)通过可信转发器(Forwarder)接受元交易的合约级协议,不需要对以太坊协议本身做任何改动。

协议只改一件东西:calldata 尾部

机制可以压缩成三步。用户先对一个结构化消息签名,消息里写明要调用的目标、数据和 Gas 限制;转发器验签后,把这笔调用提交上链,Gas 由转发方(或它背后的赞助方)支付;为了让合约知道真正的发起人,转发器在原始 calldata 末尾追加 20 字节——那正是用户地址的长度。合约于是用 _msgSender() 而不是原生 msg.sender 来判断操作者:如果调用来自自己登记的转发器,就把尾部这 20 字节当作发送者;如果是用户自己直发的普通交易,就退回原生 msg.sender

规范同时把风险说得没有余地:安全性完全建立在”转发器是可信的”这一前提上。链上看到的 msg.sender 是转发器,不是那个可信的实体,所以合约必须显式登记白名单,而不是从调用数据里自行推断。

和 ERC-4337 是什么关系

两者经常被当成竞争方案,实际处在不同层。ERC-2771 是合约之间的一对一约定:目标合约与某个转发器商量好追加规则就能跑,好处是简单、部署快,代价是”每接一家代付方就要改一次登记”,且信任集中在转发器上。ERC-4337 走的是一条独立交易通道,靠EntryPoint 与打包者把一批操作打包执行,配合 ERC-4337 时代的 Paymaster 提供代付。对读文章的人来说,实用结论是:看到”免 Gas”按钮时,值得先弄清楚是哪种代付路径——它决定了费用最终由谁承担,以及你的签名在什么条件下才会真正花掉 Gas。

一个容易被忽略的心智陷阱

元交易结构里,你的签名本身不是交易。签名只代表”我授权以这个参数执行”,如果没人替你提交,Gas 就不会发生。所以签一条消息并不必然花钱,但一旦它被合法提交,动作就会真实执行。这份判断力对 NFT 玩家很实在:白名单 mint 常用的签名领取,与钓鱼站骗你签的”低价挂单”,在技术上用的是同一套机制,区别只在你的签名授权了什么内容。

识别自己正在用元交易的三个信号

第一个信号是交易哈希对不上:你签名的消息被他人提交后,浏览器里那笔交易的哈希与你的签名内容没有直接对应,付款人也不是你。第二个信号是地址余额不动:领取成功但钱包里 ETH 分毫未少,说明有人替你结算了 Gas。第三个信号是页面文案出现”relayer""forwarder""sponsored”之类字眼。看到这三个信号,值得顺带查一句:这个转发器地址在项目方文档或官方渠道里是否被点名登记。未登记的转发器意味着你签名授权的操作将由一个身份不明的地址代你执行,白名单与限额校验的信任基础也随之改变。反过来说,识别机制并非要求普通用户读懂协议,只需要你在”免 Gas”的便利面前多花十秒确认代付方是谁——元交易改变的是交易的提交方式,不该改变你对操作内容的确认习惯。

读 ERC-2771 的最大收获大概是这个:所谓免 Gas 并不是链上没人付钱,而是付钱的人和被识别为用户的人不是同一个。看清楚这一点,你对签名弹窗里那些字段的耐心就值得了。本文为机制科普,不构成投资建议。