一文讲清: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 实际调用链路图
会更偏“安全审计/底层协议分析级别”。

浙公网安备 33010602011771号