Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

使用签名授权进行结算

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-20approveERC-2612permitERC-3009
链上步骤2(approve + transferFrom1(transferFrom1(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 提供了实用的基础。
另请参阅: