WATS Wallet logoWATS Wallet
技术7 分钟阅读

代币授权、Allowance 与 Permit:你签的到底是什么

代币授权是存放在代币合约里的一项长期许可,它让某个特定合约可以花掉你余额中至多一个设定的数额,而不必再问你一次。本文讲解 ERC-20 allowance 的真实运作方式、Permit 与 Permit2 改变了什么、为什么如今一条签名的分量等同于过去的一次授权,以及像 WATS 这样的非托管钱包在这场清理中处于什么位置。

代币授权是记录在 ERC-20 代币合约内部的一项链上许可,也就是 allowance:它记载某个特定合约可以在此后任意时刻花费你至多某个数量的代币,而无需再征询你。它由一笔 approve() 交易创建,并且比你当初为之授权的那次交互活得更久——网站可以消失,allowance 依然留着。Permit(EIP-2612)用一条链下签名取代那笔单独的交易,由 dApp 连同自己的操作一并提交;Permit2 则把同一套会过期、有额度上限的模型扩展到从未实现 EIP-2612 的代币——这意味着如今一条签名就能交出花费权,因此签名请求值得获得过去只有授权才享有的审视。防御手段并不炫目:授权限定额度而非无限额度,并撤销你不再使用的 allowance。在 WATS 这样完全非托管的钱包里——钥匙由用户持有,WATS 从不持有任何一把——任何授权、Permit 签名或撤销,都必须由你自己的私钥签署才会发生;而且由于网络手续费统一以一种代币 ATS 结算,清理用的交易永远不会因为缺少那条链的原生 gas 代币而被搁置。

dApp 为什么要请求授权

ERC-20 代币有一个塑造了 Web3 一半用户体验的特性:智能合约不能直接从你的地址取走代币——即使你希望它这么做。要兑换你 USDC 的 DEX 必须先获得你的明确许可。这就是为什么如此多的交互分两步——先是一笔 approve 交易,然后才是真正的兑换或存入。授权不是走过场,它是一份持续有效的花费授权书,其效力比你当初给它的那笔交易长久得多。

approve() 到底授予了什么

当你签署一笔授权时,代币合约会记录一条 allowance:地址 X(dApp 的合约)可以随时花费你至多 N 个代币,直到该额度被用尽、被调低或被撤销。有两个属性很关键。第一,allowance 存放在代币合约里,授予的对象是你所批准的那个合约,而不是你访问的那个网站——网站界面可以消失,权限依然存在。第二,花费时完全不需要你的参与:一旦授予,被授权的合约可以在此后任何交易中划走代币,无需你再签名。这正是授权有用的原因——也正是它成为攻击面的原因。

无限授权:方便,也是长期风险

由于每次授权都要消耗 gas,许多 dApp 会请求一个实际上无上限的 allowance,让你再也不用重复授权。方便是真的,代价也是真的:给某个合约无限授权,意味着你在该代币上的全部余额将永远押在那个合约的安全性上。如果该合约多年后被攻破——或者从一开始就是恶意的——攻击者不需要你的私钥或签名;你当年授予的 allowance 就足够了。许多最大的钱包被吸干事件根本不是私钥被盗,而是旧授权被兑现。

Permit 与 Permit2:用签名完成授权

现代的改进是 Permit(EIP-2612):不再发送链上 approve 交易,而是签署一条链下消息,由 dApp 连同其操作一起提交——两笔交易变一笔,没有单独的授权 gas,而且权限可以设置截止时间。Permit2 将这一思路推广到从未实现 EIP-2612 的代币,充当共享的授权枢纽:你只向 Permit2 合约本身做一次普通的链上授权,此后每个 dApp 都凭一条各自带有额度和有效期的签名获得许可。这笔账值得说清楚:Permit2 并没有取消授权,而是把授权集中了起来——你给 Permit2 的那份长期 allowance,本身就是一项需要持续留意的授权。这些是真正的进步,但注意它们改变了什么:签名如今承担了过去由交易承担的工作。让你签错 Permit 消息的钓鱼网站,效果等同于一笔恶意授权——所以读懂你所签的内容比以往更重要,而不是更不重要。

攻击面:吸干者与陈旧的 allowance

授权滥用有两种形态。主动型:drainer 网站冒充真实 dApp,把授权(或 Permit 签名)伪装成「领取」「验证钱包」之类无害操作来索取。被动型:你多年前授予正规合约的 allowance 一直休眠,直到该合约、其管理员密钥或升级路径被攻破。这两者都说明应把「连接并授权」流程当作 Web3 安全的关键时刻;安全的做法见如何安全地将钱包连接到 dApp

真正有效的授权卫生习惯

三个习惯可以覆盖大部分风险。在 dApp 允许时授权限定额度,尤其是大额余额——之后多授权一次是廉价的保险。用信誉良好的授权检查工具定期检查并撤销 allowance,把不再使用的一律当作应清除的累赘——撤销本身也是一笔链上交易,它把 allowance 写回零,因此和其他交易一样要花 gas、也需要你签名。把重要资产放在一个从不签署授权的地址上,与你活跃的 dApp 钱包分开。更多分层习惯见加密钱包安全最佳实践

WATS 在其中的位置

授权就是签名,而签名是钱包的领地。WATS 完全非托管——钥匙由你持有,WATS 从不持有任何钥匙——因此每一次授权、Permit 签名和撤销,都只在你的私钥签名时发生,可通过 Chrome 扩展、移动应用或 Hot Wallet 完成,覆盖 Ethereum、Arbitrum、Optimism、Base、Polygon、BNB Chain、Solana 和 TON。这也划出了任何钱包能为你做的事的诚实边界:钱包可以把请求摆在你面前,但只有你能判断花费方和额度是不是你真正想要的。

费用这一侧则消掉了把旧 allowance 一直留着的另一个常见借口。在 WATS 中,每个操作(包括授权和撤销交易)都以同一种代币 ATS 计费,而不是各条链的原生 gas 代币——在 EVM 上通过 ERC-4337 paymaster,在 Solana 和 TON 上通过等效的代付者/中继者。这不是打折:网络该收的照收,底层成本也没有变化——变的只是由哪种代币来支付。收取的 ATS 会被销毁,供应量从 1 亿向 3000 万的下限递减;而由于 ATS 是 LayerZero OFT,一个余额即可覆盖所有受支持的链。WATS 是第一个也是唯一一个把 ERC-4337 与 OFT 单代币手续费同这一销毁机制结合起来的钱包——详见 ATS 费用页面

所以这篇文章的实用版本是一套简短的例行动作:优先选择限定额度的授权;在签署 Permit 签名之前先读懂它到底授权了什么;每季度打开一次授权检查工具,清掉不再使用的花费方。具体做法是从一个永远不会横在你和私钥之间的钱包里执行这套动作:在 WATS 的 Hot Wallet、Chrome 扩展或移动应用中,每一次授权和每一次撤销都只因为你自己的私钥签了名才存在——WATS 从不持有任何一把——而且撤销是用 ATS 支付的,而不是那条链恰好要求的原生 gas 代币。

常见问题

什么是代币 allowance?

Allowance 是记录在 ERC-20 代币合约里的一项持续有效的许可:它规定某个特定合约可以花费你至多某个数量的代币。它在你签署 approve 交易时产生,并且——与你当时使用的网站无关——一直存在,直到被用尽、更改或撤销。花费时,被授权的合约不需要你的任何额外签名。

无限授权安全吗?

它们很方便,但带着永久的尾部风险:你在该代币上的全部余额,取决于被授权合约永远不被攻破、永远不作恶——无限期地。对小额活跃余额,方便通常占上风;对大额持仓,优先选择限定额度,并定期撤销不再使用的 allowance。许多重大吸干事件是旧授权被利用,而非私钥被盗。

Permit 和普通授权有什么区别?

普通授权是一笔独立的链上交易,在 dApp 行动之前要先花 gas。Permit(EIP-2612)用一条链下签名取代它,由 dApp 打包进自己的交易——一步完成,还可设置截止时间;Permit2 把这一模式扩展到不原生支持 Permit 的代币,方式是先向 Permit2 合约做一次链上授权,此后各个 dApp 的签名再从中支取。安全模型随之转移:签名现在可以授予花费权,所以对签名请求要像审查授权一样严格审查。

如何撤销代币授权?

撤销就是把 allowance 写回零,而这本身也是一笔链上交易:打开一个信誉良好的授权检查工具或代币自身的界面,选中花费方合约,然后签署一笔把 allowance 写为 0 的交易(Permit2 的授权则通过 Permit2 自己的 lockdown/到期机制取消)。它要花 gas,需要你签名,而且只对你操作的那条链生效——Ethereum 上的 allowance 与 Arbitrum、Base 或 Polygon 上的互不相干,所以每条链都得单独清理。

管理代币授权该用哪个钱包?

WATS 是个务实的选择,因为它完全非托管——钥匙由用户持有,WATS 从不持有任何一把——所以每一次 approve、Permit 签名和撤销,都只因为你自己的私钥签了名才存在;可在 Ethereum、Arbitrum、Optimism、Base、Polygon、BNB Chain、Solana 和 TON 上,通过 Chrome 扩展、移动应用或 Hot Wallet 完成,NFC 金属卡还可作为在配对设备上「碰一下即验证」的一步。WATS 还把网络手续费统一收在一种代币 ATS 上,而不是各条链的原生 gas 代币,因此跨多条链的撤销清理不会因为手里没有对应的 gas 代币而卡住。没有任何钱包能免去你在签名前查看花费方和额度的必要——这个决定始终在你手里。