免 Gas 转移的签名到底是什么:EIP-3009 授权转账的字段与撤销 图 1
免 Gas 转移的签名到底是什么:EIP-3009 授权转账的字段与撤销 · 图 1

“免 Gas 领取""平台代付手续费”这些功能背后,藏着一个常被忽略的分工:钱是别人出的,但同意的签名一定是你的。EIP-3009 就是给这个分工立的标准:NFT 持有者签一份有格式的授权书,任何第三方都能拿着这份签名去合约里完成转账,Gas 由第三方付。这篇文章讲清楚这份授权书写了什么、什么时候过期、怎么作废,以及为什么说签名弹窗里的域名信息就是它的防伪标。

它解决什么问题

ERC-721 的原始设计里,转账必须由持有人在链上发起交易并支付 Gas。这在三个场景碰壁:新用户钱包里一分 ETH 都没有却要领空投;项目方想让领取零门槛;批量转移希望由运营方统一付费。此前的通用做法是给合约管理员加白名单函数,或者项目方代持再分发,各有各的信任成本。EIP-3009 给出协议级答案:把”授权”做成可离线签名的数据,把”执行”交给任何愿意付 gas 的人。

免 Gas 转移的签名到底是什么:EIP-3009 授权转账的字段与撤销 图 2
免 Gas 转移的签名到底是什么:EIP-3009 授权转账的字段与撤销 · 图 2

授权书里写了哪几项

标准定义了函数 transferWithAuthorization,参数是一张授权单:转出地址、接收地址、代币编号、随机数(nonce)、截止时间(deadline),外加一份 EIP-712 结构化签名。执行方(通常是项目方的中继或后端)凑齐”授权单加签名”后调用合约,合约验证签名属于转出者、随机数未被使用、尚未过期,然后把 NFT 转给接收地址,Gas 记在执行方账上。对应的领取方向还有一个 receiveWithAuthorization,用于把资产转入合约地址并在同一笔里执行接收逻辑。

两个字段承担了全部安全语义。截止时间:过期未用,这张授权自动作废,签名躺在互联网上也不会被动用。随机数:每张授权单对应持有人账户下唯一的序号,用一次就递增;同序号的旧授权即刻失效。标准同时提供了 revokeAuthorization,允许持有人在未过期前主动烧掉某个序号——代价是自己发一笔交易、自己付 Gas,撤销从来不是免费的。

签名的”身份”:EIP-712 域名是防伪核心

钱包弹窗里看到的”Application”或”Domain”字样,来自授权单签名的 EIP-712 域分隔(名称、版本、正在签名的合约地址)。同一份内容的授权单,换一个合约地址去签,签名值就完全不同。这意味着钓鱼方很难拿着在 A 合约签过的授权去 B 合约复用,但也意味着:如果弹窗里的域名与你正在操作的项目对不上、版本陌生、链编号不对,就应该停手——这份签名天生就是为那个陌生合约准备的。

免 Gas 不等于免信任

第三笔账要算给平台的”代付”:代付者知道你何时领取、从哪转到哪,领取行为与钱包地址的关联被一次性交了出去;代付走的中继合约、构造授权的前端,都是新的攻击面。此外”免 Gas”只覆盖这份授权执行的 gas,若后续你要转回、挂单、取消,Gas 还是要自己出。对新手最实用的一句话是:免 Gas 领取时,把弹窗当成一份”限期有效的转账委托书”来读,看清谁收、收到哪、什么时候过期,再决定签不签。

怎么验证一个项目是否真的支持

标准不是开关,需要代币合约实现相应函数。最直接的验证是在区块浏览器打开该合集的合约页,查看写入合约 ABI 中是否存在 transferWithAuthorization 相关接口;项目方口头承诺”支持免 Gas 转移”而合约里没有这些函数的,执行路径一定绕不开某种信任托管,值得追问。

一个测试动作胜过十句说明

想确认某个合集是否真支持授权转账,有个五分钟就能做完的实验:在测试网或小额持仓上,让项目方或熟悉的朋友用第三方账户替你执行一次免 Gas 领取,全程记录三份数据——你签的弹窗截图、执行交易的哈希、以及接收方钱包的 Gas 支出。拿着交易哈希去浏览器看调用函数名是不是 transferWithAuthorization 家族,比读十遍宣传页可靠。若函数名是项目方自造的、或执行前要求你把 NFT 先授权给某个地址,那它属于”托管式代领”,风险结构回到代持逻辑,与标准的授权签名不是一回事。

本文是对公开标准的机制解读,具体实现以各项目合约为准,不构成投资建议。