一文讲清:Approve / Permit / Permit2 的本质区别

在 Web3 里,“授权”是资产安全与交易体验的核心机制。

很多人会混淆三件事:

  • approve(链上授权)

  • EIP-2612 permit(签名授权)

  • Permit2(通用签名授权协议)

它们表面都是“允许别人动你的资产”,但底层机制完全不同,尤其是在:

nonce 如何设计、谁能发起交易、权限如何生效

这些关键点上差异巨大。


一、Approve:最原始的链上授权模型

1. 核心机制

mapping(address => mapping(address => uint256)) allowance;

用户必须发起链上交易:

approve(spender, amount)

2. 权限模型

  • 用户必须自己发交易

  • 授权被写入链上状态

  • 之后 spender 才能调用:

transferFrom()

3. nonce 是谁的?

👉 使用的是 EVM account nonce

类型 来源
account nonce EOA 交易 nonce

4. 谁能发起交易?

  • 只能用户自己发 approve


5. 权限本质

链上存储 allowance = 授权记录

👉 属于“状态授权”,不是签名授权


6. 问题

  • 必须支付 gas

  • UX 差(要 approve + swap 两步)

  • 无限授权风险(常见安全问题)


二、EIP-2612 Permit:签名即授权(Permit)

USD Coin 等 ERC20 常用实现


1. 核心思想

用签名替代 approve 交易

用户只需要:

离线签名 Permit

无需上链 approve。


2. 签名内容

Permit(
  owner,
  spender,
  value,
  nonce,
  deadline
)

3. nonce 机制(关键)

mapping(address => uint256) public nonces;

👉 注意:

  • 这是 permit nonce

  • 不是 EVM transaction nonce


4. nonce 如何变化?

  • 每成功执行一次 permit() → nonce +1

  • 必须严格递增使用


5. 谁可以发起交易?

任何人都可以:

  • DEX

  • Relayer

  • 钱包

  • 聚合器

只要提交签名即可。


6. 权限来源

ecrecover(signature) == owner

验证通过后:

allowance[owner][spender] = value;

7. 关键特性

项目 说明
是否上链 approve ❌ 不需要
是否需要 gas ❌ 用户不需要
nonce 类型 permit nonce
nonce 特性 严格递增
顺序要求 必须按顺序

8. 关键限制(非常重要)

EIP-2612 的 nonce 是:

❗严格递增模型(Sequential Nonce)

如果签名顺序错乱:

  • 跳过 nonce → 后续可能失效

  • 顺序错 → revert


三、Permit2:Uniswap 推出的通用签名授权系统

Uniswap Labs


1. 核心思想

Permit2 解决的是:

Permit 的 nonce 顺序限制 + 多协议授权碎片化问题


2. 关键设计:Bitmap Nonce

mapping(address => uint256) public nonceBitmap;

3. nonce 结构(核心区别)

每个用户有:

uint256 bitmap = 256 个 nonce 状态

每一位表示:

bit nonce
0 nonce 0
1 nonce 1
... ...
255 nonce 255

4. nonce 特性

👉 完全非顺序模型:

  • nonce 3 可以先用

  • nonce 99 后用

  • 不影响其他 nonce


5. 示例流程

用户签名:

  • nonce 3

  • nonce 10

  • nonce 5

可以任意顺序执行:

先用 10 → OK
再用 3  → OK
再用 5  → OK

6. 谁可以发起交易?

和 Permit 一样:

  • DEX

  • Aggregator

  • Relayer

  • 钱包


7. 权限来源

Permit2 会验证:

signature + allowance + bitmap nonce

最终执行:

transferFrom(owner, receiver, amount)

8. 本质

Permit2 =

签名授权 + 可并发 nonce + 统一授权中介层


四、三者核心对比(最重要)

维度 Approve Permit Permit2
是否需要交易
是否需要签名
nonce 类型 EVM nonce ERC20 nonce bitmap nonce
nonce 顺序 顺序 严格顺序 任意顺序
是否支持乱序执行
是否支持批量签名
UX 最好

五、关键本质区别(一定要理解)

1. Approve:状态授权

allowance 写入链上

2. Permit:签名 → 状态授权

签名 → 生成 allowance

3. Permit2:签名 → 中间层控制转账

签名 → Permit2 → 执行 transferFrom

六、nonce 系统的根本区别(核心知识点)

1. EVM Account Nonce

  • 防交易重放

  • 每笔交易 +1


2. Permit Nonce(EIP-2612)

  • 防签名重放

  • 严格递增


3. Permit2 Bitmap Nonce

  • 防签名重放

  • 可乱序

  • 256 位管理


七、为什么 Permit2 更先进?

因为它解决了三个问题:

1. 顺序问题

✔ Permit 必须顺序
✔ Permit2 可以乱序


2. 批量问题

✔ Permit2 支持批量签名执行


3. 多协议碎片化问题

✔ 一个授权覆盖多个 DEX / 聚合器


八、一句话总结

Approve 是链上状态授权;Permit 是签名生成授权(但严格顺序 nonce);Permit2 是工业级签名授权系统,通过 bitmap nonce 实现乱序执行与批量授权,彻底优化 Web3 授权体验。


如果你愿意,我可以再帮你补一版更“进阶开发者视角”的内容,比如:

  • Permit2 如何防重放攻击

  • EIP-712 在三者中的作用

  • 真实黑客利用 approve 的攻击路径

  • Uniswap router + Permit2 实际调用链路图

会更偏“安全审计/底层协议分析级别”。

posted @ 2026-06-10 23:31  若-飞  阅读(22)  评论(0)    收藏  举报