区块链世界中,我们常需要授权(allowance)机制来让智能合约代我们花费代币。例如,在去中心化交易所(DEX)交易代币时,用户必须先授权交易合约可以从自己的钱包转出特定数量的代币。传统的 ERC-20 授权流程需要用户提交一笔 approve 交易,然后再提交实际的交换交易,流程繁琐且耗费额外的 Gas。然而,为了改善用户体验与安全性,以太坊社群提出了基于签名的授权机制 ——Permit(例如 EIP-2612)与进一步的 Permit2 方案。这些新机制允许用户透过链下签名(off-chain signature)来授权代币使用权,避免额外的链上交易。
在本篇文章中,我们将从基础概念出发,介绍传统 ERC-20 授权的原理与局限,再深入讲解 Permit 与 Permit2 的工作方式、优缺点,以及它们如何增进效率与安全。同时,我们也会分析相关的安全风险(特别是签名钓鱼攻击案例)并提供防护建议。希望使刚入门区块链或加密投资的新手,也能理解这些重要的技术演进。
在开始讨论 Permit 之前,先让我们了解传统 ERC-20 代币的授权模型是如何运作的,以及其中存在的问题。
ERC-20 是以太坊代币的标准,其中定义的 approve 和 transferFrom 函式提供了代币授权机制。所谓授权,是指代币持有人(owner)允许另一个帐户(通常是智能合约,称为spender)从自己的余额中代为转出一定数量的代币。基本流程如下:
透过上述双步骤模型,用户不需将私钥交给他人,就能让合约代操作资金。然而,这种传统模型也带来一些实际问题:
需要两次交易,体验不佳
当用户第一次在某应用使用某代币时,都得先进行一次独立的授权交易,然后才能进行真正的操作(例如交易、质押等)。这意味着用户在使用新 DApp 时,钱包会跳出两次确认,而且要支付额外的 Gas。对新手而言,这额外的一步骤容易造成困惑与不便。
授权管理分散
如果用户在多个 DApp 中使用同一代币(例如先在 Uniswap 交易,又到另一个 DeFi 协议存款),即使都是自己的代币,每个 DApp 仍要求分别的授权交易,导致重复授权浪费时间与费用。
且每个协议各自为政地要求授权,用户钱包很难统一管理。目前有一些工具(如 Revoke.cash、DeBank)能显示所有授权,但普通用户未必知晓;加上每次撤销也需要一笔链上交易完成,成本不低,因此很多旧的授权往往被遗忘。
无限额授权的风险
为了避免频繁授权交易,不少应用建议用户直接「无限额」授权,即授权 spender 可以支配钱包中该代币的全部余额,且不限时间。虽然这样用户后续无需再授权,但安全风险很高:一旦该 DApp 或合约被攻击,攻击者就能利用无限授权转走用户所有该代币。
上述问题促使开发者寻找更佳方案。理想情况是:用户只需一次签署意愿(最好不额外花 Gas),就能完成授权与操作,同时授权范围与时间应尽量受控,降低不必要的风险。在这背景下,ERC-20 Permit 应运而生。
Permit 这个构想最初由 快点 稳定币合约引入,后来标准化为 EIP-2612。简而言之,Permit 允许用户透过链下签名来授权代币转移,省去单独发送 approve 交易的麻烦。以下我们深入介绍其机制与特色。
Permit 是一种利用数位签章进行授权的机制。以 EIP-2612 的标准实现为例,每个支持 Permit 的 ERC-20 代币合约内部增加了一个 permit() 函式,大致如下:
功能许可(
地址所有者、地址花费者、
uint256 值,uint256 截止日期,
uint8 v、bytes32 r、bytes32 s
) 外部的;
其中 owner、spender、value 分别是授权的持有人、被授权者、额度数量,deadline 是签名期限,后面的 v, r, s 是签名数据(即 电子CDSA 签章的组成部分)。透过 Permit 机制,用户跳过了独立的 on-chain 授权步骤,只需签名(不用付 Gas)并在随后操作时附带该签名即完成授权,达到了「一次操作,双重效果」的目的。
Permit 使用流程(来源: Gate Learn 创作者 John)
相较传统 approve,Permit 省去一次链上交易,用户不再需要提前发出 approve 交易,节省了时间和 Gas 成本。并且提供更细粒度的授权控制,例如用户可签一个只允许花费 50 USDC、5 分钟内有效的 Permit,用于一次性操作。过期后即使签名未被用,攻击者也无法滥用,减少授权风险。目前许多 DeFi 协议(如去中心化交易所、借贷平台等)均已逐步支援 Permit 流程。知名例子包括 Uniswap V2/V3 流动性凭证代币、DAI、USDC 等均实装了 EIP-2612 标准,使其在各种操作中都可透过签名授权一步完成。
然而,Permit 最大的限制是必须由代币合约本身实现。如果一个 ERC-20 代币的开发者没有在合约中加入 permit () 方法(即不支持 EIP-2612),那该代币就无法使用签名授权。由于 EIP-2612 是在 2020 年提出,许多较早发行的代币并不具备这功能,而即便是之后的新代币也不见得都实装了它。这导致 Permit 的适用性受到限制:不支援的代币仍得沿用传统 approve 模式。
另外,用户钱包软体需要正确识别并显示 Permit 签名资讯(EIP-712 格式)。大多数主流钱包现在已支持,但仍有部分钱包或不够友善,可能仅显示原始资料而非人类可读讯息。这可能导致用户看不懂自己签了什么。如果钱包没有针对 EIP-2612 提供清晰界面,会降低用户对签名授权的理解。同时如果在平行部署(如不同链上同地址合约)情况下,签名可能在其它环境被重新使用。因此用户还需要确保签名中链 ID、合约地址都是当前环境,以免签给 A 链代币的许可被 B 链上相同地址合约滥用。
基本上,Permit 大幅改善了 ERC-20 授权的效率和灵活性,被视为 Gasless Approve 的重要里程碑。但它并非万能:需要代币支持,以及新的风险也随之而来。接着我们将看看 Uniswap 发布的 Permit2,如何在 Permit 基础上更进一步。
随着 Permit 机制的普及,一个新的问题出现:如何让不支援 Permit 的代币也享受签名授权的便利?为了解决这个问题,同时优化多种情境下的授权体验,Uniswap 团队在 2022 年推出了 Permit2。 Permit2 不是单一代币的功能,而是一个独立的授权管理智能合约。它的目的是成为各种代币授权的中介,提供统一、强化的授权功能。下面我们来剖析 Permit2 的原理与特色。
Permit2 可以理解为一个授权中继服务。核心思想是:用户对 Permit2 合约进行一次授权,之后由 Permit2 合约替用户管理对各应用的子授权。具体流程如下:
Permit2 授权流程示意。用户仅需针对每种代币执行一次最大额度的主授权给 Permit2,之后与各应用(Uniswap Universal Router 或其他协议)互动时,只需在交易中附带 Permit2 签名即可完成授权与转帐,无需额外的链上 approve。 Permit2 合约会验证签名并利用其持有的主授权执行转帐。 (来源:Introducing Permit2 & Universal Router)
透过上述模式,Permit2 将 EIP-2612 的签名授权概念推广到所有 ERC-20 代币,无论该代币本身是否实装 permit() 方法。只要用户愿意事先授权 Permit2 合约管理,就能用签名进行后续操作。值得一提的是,Uniswap 将 Permit2 设计为无主、不可升级的合约,已部署在以太坊主网及多条二层上,地址都相同。这意味着所有应用使用的其实是同一个 Permit2 实例,实现真正的「一次授权,多处通用」。
作为新一代授权系统,Permit2 不仅达成所有代币的签名授权,还提供了额外的功能来增进安全与易用性。主要特色包括:
授权自动过期
Permit2 的所有授权记录都可以设定时间戳过期。用户在签名时即可指定此子授权有效至何时。一旦超过期限,Permit2 将拒绝该签名,即便主授权还在。这有效解决了传统无限授权挂着不管的隐患。
一次性签名转移
Permit2 提供直接签名转帐模式,用户可以用签名授权直接完成某次代币转移给特定接收者,而无需事先设置 allowance。这适用于一次性的支付场景:用户签一个消息授权转 100 个代币给好友地址,好友或中介即可拿此签名从用户处扣款。一旦执行,签名作废,不留长期许可。
批次授权与转帐
Permit2 考虑了效率,允许批量处理多笔授权或多笔转帐。例如用户可一份签名授权多种代币不同额度给同一协议;或在一次交易里执行多个代币的转帐操作。对高级用户而言,这可节省更多 Gas 和步骤。
批量撤销
除了批量授权,也可以在一次交易里批量撤销多个代币/多个应用的许可。这对于清理历史授权非常便利。
额外资料见证
Permit2 还提供 permitWitnessTransferFrom 等介面,允许在签名中携带其他见证资料进行校验。这可用于更复杂的场景,例如订单签章中夹带特定交易细节,避免签名被移花接木在不同情境下使用。
透过这些功能,Permit2 不仅重现了 Permit 的所有好处,还加强了灵活性与安全控制。尤其自动过期与一次性签名转帐,使最小必要授权成为常态,降低长期风险。
总结而言,Permit2 可视为对传统 Permit 机制的扩充与补强,两者的主要差异包括:
自 Uniswap 推出 Permit2 以来,已有多个项目开始整合这一机制,加速了行业标准化的趋势 。根据 Dune Analytics 的最新数据,截至 2025 年 4 月,已有超过 310 万个以太坊主网地址对 Permit2 合约授予过授权。这反映出该合约的使用范围相当广。
Permit2 的应用生态与采用情况(来源:Dune Analytics)
例如,Uniswap 自己就将 Permit2 集成到其 Universal Router 中,实现单笔交易完成多代币及 NFT 交换。透过 Universal Router,用户能在一次交易中串联多步操作,像是用三种代币交换两种目标代币并购买 NFT,而中途所有授权需求都由 Permit2 签名满足。这极大简化了操作流程,也降低总 Gas 成本,是 Permit2 提升 UX 的直接体现。
另外,随着 Permit2 开源并在各链部署,越来越多钱包与 DApp 工具开始支援 Permit2。Revoke.cash 等安全工具已更新服务,让用户能检视和撤销 Permit2 的授权纪录。 Matcha 也引入了 Permit2 的 SignatureTransfer 模组,实现了「一次性授权」机制。
尽管有上述进展,Permit2 的普及仍面临挑战。一方面,开发者需要额外时间整合:相较直接用 ERC-20 的 approve,对接 Permit2 需处理签名逻辑,增加了开发负担。小型团队可能因此却步。另一方面,用户教育也很重要:许多使用 Permit2 的 DApp 需要教导用户签名意义。目前看来,Permit2 的一体化优势足以抵消这些摩擦,但全面渗透仍需时间推动。
回顾过去 8 年,ERC‑20 授权机制从「多笔交易」走向「无感签名」、再到「智能帐户」,每一次迭代,都试图在「用户体验(交易/签名次数)」与「Gas 成本」之间取得更佳平衡。以下是各技术对比:
目前除了 Permit2,比较值得关注的新兴授权方案是 Session Key(会话金钥)及 ERC-4337 帐户抽象,都提供了不同的解决思路。
Session Key 比较特别,他其实不算授权模型,而是属于「钱包/帐户层」的暂时金钥机制——它并不改动代币合约,而是让钱包产生一组短期、限额的临时私钥,只能执行特定操作。适用于游戏道具支付、单次授权的微额支付等场景。它的重点在于降低单次授权风险,是为了用户临时交互而量身打造,不同于直接改合约的 Permit/Permit2。
ERC-4337 则将授权逻辑直接内建在智能帐户中,允许使用者自行设定授权条件,甚至省略传统的授权步骤,透过更灵活的 UserOperation 与 Paymaster 机制,达到更佳的安全性与使用体验。
从未来发展趋势来看,这些不同方案可能会并存,短期内 Permit2 将持续成为各类新兴 DApp 的标准方案,透过一次性授权提高使用流畅度,并随之推动安全教育与工具支援,降低钓鱼风险。中期而言,随着 ERC-4337 等帐户抽象的普及与更多 Layer 2 和主网支援,使用者可望摆脱传统 ERC-20 approve 限制,更精细且智能化地管理授权条件,使 Permit2 的需求逐渐降低。
长期愿景是达到如 Web2 般直觉且无感的授权体验,用户点击按钮即可自动完成背后所需的授权操作,仅在风险较高时才收到明确提示。为达成此目标,底层协议、钱包和 DApp 需要持续协作创新与整合。 Permit2 是这个过渡过程中的重要一步,但要达到理想状态仍有漫长的路要走。在这过程中,社群和开发者应保持务实的态度,充分理解各方案的优缺点,协同推动更安全、便利的授权环境。
整体而言,Permit2 提供了当前可即刻运用的解决方案,而 Session Key 和 ERC-4337 则代表了更长期且本质上的授权机制改进方向。
任何新技术都伴随新的风险。 Permit 和 Permit2 虽提升了效率,却也引入了签名授权被攻击的潜在风险。
在 Permit2(以及 EIP‑2612 Permit)等签名授权方案中,为了降低签名滥用与重放攻击风险,核心合约设计了多层防护机制:
Permit2 为每组 (owner, token, spender) 维护独立的 nonce 计数器,用户每次签名后,对应的 nonce 就递增。攻击者手中持有旧签名时,只要合约端 nonce 已更新,该签名即失效,无法再被重放执行。
签名资料中必须包含 deadline
栏位,合约在验证签名时会检查当前区块时间是否 ≤ deadline。一旦过期,即使签名与 nonce 正确,也会被拒绝执行,避免长期授权造成的潜在损失。
Permit2 签名可指定「最大授权额度」,合约在转帐前会比较实际操作数量是否 ≤ 签名中允许的上限。单次操作后,不会自动消耗所有额度,用户可分批使用,降低一次性全额授权风险。
除了持续授权(allowance)模式,Permit2 同时支援「一次性签名转帐」(SignatureTransfer),该签名在执行后即失效,不留后续授权。在一次性支付场景下,签名只对本次转帐生效,再也不会被重放或滥用。
透过上述多重机制,签名授权在提高 UX 与节省 Gas 的同时,也在合约层面大幅降低了「重放」、「过度授权」与「长期失效」等典型风险。
不过,即便合约端具备严密设计,社交工程(又称「钓鱼」)仍是最难防的环节。接下来,我们将用常见钓鱼手法,说明攻击者如何诱导用户在毫无察觉的情况下,提交恶意签名,滥用 Permit2 授权,并提出防范建议。
签名钓鱼是指攻击者诱骗受害者签署特定讯息,以取得对方资产控制权。在传统模式下,攻击者可能引诱你执行恶意合约或提交恶意交易;而在 Permit 时代,签一个恶意授权就足以让币被转走。以下说明可能的攻击过程:
受害者误点击了一个仿冒的知名 DEX 网站(钓鱼网站)。该假网站在用户尝试操作时,弹出了一个钱包签名请求,宣称是「确认登入」或其他看似正常的用途。但实际上,这请求是一份 Permit2 授权签名:内容是授权攻击者的合约可不限额度提取受害者的 USDC,期限较长。
受害者因缺乏警觉直接点击签名。此时,他并未花费任何 Gas,链上也尚未有动作,因此毫无异常迹象。
攻击者拿到签名后,立刻呼叫了 Permit2 合约的 permit () 函式,提交该签名。 Permit2 合约验证通过后,在受害者地址下记录了对攻击者合约的授权许可(相当于受害者对攻击者合约执行了一次 approve,但这步是攻击者替他完成的)。这步操作依然可能不被受害者察觉,因为从受害者观点,他的钱包没发生任何支出,只是区块链上自己的代币 Allowance 映射被更新了。
随后,攻击者立即由自己的地址发起 transferFrom (受害者,攻击者地址,若干金额) 的交易,透过刚才 Permit2 的许可,成功将受害者钱包里的 USDC 转走。受害者此时才惊觉资产被盗,但为时已晚。
在上述攻击中,用户完全没有执行任何明显的「转帐」或「授权」交易,但资产却莫名其妙地转出。关键就在于签名本身成了授权。攻击者精心伪装签名请求,使其看似与一般的操作无异,让人放下戒心。然而,一旦签署,后果就如同把资产的门锁钥匙交给了对方。
更恶劣的是,一些攻击者会使用技术手段来提高隐蔽性。例如,攻击者会利用了以太坊的 CREATE2 机制,每次钓鱼为每个受害者生成独一无二的恶意合约地址。这使传统黑名单难以及时辨识,因为每次攻击地址都不同。
大部分近年来的钓鱼盗币事件都与签名授权有关。例如,Scam Sniffer 2024 年初统计,一个月内就有超过 5500 万美元的资产因这类签名钓鱼被盗。 Permit2 启用后,攻击者更加积极诱导用户签署 Permit/Permit2 许可,导致短时间内许多用户中招。可见,签名授权一旦被滥用,杀伤力巨大且不易被察觉。
传统的恶意授权需要诱导用户执行一笔链上交易,在钱包中往往明显提示「你正在给 XXX 授权使用你的代币」并需支付 Gas,稍有经验的用户可能警觉。而签名请求在钱包介面中可能被描述为「资料签名要求」而非金钱行为,用户往往降低戒心。此外签名不耗 Gas,使得攻击尝试成本低,攻击者可以大规模发起钓鱼而不担心费用损失,只要有少数成功就赚到了。
另外,不同钱包对 EIP-712 讯息的显示差异很大。一些现代钱包(如 MetaMask 新版)会解析出字段,例如提示「授权某合约花费你多少某代币」,但也有不少钱包仅显示十六进制资料或简单描述,使一般用户难以判断真伪。攻击者会利用这点,在讯息中塞入欺骗性的说明(例如假装是 NFT Mint 签名),让人误签。
由于签名授权不会立即体现在用户资产变化上,受害者往往不立即察觉。而攻击者可以选择最佳时机下手。例如,一些攻击者拿到签名后并不立刻执行,而是等待受害者钱包有更多资产或在特定时机再用,使追查更困难。另外,如果签名有较长的有效期,攻击者甚至可以等待价格波动后再执行,以获取更大利益(这在金融上称为给攻击者一个免费期权,因此 Permit 签名多半要求带上短 deadline 以降低此风险。
特别针对 Permit2,因其允许一份签名授权多个代币,这对用户阅读理解增加了困难。假设一个钓鱼网站请你签一个 Permit2 消息,介面上可能只强调其中一两种代币用途,却在同一签名中暗藏对其他代币的大额授权。如果钱包没有列出全部细节,用户很容易忽略。此外,有些恶意签名甚至授权的是所谓「WalletGuard」之类看似正当的合约名称,实则是攻击者部署的合约,专门用来骗取许可。
牢记签名 = 盖章同意的原则,不要因为签名不花 Gas 就掉以轻心。每次钱包弹出签名要求时,都应仔细阅读钱包提供的讯息明细。确认发起签名的网站或 DApp 是否可信,讯息内容是否与自己预期操作一致。例如,如果你只是要登入网站,那签名内容应该是人类可读的登入讯息(许多 DApp 登入会用特定字串),而不是一堆代币地址和数字。
此外,确保使用的钱包软体能支援 EIP-712 资料显示。目前主流的 MetaMask、TrustWallet、Ledger Live 等都在改进显示签名内容的体验。例如 MetaMask 已能将常见许可讯息解析成人话。如果你的钱包在签名时只秀出一长串16进位数据,建议更换或更新。硬体钱包用户也要注意固件更新,以支援新格式,否则萤幕上可能无法正确显示资讯。
不论是 Permit 签名或 Permit2,多数情况下你可以自行调整授权参数。不要签无限额(value = 2^256-1)除非非常必要,改为仅授权实际所需数量再稍留余裕即可。也不要将 deadline 设得过长。这样即使签名意外落入他人之手,能造成的损失也有限,过期后签名失效。
养成习惯,定期使用工具(如 Revoke.cash、Etherscan Token Approval、各钱包内建功能)查看自己地址对外授权情况,包括传统 approve 和 Permit2 许可。如果发现异常或不再需要的授权,及时撤销。对于 Permit2,撤销需注意两层:一是主授权(你对 Permit2 合约本身的 approve,可考虑在不用时将其设 0);二是子授权(Permit2 代你给各 DApp 的许可,多数有自动过期,但如有效期很长,也可以透过工具提前终止)。尤其如果你怀疑曾签署可疑 Permit,最安全的做法是立刻调整 nonce:可以对同一 spender 签发一个新的 permit(哪怕给 0 额度),以占用掉攻击者手中的旧签名的 nonce,使其作废。
对于不熟悉的网站或应用,一定提高警觉。不随意点击来路不明的连结,尤其是社群平台上的广告或私讯提供的「福利」、「mint 活动」等链接。许多钓鱼就是透过冒充官方帐号发布虚假活动连结,一旦连入就诱导签名。养成习惯直接输入常用 DApp 官方网址,或使用书签,避免被假网站鱼目混珠。
总而言之,权衡方便与安全很重要。 Permit 类技术固然便利,但用户端的风险防范不能松懈。随着环境成熟,钱包产品和浏览器插件也在开发针对签名钓鱼的防护,例如有的会在你签名包含巨大金额时警示。未来希望在技术与教育双方面共同降低此类攻击的发生。
从传统 ERC-20 授权模型的不足,到 Permit 的诞生,再到 Uniswap Permit2 的创新,我们见证了以太坊生态为改善用户体验和安全性所做的努力。 Permit2 通过链下签名大幅简化了代币授权流程,减少重复授权和无限许可的风险,同时引入了过期机制和批次操作等实用功能。然而,新机制也伴随着新的责任——用户需要提升安全意识,钱包与 DApp 需要协同保护用户免受签名攻击。未来,随着帐户抽象等更进一步的技术发展,代币授权管理有望变得更加无感且安全。
Mời người khác bỏ phiếu
区块链世界中,我们常需要授权(allowance)机制来让智能合约代我们花费代币。例如,在去中心化交易所(DEX)交易代币时,用户必须先授权交易合约可以从自己的钱包转出特定数量的代币。传统的 ERC-20 授权流程需要用户提交一笔 approve 交易,然后再提交实际的交换交易,流程繁琐且耗费额外的 Gas。然而,为了改善用户体验与安全性,以太坊社群提出了基于签名的授权机制 ——Permit(例如 EIP-2612)与进一步的 Permit2 方案。这些新机制允许用户透过链下签名(off-chain signature)来授权代币使用权,避免额外的链上交易。
在本篇文章中,我们将从基础概念出发,介绍传统 ERC-20 授权的原理与局限,再深入讲解 Permit 与 Permit2 的工作方式、优缺点,以及它们如何增进效率与安全。同时,我们也会分析相关的安全风险(特别是签名钓鱼攻击案例)并提供防护建议。希望使刚入门区块链或加密投资的新手,也能理解这些重要的技术演进。
在开始讨论 Permit 之前,先让我们了解传统 ERC-20 代币的授权模型是如何运作的,以及其中存在的问题。
ERC-20 是以太坊代币的标准,其中定义的 approve 和 transferFrom 函式提供了代币授权机制。所谓授权,是指代币持有人(owner)允许另一个帐户(通常是智能合约,称为spender)从自己的余额中代为转出一定数量的代币。基本流程如下:
透过上述双步骤模型,用户不需将私钥交给他人,就能让合约代操作资金。然而,这种传统模型也带来一些实际问题:
需要两次交易,体验不佳
当用户第一次在某应用使用某代币时,都得先进行一次独立的授权交易,然后才能进行真正的操作(例如交易、质押等)。这意味着用户在使用新 DApp 时,钱包会跳出两次确认,而且要支付额外的 Gas。对新手而言,这额外的一步骤容易造成困惑与不便。
授权管理分散
如果用户在多个 DApp 中使用同一代币(例如先在 Uniswap 交易,又到另一个 DeFi 协议存款),即使都是自己的代币,每个 DApp 仍要求分别的授权交易,导致重复授权浪费时间与费用。
且每个协议各自为政地要求授权,用户钱包很难统一管理。目前有一些工具(如 Revoke.cash、DeBank)能显示所有授权,但普通用户未必知晓;加上每次撤销也需要一笔链上交易完成,成本不低,因此很多旧的授权往往被遗忘。
无限额授权的风险
为了避免频繁授权交易,不少应用建议用户直接「无限额」授权,即授权 spender 可以支配钱包中该代币的全部余额,且不限时间。虽然这样用户后续无需再授权,但安全风险很高:一旦该 DApp 或合约被攻击,攻击者就能利用无限授权转走用户所有该代币。
上述问题促使开发者寻找更佳方案。理想情况是:用户只需一次签署意愿(最好不额外花 Gas),就能完成授权与操作,同时授权范围与时间应尽量受控,降低不必要的风险。在这背景下,ERC-20 Permit 应运而生。
Permit 这个构想最初由 快点 稳定币合约引入,后来标准化为 EIP-2612。简而言之,Permit 允许用户透过链下签名来授权代币转移,省去单独发送 approve 交易的麻烦。以下我们深入介绍其机制与特色。
Permit 是一种利用数位签章进行授权的机制。以 EIP-2612 的标准实现为例,每个支持 Permit 的 ERC-20 代币合约内部增加了一个 permit() 函式,大致如下:
功能许可(
地址所有者、地址花费者、
uint256 值,uint256 截止日期,
uint8 v、bytes32 r、bytes32 s
) 外部的;
其中 owner、spender、value 分别是授权的持有人、被授权者、额度数量,deadline 是签名期限,后面的 v, r, s 是签名数据(即 电子CDSA 签章的组成部分)。透过 Permit 机制,用户跳过了独立的 on-chain 授权步骤,只需签名(不用付 Gas)并在随后操作时附带该签名即完成授权,达到了「一次操作,双重效果」的目的。
Permit 使用流程(来源: Gate Learn 创作者 John)
相较传统 approve,Permit 省去一次链上交易,用户不再需要提前发出 approve 交易,节省了时间和 Gas 成本。并且提供更细粒度的授权控制,例如用户可签一个只允许花费 50 USDC、5 分钟内有效的 Permit,用于一次性操作。过期后即使签名未被用,攻击者也无法滥用,减少授权风险。目前许多 DeFi 协议(如去中心化交易所、借贷平台等)均已逐步支援 Permit 流程。知名例子包括 Uniswap V2/V3 流动性凭证代币、DAI、USDC 等均实装了 EIP-2612 标准,使其在各种操作中都可透过签名授权一步完成。
然而,Permit 最大的限制是必须由代币合约本身实现。如果一个 ERC-20 代币的开发者没有在合约中加入 permit () 方法(即不支持 EIP-2612),那该代币就无法使用签名授权。由于 EIP-2612 是在 2020 年提出,许多较早发行的代币并不具备这功能,而即便是之后的新代币也不见得都实装了它。这导致 Permit 的适用性受到限制:不支援的代币仍得沿用传统 approve 模式。
另外,用户钱包软体需要正确识别并显示 Permit 签名资讯(EIP-712 格式)。大多数主流钱包现在已支持,但仍有部分钱包或不够友善,可能仅显示原始资料而非人类可读讯息。这可能导致用户看不懂自己签了什么。如果钱包没有针对 EIP-2612 提供清晰界面,会降低用户对签名授权的理解。同时如果在平行部署(如不同链上同地址合约)情况下,签名可能在其它环境被重新使用。因此用户还需要确保签名中链 ID、合约地址都是当前环境,以免签给 A 链代币的许可被 B 链上相同地址合约滥用。
基本上,Permit 大幅改善了 ERC-20 授权的效率和灵活性,被视为 Gasless Approve 的重要里程碑。但它并非万能:需要代币支持,以及新的风险也随之而来。接着我们将看看 Uniswap 发布的 Permit2,如何在 Permit 基础上更进一步。
随着 Permit 机制的普及,一个新的问题出现:如何让不支援 Permit 的代币也享受签名授权的便利?为了解决这个问题,同时优化多种情境下的授权体验,Uniswap 团队在 2022 年推出了 Permit2。 Permit2 不是单一代币的功能,而是一个独立的授权管理智能合约。它的目的是成为各种代币授权的中介,提供统一、强化的授权功能。下面我们来剖析 Permit2 的原理与特色。
Permit2 可以理解为一个授权中继服务。核心思想是:用户对 Permit2 合约进行一次授权,之后由 Permit2 合约替用户管理对各应用的子授权。具体流程如下:
Permit2 授权流程示意。用户仅需针对每种代币执行一次最大额度的主授权给 Permit2,之后与各应用(Uniswap Universal Router 或其他协议)互动时,只需在交易中附带 Permit2 签名即可完成授权与转帐,无需额外的链上 approve。 Permit2 合约会验证签名并利用其持有的主授权执行转帐。 (来源:Introducing Permit2 & Universal Router)
透过上述模式,Permit2 将 EIP-2612 的签名授权概念推广到所有 ERC-20 代币,无论该代币本身是否实装 permit() 方法。只要用户愿意事先授权 Permit2 合约管理,就能用签名进行后续操作。值得一提的是,Uniswap 将 Permit2 设计为无主、不可升级的合约,已部署在以太坊主网及多条二层上,地址都相同。这意味着所有应用使用的其实是同一个 Permit2 实例,实现真正的「一次授权,多处通用」。
作为新一代授权系统,Permit2 不仅达成所有代币的签名授权,还提供了额外的功能来增进安全与易用性。主要特色包括:
授权自动过期
Permit2 的所有授权记录都可以设定时间戳过期。用户在签名时即可指定此子授权有效至何时。一旦超过期限,Permit2 将拒绝该签名,即便主授权还在。这有效解决了传统无限授权挂着不管的隐患。
一次性签名转移
Permit2 提供直接签名转帐模式,用户可以用签名授权直接完成某次代币转移给特定接收者,而无需事先设置 allowance。这适用于一次性的支付场景:用户签一个消息授权转 100 个代币给好友地址,好友或中介即可拿此签名从用户处扣款。一旦执行,签名作废,不留长期许可。
批次授权与转帐
Permit2 考虑了效率,允许批量处理多笔授权或多笔转帐。例如用户可一份签名授权多种代币不同额度给同一协议;或在一次交易里执行多个代币的转帐操作。对高级用户而言,这可节省更多 Gas 和步骤。
批量撤销
除了批量授权,也可以在一次交易里批量撤销多个代币/多个应用的许可。这对于清理历史授权非常便利。
额外资料见证
Permit2 还提供 permitWitnessTransferFrom 等介面,允许在签名中携带其他见证资料进行校验。这可用于更复杂的场景,例如订单签章中夹带特定交易细节,避免签名被移花接木在不同情境下使用。
透过这些功能,Permit2 不仅重现了 Permit 的所有好处,还加强了灵活性与安全控制。尤其自动过期与一次性签名转帐,使最小必要授权成为常态,降低长期风险。
总结而言,Permit2 可视为对传统 Permit 机制的扩充与补强,两者的主要差异包括:
自 Uniswap 推出 Permit2 以来,已有多个项目开始整合这一机制,加速了行业标准化的趋势 。根据 Dune Analytics 的最新数据,截至 2025 年 4 月,已有超过 310 万个以太坊主网地址对 Permit2 合约授予过授权。这反映出该合约的使用范围相当广。
Permit2 的应用生态与采用情况(来源:Dune Analytics)
例如,Uniswap 自己就将 Permit2 集成到其 Universal Router 中,实现单笔交易完成多代币及 NFT 交换。透过 Universal Router,用户能在一次交易中串联多步操作,像是用三种代币交换两种目标代币并购买 NFT,而中途所有授权需求都由 Permit2 签名满足。这极大简化了操作流程,也降低总 Gas 成本,是 Permit2 提升 UX 的直接体现。
另外,随着 Permit2 开源并在各链部署,越来越多钱包与 DApp 工具开始支援 Permit2。Revoke.cash 等安全工具已更新服务,让用户能检视和撤销 Permit2 的授权纪录。 Matcha 也引入了 Permit2 的 SignatureTransfer 模组,实现了「一次性授权」机制。
尽管有上述进展,Permit2 的普及仍面临挑战。一方面,开发者需要额外时间整合:相较直接用 ERC-20 的 approve,对接 Permit2 需处理签名逻辑,增加了开发负担。小型团队可能因此却步。另一方面,用户教育也很重要:许多使用 Permit2 的 DApp 需要教导用户签名意义。目前看来,Permit2 的一体化优势足以抵消这些摩擦,但全面渗透仍需时间推动。
回顾过去 8 年,ERC‑20 授权机制从「多笔交易」走向「无感签名」、再到「智能帐户」,每一次迭代,都试图在「用户体验(交易/签名次数)」与「Gas 成本」之间取得更佳平衡。以下是各技术对比:
目前除了 Permit2,比较值得关注的新兴授权方案是 Session Key(会话金钥)及 ERC-4337 帐户抽象,都提供了不同的解决思路。
Session Key 比较特别,他其实不算授权模型,而是属于「钱包/帐户层」的暂时金钥机制——它并不改动代币合约,而是让钱包产生一组短期、限额的临时私钥,只能执行特定操作。适用于游戏道具支付、单次授权的微额支付等场景。它的重点在于降低单次授权风险,是为了用户临时交互而量身打造,不同于直接改合约的 Permit/Permit2。
ERC-4337 则将授权逻辑直接内建在智能帐户中,允许使用者自行设定授权条件,甚至省略传统的授权步骤,透过更灵活的 UserOperation 与 Paymaster 机制,达到更佳的安全性与使用体验。
从未来发展趋势来看,这些不同方案可能会并存,短期内 Permit2 将持续成为各类新兴 DApp 的标准方案,透过一次性授权提高使用流畅度,并随之推动安全教育与工具支援,降低钓鱼风险。中期而言,随着 ERC-4337 等帐户抽象的普及与更多 Layer 2 和主网支援,使用者可望摆脱传统 ERC-20 approve 限制,更精细且智能化地管理授权条件,使 Permit2 的需求逐渐降低。
长期愿景是达到如 Web2 般直觉且无感的授权体验,用户点击按钮即可自动完成背后所需的授权操作,仅在风险较高时才收到明确提示。为达成此目标,底层协议、钱包和 DApp 需要持续协作创新与整合。 Permit2 是这个过渡过程中的重要一步,但要达到理想状态仍有漫长的路要走。在这过程中,社群和开发者应保持务实的态度,充分理解各方案的优缺点,协同推动更安全、便利的授权环境。
整体而言,Permit2 提供了当前可即刻运用的解决方案,而 Session Key 和 ERC-4337 则代表了更长期且本质上的授权机制改进方向。
任何新技术都伴随新的风险。 Permit 和 Permit2 虽提升了效率,却也引入了签名授权被攻击的潜在风险。
在 Permit2(以及 EIP‑2612 Permit)等签名授权方案中,为了降低签名滥用与重放攻击风险,核心合约设计了多层防护机制:
Permit2 为每组 (owner, token, spender) 维护独立的 nonce 计数器,用户每次签名后,对应的 nonce 就递增。攻击者手中持有旧签名时,只要合约端 nonce 已更新,该签名即失效,无法再被重放执行。
签名资料中必须包含 deadline
栏位,合约在验证签名时会检查当前区块时间是否 ≤ deadline。一旦过期,即使签名与 nonce 正确,也会被拒绝执行,避免长期授权造成的潜在损失。
Permit2 签名可指定「最大授权额度」,合约在转帐前会比较实际操作数量是否 ≤ 签名中允许的上限。单次操作后,不会自动消耗所有额度,用户可分批使用,降低一次性全额授权风险。
除了持续授权(allowance)模式,Permit2 同时支援「一次性签名转帐」(SignatureTransfer),该签名在执行后即失效,不留后续授权。在一次性支付场景下,签名只对本次转帐生效,再也不会被重放或滥用。
透过上述多重机制,签名授权在提高 UX 与节省 Gas 的同时,也在合约层面大幅降低了「重放」、「过度授权」与「长期失效」等典型风险。
不过,即便合约端具备严密设计,社交工程(又称「钓鱼」)仍是最难防的环节。接下来,我们将用常见钓鱼手法,说明攻击者如何诱导用户在毫无察觉的情况下,提交恶意签名,滥用 Permit2 授权,并提出防范建议。
签名钓鱼是指攻击者诱骗受害者签署特定讯息,以取得对方资产控制权。在传统模式下,攻击者可能引诱你执行恶意合约或提交恶意交易;而在 Permit 时代,签一个恶意授权就足以让币被转走。以下说明可能的攻击过程:
受害者误点击了一个仿冒的知名 DEX 网站(钓鱼网站)。该假网站在用户尝试操作时,弹出了一个钱包签名请求,宣称是「确认登入」或其他看似正常的用途。但实际上,这请求是一份 Permit2 授权签名:内容是授权攻击者的合约可不限额度提取受害者的 USDC,期限较长。
受害者因缺乏警觉直接点击签名。此时,他并未花费任何 Gas,链上也尚未有动作,因此毫无异常迹象。
攻击者拿到签名后,立刻呼叫了 Permit2 合约的 permit () 函式,提交该签名。 Permit2 合约验证通过后,在受害者地址下记录了对攻击者合约的授权许可(相当于受害者对攻击者合约执行了一次 approve,但这步是攻击者替他完成的)。这步操作依然可能不被受害者察觉,因为从受害者观点,他的钱包没发生任何支出,只是区块链上自己的代币 Allowance 映射被更新了。
随后,攻击者立即由自己的地址发起 transferFrom (受害者,攻击者地址,若干金额) 的交易,透过刚才 Permit2 的许可,成功将受害者钱包里的 USDC 转走。受害者此时才惊觉资产被盗,但为时已晚。
在上述攻击中,用户完全没有执行任何明显的「转帐」或「授权」交易,但资产却莫名其妙地转出。关键就在于签名本身成了授权。攻击者精心伪装签名请求,使其看似与一般的操作无异,让人放下戒心。然而,一旦签署,后果就如同把资产的门锁钥匙交给了对方。
更恶劣的是,一些攻击者会使用技术手段来提高隐蔽性。例如,攻击者会利用了以太坊的 CREATE2 机制,每次钓鱼为每个受害者生成独一无二的恶意合约地址。这使传统黑名单难以及时辨识,因为每次攻击地址都不同。
大部分近年来的钓鱼盗币事件都与签名授权有关。例如,Scam Sniffer 2024 年初统计,一个月内就有超过 5500 万美元的资产因这类签名钓鱼被盗。 Permit2 启用后,攻击者更加积极诱导用户签署 Permit/Permit2 许可,导致短时间内许多用户中招。可见,签名授权一旦被滥用,杀伤力巨大且不易被察觉。
传统的恶意授权需要诱导用户执行一笔链上交易,在钱包中往往明显提示「你正在给 XXX 授权使用你的代币」并需支付 Gas,稍有经验的用户可能警觉。而签名请求在钱包介面中可能被描述为「资料签名要求」而非金钱行为,用户往往降低戒心。此外签名不耗 Gas,使得攻击尝试成本低,攻击者可以大规模发起钓鱼而不担心费用损失,只要有少数成功就赚到了。
另外,不同钱包对 EIP-712 讯息的显示差异很大。一些现代钱包(如 MetaMask 新版)会解析出字段,例如提示「授权某合约花费你多少某代币」,但也有不少钱包仅显示十六进制资料或简单描述,使一般用户难以判断真伪。攻击者会利用这点,在讯息中塞入欺骗性的说明(例如假装是 NFT Mint 签名),让人误签。
由于签名授权不会立即体现在用户资产变化上,受害者往往不立即察觉。而攻击者可以选择最佳时机下手。例如,一些攻击者拿到签名后并不立刻执行,而是等待受害者钱包有更多资产或在特定时机再用,使追查更困难。另外,如果签名有较长的有效期,攻击者甚至可以等待价格波动后再执行,以获取更大利益(这在金融上称为给攻击者一个免费期权,因此 Permit 签名多半要求带上短 deadline 以降低此风险。
特别针对 Permit2,因其允许一份签名授权多个代币,这对用户阅读理解增加了困难。假设一个钓鱼网站请你签一个 Permit2 消息,介面上可能只强调其中一两种代币用途,却在同一签名中暗藏对其他代币的大额授权。如果钱包没有列出全部细节,用户很容易忽略。此外,有些恶意签名甚至授权的是所谓「WalletGuard」之类看似正当的合约名称,实则是攻击者部署的合约,专门用来骗取许可。
牢记签名 = 盖章同意的原则,不要因为签名不花 Gas 就掉以轻心。每次钱包弹出签名要求时,都应仔细阅读钱包提供的讯息明细。确认发起签名的网站或 DApp 是否可信,讯息内容是否与自己预期操作一致。例如,如果你只是要登入网站,那签名内容应该是人类可读的登入讯息(许多 DApp 登入会用特定字串),而不是一堆代币地址和数字。
此外,确保使用的钱包软体能支援 EIP-712 资料显示。目前主流的 MetaMask、TrustWallet、Ledger Live 等都在改进显示签名内容的体验。例如 MetaMask 已能将常见许可讯息解析成人话。如果你的钱包在签名时只秀出一长串16进位数据,建议更换或更新。硬体钱包用户也要注意固件更新,以支援新格式,否则萤幕上可能无法正确显示资讯。
不论是 Permit 签名或 Permit2,多数情况下你可以自行调整授权参数。不要签无限额(value = 2^256-1)除非非常必要,改为仅授权实际所需数量再稍留余裕即可。也不要将 deadline 设得过长。这样即使签名意外落入他人之手,能造成的损失也有限,过期后签名失效。
养成习惯,定期使用工具(如 Revoke.cash、Etherscan Token Approval、各钱包内建功能)查看自己地址对外授权情况,包括传统 approve 和 Permit2 许可。如果发现异常或不再需要的授权,及时撤销。对于 Permit2,撤销需注意两层:一是主授权(你对 Permit2 合约本身的 approve,可考虑在不用时将其设 0);二是子授权(Permit2 代你给各 DApp 的许可,多数有自动过期,但如有效期很长,也可以透过工具提前终止)。尤其如果你怀疑曾签署可疑 Permit,最安全的做法是立刻调整 nonce:可以对同一 spender 签发一个新的 permit(哪怕给 0 额度),以占用掉攻击者手中的旧签名的 nonce,使其作废。
对于不熟悉的网站或应用,一定提高警觉。不随意点击来路不明的连结,尤其是社群平台上的广告或私讯提供的「福利」、「mint 活动」等链接。许多钓鱼就是透过冒充官方帐号发布虚假活动连结,一旦连入就诱导签名。养成习惯直接输入常用 DApp 官方网址,或使用书签,避免被假网站鱼目混珠。
总而言之,权衡方便与安全很重要。 Permit 类技术固然便利,但用户端的风险防范不能松懈。随着环境成熟,钱包产品和浏览器插件也在开发针对签名钓鱼的防护,例如有的会在你签名包含巨大金额时警示。未来希望在技术与教育双方面共同降低此类攻击的发生。
从传统 ERC-20 授权模型的不足,到 Permit 的诞生,再到 Uniswap Permit2 的创新,我们见证了以太坊生态为改善用户体验和安全性所做的努力。 Permit2 通过链下签名大幅简化了代币授权流程,减少重复授权和无限许可的风险,同时引入了过期机制和批次操作等实用功能。然而,新机制也伴随着新的责任——用户需要提升安全意识,钱包与 DApp 需要协同保护用户免受签名攻击。未来,随着帐户抽象等更进一步的技术发展,代币授权管理有望变得更加无感且安全。