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

