Permit2 介绍及风险分析
概述
Uniswap 在去年推出了 Permit2 授权标准,用于改善传统的 ERC20 代币的授权体验,其更加节省 gas,比传统的 ERC20 授权更安全,也更加方便管理。本文将对 Permit2 授权标准进行介绍,并分析其中可能存在的安全风险。
Permit 介绍
在分析 Permit2 授权标准之前我们先了解 Permit 授权。
Permit 是在 ERC-2612 中提出的,用户可以提前在链下对授权的地址、数量等信息进行签名,无需上链,然后授权地址获得签名后即可调用代币合约的 Permit 函数获取授权,从而可以进行代币的转移。
USDC 中 Permit 函数实现:
Permit 首先会校验签名是否过期,然后将参数打包,校验签名合法性,校验通过则调用 _approve 函数进行授权。
Permit 授权方式需要代币合约实现 Permit 函数,而之前标准的 ERC20 代币则没有该方法,因此无法通过 Permit 的方式进行链下签名授权。
Permit2 介绍
Permit2 需要用户首先对 Permit2 合约进行传统的授权,授权后即可使用链下签名,将签署的 Permit2 签名传入智能合约的函数中,然后智能合约再调用 Permit2 合约,Permit2 合约验证了签名后调用代币合约的 transferFrom 函数进行转账。
用户只需要对 Permit2 合约授权一次,后续和其他智能合约交互时如果需要使用到授权过的代币,即可通过链下签名并传入相应的函数中进行交互,而无需每次都对不同的智能合约进行授权,当然这里的前提是交互的智能合约集成了 Permit2 合约。
Permit2 合约由两个合约组成,分别是 SignatureTransfer 合约以及 AllowanceTransfer 合约。SignatureTransfer 合约处理所有基于签名的转账。 AllowanceTransfer 合约处理代币的额度设置,允许支出者在指定的时间段内使用指定的金额。
在 SignatureTransfer 合约中主要的函数是 permitTransferFrom 函数,该函数使用签名消息转移代币,实现如下:
其中结构体 PermitTransferFrom 中存放着转移的代币地址,可转移的最大数量,nonce 以及最后期限:
而 SignatureTransferDetails 结构体中则存放着接受者的地址以及转移的数量:
然后调用内部函数 _permitTransferFrom,先后进行期限校验、数量校验、nonce 校验、签名校验,都通过后将代币转移给指定的地址:
- 星际资讯
免责声明:投资有风险,入市须谨慎。本资讯不作为投资建议。