不用发交易也能转币:ERC-3009 带授权的转账把签名当成付款指令 图 1
不用发交易也能转币:ERC-3009 带授权的转账把签名当成付款指令 · 图 1

不用发交易也能转币:ERC-3009 带授权的转账把签名当成付款指令

你在向合约充值或者做一笔免手续费的转账时,可能只弹出一个签名框,没有扣 gas,也没有广播交易,钱却到账了。这背后常见的一套机制就是 ERC-3009 带授权的转账(Transfer With Authorization)。它的提案状态在标准文档中标注为 Draft,创建于 2020 年 9 月 28 日,后续状态可能变化,一切以标准仓库的当前记录为准。本文只讲机制与防御要点,不涉及任何项目评价或买卖建议。

核心思路:签名先行,提交在后

传统 ERC-20 转账要求付款方自己发交易、自己付 gas。ERC-3009 把这件事拆成两步:第一步,付款方在钱包里对一份结构化消息签名,消息里写明从谁转给谁、转多少、什么时间窗口内有效、用哪个随机数;第二步,任何一方(通常是收款的服务合约)拿着这份签名去调用代币合约,由调用者垫付 gas,合约验证签名通过后执行转账。签名遵循 EIP-712 类型化数据规范,所以钱包能把字段还原成人类可读的预览,而不是让你对一串十六进制盲签。

按文档记录,这套方案不适用于智能合约钱包——因为合约账户本来就可以直接调用 transferapprovetransferFrom,不需要再绕签名授权这一层。它服务的是普通外部账户想”只签名、不发交易”的场景。

不用发交易也能转币:ERC-3009 带授权的转账把签名当成付款指令 图 2
不用发交易也能转币:ERC-3009 带授权的转账把签名当成付款指令 · 图 2

三个函数和一条状态查询

标准定义了三个入口。transferWithAuthorization 由任何人提交,凭付款方签名把钱从付款方转给收款方;receiveWithAuthorization 由收款方自己提交,合约会额外核对收款地址与调用者一致,防止有人在交易池里截胡抢跑;cancelAuthorization 是可选的,允许付款方提前作废一份还没被使用的授权。三个动作分别有各自的类型哈希常量,授权被使用时发出 AuthorizationUsed 事件,取消时发出 AuthorizationCanceled 事件。

想查某份授权还在不在,用 authorizationState(authorizer, nonce):返回真表示这个 nonce 已被用掉或取消。这里的 nonce 是随机生成的 32 字节数据,而不是递增计数器,谁用过、谁没用过,链上一查便知。

有效窗口和随机 nonce 各挡什么风险

签名里的 validAftervalidBefore 划出一个时间窗口,窗口之外提交一律失败。窗口越短,一份签名万一泄露,能被滥用的时间就越短。随机 nonce 则保证每份授权只能被使用一次:一旦某个 nonce 上了链,同一份签名的第二次提交会被拒绝。与 ERC-2612 的 permit 相比,两者都靠 EIP-712 签名,区别主要在 nonce 形态和与 approve 模式的关系上:2612 面向的是 allowance 额度授权,3009 面向的是一次性的转账本身。

什么场景下你会遇到它

最典型的是交易所或应用的充值通道:平台让你先在钱包里签一份收款授权,再把这笔签名拼进它自己的批量入池交易,你全程没付 gas,gas 由平台在链上统一承担。第二类是链上支付场景,商家用 receiveWithAuthorization 代收,买家不需要先换 ETH 就能用稳定币结账。第三类是定期或活动类的领取通道,运营方把领取凭证做成签名,用户签名、平台代提交。识别它们的共同点很简单:钱包弹出的是签名请求而不是交易确认,费用栏显示零 gas,而资金变动要等服务方提交后才在区块上出现。理解了这一点,你就知道”到账延迟”通常是提交方在等批量窗口,而不是你的签名丢了。

用户侧的防御清单

第一,签前看清钱包弹出的 EIP-712 字段:金额、收款方、有效期。凡是把有效期拉得很长、金额又大的授权请求,都值得提高警惕。第二,如果服务不再使用,尽量走 cancelAuthorization 或让它在窗口内自然过期;能查 authorizationState 的区块浏览器可以确认状态。第三,签名不等于交易上链,出现”签了却没到账”的提示时,先确认有效期是否未到、活动是否结束,再判断是服务方没提交还是授权已经作废。第四,任何要求你把助记词或私钥”签进来”的请求都与本机制无关,属于钓鱼。

最后提醒:本文讨论的是协议与合约机制,不构成投资建议,也不构成任何税务或法律意见;涉及资产操作前请核实合约地址与项目身份,理解签名可能被提交上链的后果。