EIP-2612EIP签名Final(2020-04-28)Permit · 无 Gas 授权
把 approve 变成一次链下签名 + 由第三方代提交,用户无需先花一笔 Gas 授权。
适用链:多数现代 ERC-20(USDC / DAI / UNI 等)
为什么重要:改善体验的同时引入新风险:Permit 签名的钓鱼就是靠它绕过「先授权」这一步意识。
函数签名与选择器
选择器是签名的 keccak256 前 4 字节;事件则是完整的 32 字节 topic0。 点一下即可复制。
| 签名 / 字段 | 选择器 / topic0 | 说明 |
|---|---|---|
| permit(address,address,uint256,uint256,uint8,bytes32,bytes32) | owner / spender / value / deadline / v / r / s,一次交易完成授权。 | |
| nonces(address) | 每个 owner 的签名序号,防重放的关键。 | |
| DOMAIN_SEPARATOR() | EIP-712 域分隔符,绑定 chainId 与合约地址。 |
代码模板
前端签名 + 后端代提交
前端签名 + 后端代提交TypeScript
实现与使用时的常见陷阱
- ✕value 给 type(uint256).max 的 Permit 就等于「无限授权」,签名前务必核对数额与 spender。
- ✕deadline 设得太远(或 0)等于长期有效的空白支票。
- ✕nonce 必须从链上读,自己猜会让签名直接失效。
- ✕不是所有 ERC-20 都实现了 permit,调用前先用 supportsInterface 或读 DOMAIN_SEPARATOR 探测。
相关标准
同属「签名」的其他标准