【研报精选】Uniswap Permit2的设计思路

medium發佈於 2023-01-06更新於 2023-01-06

文章摘要

Uniswap 团队在去年十一月的时候公布了两个新合约,在 DEX 生态中抛出了一个新的组合,试着透过一站式的高度整合提供更好的用户体验,其中 Permit2 合约是达成这个目标的一个重要基础,本文将针对 Permit2 的设计与实作进行探讨。

Uniswap 团队在去年十一月的时候公布了两个新合约,在 DEX 生态中抛出了一个新的组合,试着透过一站式的高度整合提供更好的用户体验,其中 Permit2 合约是达成这个目标的一个重要基础,本文将针对 Permit2 的设计与实作进行探讨。

ERC20 授权痛点

用户在面对新的 Dapp 时,通常会面临以下几个关于 ERC20 代币授权的痛点

每个 Dapp 及每个 Token 都需要独立授权,意味着用户要发送授权交易到区块链,步骤繁琐且消耗手续费

为求方便,每次授权通常都给最大值 (uint256 max)

Dapp 合约若有漏洞被开采,用户需要尽快 revoke 授权,否则可能会丢失资产

为了解决上述问题,开发者提出 EIP-2612 使用 Permit 签名的形式来取代呼叫 approve(),此设计可以有效解决以上痛点,但许多市场主流的代币已经相当古老,而且合约是不可升级的设计,因此该方式并没有办法立即解决眼前的议题。

然而事情其实还是有转圆的馀地,虽然原生的代币不支援 permit,但如果能够先授权给一个独立的新合约,由该合约来做 permit 签章验证,那麽是否就达到了相同的目的?于是有了 Permit2 的诞生。

Permit2 — 外挂式的 Permit

Uniswap 的 Permit2 合约最主要的目是在解决 ERC20 授权的痛点,同时兼容无法升级的老旧代币合约。作法上主要是以一个外挂式的 permit 合约来实现,并具备以下特色

支援任意 ERC20 token,不论该 Token 本身是否支援 permit

支援 EIP-1271,合约钱包能够验证签章

支援 batch 呼叫

透过 nonce 机制允许用户 cancel 已经签出去的 pending permit

Permit2 实作

Permit2 继承了两个子合约,分别为 SignatureTransfer 及AllowanceTransfer。用户最一开始需要先授权代币给 Permit2 合约,而未来的代币转帐就可以由 Permit2 来进行验签及管理。

Permit2 定义了签章内容的各式资料结构,原则上都与 EIP-2612 中所定义的栏位大同小异,因此不另外做介绍。

SignatureTransfer (signature-based transfers)

用户可以提供一次性的转帐 permit 签章给 Dapp 使用,Dapp 合约呼叫 Permit2 进行转帐时夹带用户的 permit 签章,这类的场景即是由 SignatureTransfer 负责。

合约介面主要就是带入 transfer 相关参数以及 permit 签名,值得一提的是 witness 这个栏位,实际作用是一个保留给 Dapp 使用的签章栏位,可用于区分订单 id 或者是 swap hash,避免 permit 被恶意抢跑,例如我签了 100 USDC 的 permit 目的是想要 swap 换成 WETH,结果一个攻击者拿着我的 permit 签章执行了另一个 USDC <-> DOGE 的 swap。这部分主要看串接合约的实作逻辑来决定要如何利用 bytes32 witness 这个栏位。

AllowanceTransfer (signature-based approvals)

transfer with permit 的使用场景需要用户每一次都在线做 permit 签名,不过这样在线的要求对于有些应用场景并不适合,因此 Permit2 仍支援原本 ERC20 授权的使用场景,也就是用户先授权一个额度,拥有授权的合约可以直接呼叫 transferFrom(),而 AllowanceTransfer 作法上的差异主要是用户可以不用发交易呼叫 approve(),而是透过签章验证的方式来做额度授权。

介面的设计其实类似于 EIP-2612 的概念,除了基本的授权与转帐以外,也支援 cancel 以及归零的呼叫。

/// @notice legacy ERC20 approve function

function approve(address token, address spender, uint160 amount, uint48 expiration) external;

/// @notice approve with permit (single/batch)

function permit(address owner, PermitSingle memory permitSingle, bytes calldata signature) external;

function permit(address owner, PermitBatch memory permitBatch, bytes calldata signature) external;

/// @notice legacy ERC20 transferFrom function (single/batch)

function transferFrom(address from, address to, uint160 amount, address token) external;

function transferFrom(AllowanceTransferDetails[] calldata transferDetails) external;

/// @notice set allowance amount to zero

function lockdown(TokenSpenderPair[] calldata approvals) external;

/// @notice overwrite nonce to cancel pending permits

function invalidateNonces(address token, address spender, uint48 newNonce) external;

Uniswap 主导优势

其实类似于 Permit2 的设计概念存在许久,也有被一些 DEX 采用,不过 Permit2 在一开始的设定就是希望能成为代币授权的託管合约,并且能够广泛被各个 Dapp 串接使用,要能达成这个目的的前提是能够得到多数用户的信任与授权,而 Uniswap 在行业裡的角色实质上是有能力做到这样的号召力,一同发表的 Universal Router 就已经整合了 Pertmi2 合约,换句话说,用户若要使用新的 Universal Router,就需要先授权 Permit2 合约,拥有越多用户的代币授权,则越能够吸引其他 Dapp 来串接。

除此之外,若要乘载大量用户的代币授权,合约安全势必是一大信任的关键,Permit2 承袭了 Uniswap 的风格,采用不可升级的设计,同时由 Chainsecurity 与 ABDK 完成审计,并且附上完善的文件与 SDK,也发布了 bounty program,是相当成熟的开源合约。

过去 CEX 託管了用户的资产,有鉴于近期 FTX 事件及一连串的连锁效应,许多用户开始对中心化託管产生了不信任,而此时对于握有用户 token approval 的 DEX 则是绝佳的发挥机会,我认为,让用户跳脱传统中心化託管的模式,同时与用户体验及成本取得一个平衡,是 DEX 往下发展的一个重要的基石。

你可能也喜歡

SBF提出新代币偿还FTX受害者,但这可能实现吗?

摘要:据报道,正在服刑的FTX创始人萨姆·班克曼-弗里德(SBF)近期表达了通过发起一个新的代币项目来偿还FTX受害者的个人愿望。这一说法因极具话题性而引发关注,但其与法律现实存在巨大差距。 核心信息点: * 这只是SBF的个人希望,并非一个积极的、可行的计划。 * 背景是,美国上诉法院已于2026年6月12日维持了对SBF的25年刑期判决。 * 目前没有任何经过验证的、在法律上可行的代币项目存在。 文章分析指出,作为一名正在服长期刑期的重罪犯,SBF在运营公司、筹集资金、发行证券或管理代币项目方面面临显而易见的法律障碍。即使他个人相信新方案能偿还受害者,法院、监管机构、债权人或破产管理人也不太可能允许。 该言论之所以仍受关注,是因为FTX倒闭是加密货币历史上的标志性事件,任何关于偿还受害者或新计划的提及都会触动市场记忆。这同时也引出了一个更广泛的行业问题:失败的平台能否利用代币来弥补损失?在FTX的案例中,法律和声誉障碍远高于普通的重组故事。 因此,本文的立论点不应是SBF将推出代币,而应强调他个人幻想与法律现实之间的张力:即便司法系统已做出严厉判决,他仍 reportedly 设想一条基于代币的偿还路径。任何实际的偿还过程,仍将严格遵循法律程序、破产结构和债权人追偿机制,而非一个来自监狱牢房的想法。

bitcoinist5 小時前

SBF提出新代币偿还FTX受害者,但这可能实现吗?

bitcoinist5 小時前

贝莱德以BITA为代码推出备兑看涨比特币ETF

贝莱德推出了一款新的比特币ETF产品——iShares Bitcoin Premium Income ETF,交易代码为BITA。与单纯的现货比特币基金不同,该产品采用备兑看涨期权策略,旨在通过出售期权获得权利金收入,并向投资者提供每月派息,为寻求加密相关收益但不愿直接使用DeFi或离岸借贷产品的投资者提供了新选择。 这种策略意味着产品在比特币横盘或震荡市场中可能表现更佳,但在比特币价格快速上涨时,其收益可能会落后于单纯的现货持有。这并非产品缺陷,而是其设计核心:贝莱德将比特币波动性打包成一种收入策略,为更保守或注重收益的投资者提供了更接近传统期权ETF的产品形式。 BITA的推出表明比特币ETF市场正迅速超越单纯的现货产品,进入策略多样化阶段,如赚取溢价收入、对冲和结构化敞口等。这标志着比特币正逐渐被视作可整合进更广泛基金架构的市场要素,而不仅仅是孤立资产。 该产品主要吸引那些已接受比特币投资逻辑,但希望在经纪账户内获得更平滑、以收益为导向产品的投资者,以及寻求在不单纯依赖价格升值的情况下讨论比特币敞口的投资顾问。它并非现货比特币或IBIT的替代品,而是一种不同的工具。关键在于投资者是否理解其收益与上涨潜力之间的权衡。

bitcoinist7 小時前

贝莱德以BITA为代码推出备兑看涨比特币ETF

bitcoinist7 小時前

日本加息,为什么全世界都在紧张?

日本央行在2026年6月将政策利率提升至1%,这是自1995年来的首次。尽管1%的利率在主要经济体中并不高,但由于日本长期充当全球最低成本融资中心的特殊角色,此次加息引发了全球市场的广泛关注。 过去二十余年,日本近乎零的利率环境催生了大规模的日元套利交易。国际资本以极低成本借入日元,转而投资于全球高收益资产,如美国科技股和新兴市场债券,这为全球资产价格上涨提供了重要的流动性基础。日本加息意味着这一廉价资金源头开始收紧,可能引发全球资本的去杠杆化调整。 日本长期维持超低利率,源于其人口老龄化、长期通缩和高额政府债务等结构性约束。然而,疫情后全球通胀传导、国内工资持续增长(近年春斗涨薪均超5%)以及日元贬值压力,共同推动其货币政策转向。 市场担忧的核心并非当前1%的利率水平,而是日本持续三十年的超宽松货币政策框架发生根本性转变的趋势。这种变化将重塑全球套利交易的逻辑和风险资产的定价基础。不过,决定全球资本最终流向的关键,仍在于美日之间的利差变化。如果未来美联储进入降息周期而日本继续加息,两者货币政策差异的收窄可能对国际资本市场产生更深远的影响。 简言之,日本加息标志着全球最重要的低成本融资来源进入正常化进程,这可能引发建立在廉价日元资金之上的全球资本配置体系进行深度重估。

marsbit9 小時前

日本加息,为什么全世界都在紧张?

marsbit9 小時前

交易

現貨
合約
活动图片