Uniswap Labs近期发布了两个创新的智能合约:Permit2与Universal Router。其中,Permit2作为一个代币授权合约,允许在不同应用程序间安全共享和管理授权,极大提升了链上交易的效率、安全性和用户体验。
什么是Permit2与Universal Router?
Permit2和Universal Router是Uniswap Labs为优化自身产品而设计的智能合约,旨在降低Gas成本、简化交易流程并增强安全性。在设计过程中,团队意识到这些工具同样适用于整个开发者生态,因此决定将其作为公共基础设施开放给所有开发者使用。
- Permit2:支持在不同智能合约中安全共享和管理代币授权,推动代币授权标准化。随着更多项目集成Permit2,用户可在所有应用中使用统一授权模式,降低交易成本并提升安全性。
- Universal Router:将ERC20和NFT兑换功能统一到单一路由器中。与Permit2整合后,用户可在单次交易中兑换多个代币和NFT,节省Gas费用。
传统授权模式的局限性
典型的ERC20代币授权模式基于EIP-20标准,流程如下:
- 用户调用
approve()方法,向合约授予代币支出权限。 - 用户调用合约交互函数,合约再调用代币的
transferFrom()完成转账。
尽管该模式广泛应用,但存在两个显著问题:
- 用户体验差:用户需为每个新协议单独授权每个代币,导致交易次数增加,浪费Gas和时间。
- 安全性低:应用通常要求用户授权最大限额,以避免重复授权。若协议被攻击,用户授权范围内的所有代币都可能被盗。
EIP-2612签名授权模式
EIP-2612对代币授权进行了改进,用户可通过签名授权(Permit)信息与应用交互,无需提前授权。流程如下:
- 用户签署链外Permit消息,授权合约使用代币。
- 用户提交签名消息作为交互的一部分。
- 合约调用代币的
permit()方法,使用签名授予授权。 - 合约获得授权后调用
transferFrom()完成转账。
EIP-2612解决了传统授权的两个问题:
- 无需单独提交
approve()交易。 - 授权消息包含过期时间,限制授权有效期,减少安全风险。
然而,EIP-2612仅适用于支持该标准的代币,许多旧代币和部分新代币并未采用该功能,限制了其应用范围。
Permit2的创新解决方案
Permit2结合了传统授权和EIP-2612的优点,将签名授权的便利性和安全性扩展到所有ERC20代币。其核心流程如下:
- 用户调用代币的
approve()方法,向Permit2合约授予无限授权(仅需一次)。 - 用户签署链下Permit2消息,授权协议合约代表其转账代币。
- 用户调用协议合约的交互函数,传入签署的Permit2消息。
- 协议合约调用Permit2的
permitTransferFrom()方法,Permit2使用其授权在代币合约上调用transferFrom()完成转账。
Permit2的优势在于:
- 一次性授权:用户只需向Permit2合约授权一次,所有集成Permit2的应用均可共享该授权。
- 安全性提升:Permit2消息包含过期时间和唯一nonce,限制攻击窗口。
- 广泛兼容:支持所有ERC20代币,无论是否实现EIP-2612。
如何集成Permit2?
前端集成
前端需要获取用户签名并将其传递到交易中。签名必须符合EIP-712标准,使用Permit2定义的域和类型哈希。用户签署的EIP-712对象中的spender字段必须设置为消费合约的地址。
智能合约集成
智能合约集成相对简单。任何需要转账用户代币的函数只需接受Permit消息细节和对应的EIP-712签名。实际转账时,调用规范Permit2合约的permitTransferFrom()方法。该函数参数包括:
permit:Permit2消息详情,包含代币地址、最大金额、nonce和过期时间。transferDetails:转账接收人和金额(可小于签名金额)。owner:签署许可的代币持有者。signature:对应的EIP-712签名。
高级功能与应用
Permit2还支持多种高级功能,满足复杂应用场景:
- 自定义见证数据:将自定义数据附加到Permit2消息中,扩展签名验证范围。
- 批量转账:通过单个签名执行多个代币转账。
- 智能Nonces:使用存储槽位字段优化Gas消耗。
- 回调签名:支持EIP-1271,允许智能合约签署Permit2消息。
- Permit2授权模式:提供传统授权模型的灵活性,并增加过期时间优势。
示例与演示
一个简单的金库合约示例展示了Permit2的应用:用户使用Permit2存入ERC20代币,随后可提取。传统方式需要向金库授权并调用transferFrom(),而Permit2简化了这一流程。
测试用例部署了本地Permit2合约分叉,验证金库功能。EIP-712哈希和签名生成通常在前端或后端完成。
常见问题
1. Permit2适用于哪些代币?
Permit2支持所有ERC20代币,无论是否实现EIP-2612标准。它通过一次性授权和签名消息机制,扩展了签名授权的优势。
2. 集成Permit2需要修改现有合约吗?
集成Permit2需调整代币转账逻辑,调用Permit2合约的permitTransferFrom()方法。现有合约可能需升级,但改动相对简单。
3. Permit2如何提升安全性?
Permit2消息包含过期时间和唯一nonce,避免了无限期授权。即使协议被攻击,攻击者仅能在有限时间内操作代币。
4. Permit2的Gas成本如何?
Permit2通过共享授权和批量转账显著降低Gas成本。用户只需一次授权,后续交易无需重复操作。
5. 如何获取Permit2合约地址?
Permit2合约地址可在Uniswap官方公告或GitHub仓库中找到。确保使用官方地址以避免安全风险。
6. Permit2是否支持NFT?
Permit2专注于ERC20代币授权。Universal Router支持NFT兑换,但Permit2本身不处理NFT授权。
参考资源
Permit2作为代币授权的新标准,通过标准化和安全性优化,为DeFi应用带来了更高效的交互体验。随着更多项目的集成,它有望成为链上交易的基础设施核心。