代币授权是一种智能合约权限,允许去中心化应用(即 dapp)访问并转移钱包中特定类型的代币。若未获得授权,任何应用都无法触碰自托管钱包中的代币,即便钱包已连接至该应用的界面。授权正是连接钱包与实际允许协议使用其中资产之间的桥梁。
代币授权几乎是每一次 DeFi 交互的必要前提:在去中心化交易所兑换代币、向借贷协议存款、向流动性池注入流动性,或在市场上架 NFT。然而,它也是加密安全领域被利用最多的机制之一。MetaMask 的每月加密安全报告对这些威胁进行了详细追踪。例如,2026 年 2 月加密安全报告记录了"签名钓鱼"攻击(即授权钓鱼)高达 207% 的增幅。对于任何使用自托管钱包的用户而言,了解代币授权的作用、持续方式以及攻击者的利用手段至关重要。
免责声明:本内容仅供教育目的,不构成财务建议,不构成招揽,亦不面向英国受众。加密钱包和数字资产存在风险,并不适合所有用户。
代币授权的工作原理
以下是一个常见的代币授权示例:在去中心化交易所将 USDC 兑换为 ETH。应用的智能合约需要获得权限,才能从钱包中取出 USDC 并执行交易。这一权限即为代币授权。
在合约层面,用户在 USDC 代币合约上调用 approve() 函数。该函数接受两个输入:spender(被授权的智能合约地址)和 amount(spender 被允许转移的代币数量)。一旦授权交易在区块链上得到确认,spender 合约即可调用 transferFrom(),在无需用户进一步确认的情况下,从用户钱包中转移不超过已授权数量的代币。
关于代币授权,有两个重要细节是每个人——尤其是初学者——都应了解的。第一,授权仅针对特定代币和特定 spender。授权去中心化交易所(DEX)使用 USDC,并不意味着它可以访问 ETH、BTC 或任何其他代币。第二,授权是一笔需要支付网络费用的区块链交易——它是独立于实际兑换操作的单独步骤,这也是为什么 DeFi 交互通常需要两次确认:一次用于授权,一次用于执行。
有限授权与无限授权
授权中的 amount 字段决定了 spender 可访问的代币数量。
有限授权仅授权 spender 转移特定数量的代币——例如,某次兑换所需的恰好 500 USDC。一旦这 500 USDC 被转移,额度即告用尽。下一次兑换将需要新的授权,这意味着又一笔区块链交易和网络费用。
无限授权授权 spender 转移该代币的最大可能数量(技术上为 2^256 − 1,远超任何代币的总供应量)。这意味着合约可以随时访问用户该代币的全部余额,且无需再次授权。大多数应用默认请求无限授权,因为这降低了用户的操作摩擦——一次授权,该代币的所有未来交易均已预先获批。
便利性是真实存在的,但风险同样如此。无限授权永不过期。如果被授权的合约日后遭到利用、被恶意升级,或用户在仿冒合法应用的钓鱼网站上签署了授权,攻击者便可在无需用户任何进一步操作的情况下,清空授权所涵盖的全部代币。受害者甚至可能在代币消失之前都未意识到该授权的存在。
考量因素 | 有限代币授权 | 无限代币授权 |
授权数量 | 特定数量(例如 500 USDC) | 最大可能数量(全部余额,永久有效) |
持续性 | 转移指定数量后即消耗完毕 | 持续有效,直至手动撤销 |
用户摩擦 | 每笔交易需新授权(额外网络费用) | 一次授权覆盖所有未来交易 |
合约被利用时的风险 | 损失上限为已授权数量 | 全部代币余额面临风险 |
常见用途 | 注重安全的用户、高价值交易 | 大多数应用的默认设置 |
Permit2 代币授权的工作原理
2022 年 11 月,Uniswap Labs 部署了一个名为 Permit2 的合约,旨在解决传统代币授权的摩擦与风险问题。到 2025 年,超过 310 万个以太坊主网地址已授权 Permit2 合约,它已成为 DeFi 中应用最广泛的授权系统,被 Uniswap、1inch、CowSwap 及众多其他协议所采用。
其核心理念是:用户无需向每个应用的智能合约单独授权,而是向 Permit2 合约授予一次授权。此后,每次单独的应用交互均通过链下签名进行授权——这是一条在钱包中签署的消息,指定了代币种类、数量、spender 以及权限到期的截止时间。
相较于传统授权,Permit2 的改进意义重大。Permit2 签名包含截止时间,因此过期权限会自动失效,而非永久存续。Nonce 机制防止同一签名被重复使用。用户每种代币只需签署一次授权,而非每个应用各签一次,从而减少了区块链授权交易的总数及相关网络费用。
然而,这一方案也带来了攻击面的转移。传统授权通过休眠的区块链权限被利用——那些在数月或数年前被授权、后来遭到入侵的合约。Permit2 签名则在签署时通过钓鱼攻击被利用。由于 Permit2 授权使用 EIP-712 类型数据签名,它在钱包中以签名提示而非交易确认的形式呈现。恶意网站可以呈现一个看似常规的"签署此消息"请求,而实际上这是一个授权转移用户全部代币余额的 Permit2 签名。无需区块链交易,无需用户支付网络费用,只需一个签名,攻击者便可调用 transferFrom()。
恶意程序如何利用代币授权
钱包清空程序是专为提取代币授权(包括传统授权和 Permit2 授权)而设计的自动化钓鱼工具包。它们以**清空程序即服务(DaaS)**的模式运营:开发者维护恶意智能合约、钓鱼基础设施和资金洗白管道,附属成员租用该服务并分得被盗资金(通常保留所盗金额的 75%–95%)。
钱包清空程序的攻击模式通常遵循以下固定流程:
第一步:诱导。 受害者通过赞助搜索结果、虚假空投链接、被入侵的 Discord 服务器或克隆的应用界面进入钓鱼网站。该网站看起来与合法协议一模一样:相同的品牌标识、相同的布局,通常还有几乎一致的 URL。
第二步:请求签名。 网站提示钱包签署一笔交易或 Permit2 签名。该提示可能看起来像标准的应用连接、代币兑换或空投领取。而实际上,该签名授权了清空程序的合约转移受害者的代币。
第三步:清空。 攻击者从另一个钱包调用 transferFrom(),提取已授权的代币。复杂的清空工具包会将多种代币转移——ERC-20、NFT 和 Permit2 授权——批量打包进一次 multicall,在数秒内清空钱包。资金随后通过去中心化交易所和跨链桥进行路由,以掩盖资金流向。
关键细节在于:从区块链的角度来看,每一步都是有效的、经过授权的交易。受害者签署了授权,合约执行了被授权的操作。在协议层面,没有任何机制可以撤销这一过程。
部分钱包现在会在用户确认前模拟交易和签名,标记已知的清空程序合约和可疑的授权数量。MetaMask 通过与 Blockaid 的集成实现了这一功能。这并不能消除风险——新型清空程序合约可能尚未被任何检测数据库收录——但它在钓鱼提示与用户确认之间增加了一道防线。
如何查看和撤销代币授权
撤销代币授权意味着将特定 spender 的额度归零。这是一笔区块链交易,需要支付网络费用并在钱包中确认,但它会永久取消该合约转移指定代币的能力。
有三个概念值得关注:
何时撤销。 在使用完某个应用且不打算再次使用之后。在授予了不再需要的无限授权之后。在任何感觉可疑的交互之后——即便当时没有立即发生损失。作为一种常规做法:定期审查有效授权,可以发现那些已超出其用途的权限。
撤销的成本。 每次撤销都是一笔独立的区块链交易,需要支付相应的网络费用。在以太坊主网上,这通常需要几美元;在二层网络上,费用可能只有几分钱。相较于因授权被利用而可能造成的损失,这一成本微不足道,但如果数月的 DeFi 活动积累了数十个授权,费用也会随之累积。
撤销无法解决的问题。 撤销授权可以阻止该权限下的未来转移,但无法撤销已经发生的转移。如果清空程序已经调用了 transferFrom(),代币便已不复存在。撤销是预防性措施,而非补救手段。
有关在自托管钱包中查看和撤销授权的分步说明,请参阅 MetaMask 的如何撤销智能合约授权。
如何降低代币授权风险
以下几种做法可以在不牺牲 DeFi 交互便利性的前提下降低风险敞口。
在有选项的情况下设置有限授权。 例如,MetaMask 扩展程序会显示请求的授权数量,并允许用户在确认前自定义消费上限。将上限设置为交易实际所需的数量,可以在合约日后遭到利用时将损失降至最低。
仔细阅读签名提示。 Permit2 签名会显示代币名称、数量、spender 地址和截止时间。如果"签署消息"提示中显示了代币详情,这并非登录操作,而是一次授权。如果数量与用户的全部余额相符,而非预期的交易金额,这便是一个危险信号。
连接前验证网站。 清空程序网站会复制合法应用的界面。将可信 URL 加入书签并从书签导航——而非从搜索结果、社交媒体链接或私信中跳转——可以消除最常见的诱导机制。
定期审查授权。 在持续使用 DeFi 的过程中,有效授权会不断积累。每季度使用区块浏览器的授权检查工具或消费上限仪表板进行一次审查,可以发现那些已不再有用途的权限。
关于代币授权的常见问题
不会。连接钱包只会共享公开地址,并允许应用读取代币余额,不会授权应用转移任何代币。代币授权需要单独的区块链交易(针对传统授权方式)或签名的 Permit2 消息——两者都会在钱包中以明确的提示形式出现,需要用户手动确认。
不。ERC-20 的 approve() 函数和 Permit2 仅适用于代币,不适用于区块链的原生货币。ETH(以及 MATIC 或 BNB 等其他原生货币)只能通过签署直接转账交易来转移。但是,原生货币的封装版本(WETH、WMATIC)属于 ERC-20 代币,可能通过授权被清空。
Permit2 通过添加截止日期和 nonce 解决了传统授权最大的弱点——永久存在的休眠无限权限。但它引入了另一种风险:看似无害的链下签名可能授权大额转账。两种系统在安全性上各有优劣,并无绝对高下之分。Permit2 在防范过期授权漏洞方面更具优势;而传统授权在防范签名钓鱼方面更为安全,因为它需要一笔区块链交易,钱包会以更醒目的方式加以展示。
无限代币授权允许智能合约从钱包中转移任意数量的特定代币,且无过期时间。大多数应用默认请求无限授权,以减少所需的交易次数。风险在于:如果已授权的合约遭到攻击,攻击者无需任何额外确认即可清空钱包中该代币的全部余额。无限授权将持续有效,直到用户手动撤销为止。