使用签名授权进行结算
ERC-3009 允许代币持有者通过签名消息来授权转账。任何人随后都可以提交该签名授权,在链上执行转账。发送方无需直接调用合约。
这是 Stable 上 x402 支付背后的结算机制。
它解决了什么问题?
授权额度问题
传统的 ERC-20 第三方转账模式是 approve + transferFrom。发送方首先调用 approve 授予支出额度,然后第三方调用 transferFrom 转移资金。这存在众所周知的问题:
- 需要两笔交易:发送方必须先发送一笔链上
approve交易,任何转账才能进行。这需要消耗 gas 并增加延迟。 - 无限额度风险:为了避免重复的授权交易,许多应用程序请求无限支出权限,从而产生重大安全风险。
ERC-3009 采用了不同的方法。发送方不授予额度,而是为特定转账签署一次性授权。无需单独的授权步骤,也不会留下持续的支出权限。
顺序 nonce 问题
ERC-2612(permit)也支持签名授权,但它使用顺序 nonce。多个 permit 之间存在顺序依赖:如果 nonce 5 未被消耗,nonce 6 就永远无法执行。
ERC-3009 通过唯一 nonce 解决了这个问题。每个授权使用一个 32 字节的值,而不是顺序计数器。多个授权可以独立创建和提交,以任意顺序进行,彼此不相互依赖。
对比
| 属性 | ERC-20(approve) | ERC-2612(permit) | ERC-3009 |
|---|---|---|---|
| 链上步骤 | 2(approve + transferFrom) | 1(transferFrom) | 1(transferWithAuthorization) |
| 使用额度模型 | 必需(链上交易) | 是(通过 permit 设置额度) | 不需要(签名) |
| Nonce 模型 | 顺序 | 顺序 | 唯一 |
| 并发授权 | 否 | 否 | 是 |
工作原理
transferWithAuthorization
发送方签署一条包含转账详情的 EIP-712 类型化数据消息。任何人随后都可以使用该签名消息在代币合约上调用 transferWithAuthorization。合约验证签名、检查有效期窗口、执行转账,并将 nonce 标记为已使用。
签名授权包含:
from:发送方(签名者)的地址to:接收方的地址value:转账金额validAfter:此授权可执行的最早时间(Unix 时间戳)validBefore:此授权可执行的最晚时间(Unix 时间戳)nonce:确保唯一性的 32 字节值
时间窗口(validAfter/validBefore)让发送方可以精确控制转账可以发生的时间。授权可以安排在未来执行、设定截止时间,或两者兼具。如果窗口在提交之前过期,授权将变为无效,资金仍归发送方所有。
receiveWithAuthorization
此函数的工作方式与 transferWithAuthorization 完全相同,但多了一项检查:调用者必须是接收方。这可以防止抢跑攻击,即第三方观察到一笔待处理的授权并抢先提交以操纵交易顺序。
这在支付场景中很有用,因为应由接收方(商家或服务提供商)来发起结算。
cancelAuthorization
发送方可以在授权被执行之前撤销一个未使用的授权。发送方签署一条 EIP-712 取消消息,合约会将 nonce 标记为已使用而不执行转账。原始授权将无法再被提交。
内置的安全特性
- 一次性使用:每个唯一 nonce 只能使用一次。重复提交相同的签名授权将会回滚。
- 有时间限制:
validAfter/validBefore窗口确保授权不会无限期有效。 - 自包含:一个签名授权一笔特定转账,转给一个特定接收方、转一个特定金额。不会留下持续权限。
- 非托管:提交者从不持有发送方的资金。转账在合约内部直接从发送方转到接收方。
Stable 上的 ERC-3009
Stable 上的 USDT0 原生实现了 ERC-3009。任何应用程序都可以使用 transferWithAuthorization,无需部署额外的合约或中继基础设施。
单资产结算
在以太坊上,即便使用 ERC-3009,提交者仍需要 ETH 来支付调用 transferWithAuthorization 的 gas。转账本身是 USDT,但执行却依赖于另一种原生资产。
在 Stable 上,USDT0 同时充当支付代币和 gas 代币。从授权到链上结算,整个支付生命周期都运行在单一稳定币上。在任何步骤中都不需要单独的原生资产。
正是这一特性使 Stable 上的 ERC-3009 成为更高层支付协议的坚实基础。x402 直接利用了这一点,在标准 HTTP 通信中将 ERC-3009 用作其链上结算机制。
要点总结
- ERC-3009 允许代币持有者通过签名消息来授权转账。任何人都可以提交该签名授权来执行转账。
- 它用一次性、自包含的授权取代了 ERC-20 额度模型。无需
approve步骤、无持续权限、无双花风险。 - 唯一 nonce 允许以任意顺序并发创建和提交多个授权。
- Stable 上的 USDT0 原生支持 ERC-3009,由于仅使用 USDT0 即可完成结算,它为 x402 提供了实用的基础。

