撤销代币授权(revoke token approvals):如何撤销授权,为什么要定期做

什么是代币授权(token approval)、为什么它是风险,授权如何演变成钱包被抽干,如何通过 revoke.cash 和区块浏览器查看并撤销代币授权,以及撤销解决不了什么。

CoinDropster 编辑团队 · 更新于:

如果你参与空投,撤销代币授权(revoke token approvals)应当像查看余额一样定期进行。每一次兑换、质押和存款都会留下一个授权:某个合约支配你代币的权利。这些授权不会自动过期。撤销代币授权,就是关闭那些无需你再次签名、资金就可能流出的通道。本文解释授权如何产生、如何查看,以及什么情况下撤销也无济于事。

本文描述的是 EVM 兼容网络上授权的机制以及审查授权的通用工具。它不是详尽的安全指南,也不是财务建议:撤销可以降低风险,但不能完全消除风险。

什么是代币授权

ERC-20 标准的代币(以及 ERC-721/1155 标准的 NFT)不能被合约自行“拿走”。要让 DEX 兑换你的 USDC,或让资金池接受你的流动性,你必须先允许合约从你的地址提取代币——这就是授权(approval)。技术上这是一笔 approve(spender, amount) 交易,它在代币合约中记录:spender 地址最多可以划走 amount 个单位。

问题出在两个特性上。第一,界面默认请求无限额度(max uint256),以免每次操作都要请求授权。第二,授权是无期限的:它一直存在,直到你覆盖它。在你只用过一次某个协议的一年之后,它的合约仍然有权划走你该代币的全部余额。

另外还有 permit 和 permit2 签名:授权通过链下签名给出,不产生交易,只有在 spender 使用它时才会出现在链上。这更方便、更便宜,但也更不容易察觉。

授权如何演变成资产被抽干

有几种情形,并非都与诈骗有关:

  • 钓鱼网站。 你以为是领取或铸造,签了一个给抽干合约的 approve。抽干器调用 transferFrom,拿走它获得授权的一切。这类网站长什么样,见识别虚假领取网站。
  • 正规合约中的漏洞。 你使用过的协议被攻击。攻击者获得了以合约名义调用 transferFrom 的能力——于是从所有留下无限授权的人那里划走资产。这在大型协议上发生过不止一次。
  • 可升级合约。 逻辑可以被替换的代理合约。如果团队或拿到密钥的人更换了实现,旧的授权会继续对新代码生效。
  • 被废弃的协议。 项目关闭,域名过期,管理员密钥不知在何处。授权依然有效。

所有情形的共同点:划转发生时不需要你的新签名。你在钱包里看不到任何请求——只会在历史记录里看到一笔转出交易。

如何查看并撤销授权

授权存储在代币合约中,因此钱包通常不显示它们。需要外部工具:

  1. 授权审查服务。 例如 revoke.cash:连接钱包或直接输入地址,服务会按网络列出所有活跃授权——代币、spender、额度、授予日期。撤销是一笔 approve(spender, 0) 交易,由服务替你构造。这类服务不仅存在于 EVM 网络;原理是相同的。
  2. 区块浏览器。 大多数区块浏览器都有“Token Approvals”(Approval Checker)板块,无需第三方网站即可完成同样的事。
  3. 手动操作。 通过区块浏览器的界面在代币合约上以零额度调用 approve。更慢,但不需要信任任何前端。

撤销时需要注意:这是一笔交易,需要 Gas,并且必须在授予授权的那条网络上进行。撤销尚未使用的 permit 签名方式不同:要么使 nonce 失效,要么撤销对 permit2 合约本身的授权——审查服务通常也会显示这些。另外,先确认你用来撤销的服务是真的:假的“撤销网站”确实存在,它们索要的正是你想摆脱的那种签名。

活动之间的撤销日常

撤销不是事故之后的一次性动作,而是一种习惯。合理的节奏:

  • 活动结束后。 项目进入 Distributed,你已领取代币——撤销对其合约以及为完成其清单而连接的所有内容的授权。
  • 领取之后。 领取网站可能请求了接收代币并不需要的授权。立即检查。
  • 每隔几周。 对钱包活跃的所有网络做一次全面审查。特别关注无限额度的授权和你不认识的 spender 地址。
  • 向钱包大额转入之前。 如果你打算在某个地址上持有比平时更多的资产,先确认它没有活跃的授权。

预防比撤销更便宜:授予授权时,如果钱包界面允许,设置精确金额而不是无限额度;活跃钱包上只放当前操作所需的资产。这种架构如何搭建,见空投钱包设置一文。

撤销解决不了什么

撤销授权关闭的是一个特定的攻击向量——通过 approve/permit 划转。在以下常被混淆的情形中它无能为力:

  • 泄露的助记词或私钥。 持有助记词的人就是钱包的完全所有者。他可以授予新的授权、直接转移资金、撤销你的撤销。唯一的解决办法是用新助记词创建新钱包,并把剩余的一切转过去。
  • 已经执行的转账。 如果 transferFrom 已经完成,撤销只能保护剩余部分。已经流出的不会回来。
  • 网络的原生代币。 ETH、BNB 及类似代币不需要 approve。它们只会因你亲自签署的直接交易而丢失——撤销与此无关。
  • 账户委托。 在允许账户把代码执行委托给另一个合约的网络上,撤销代币授权并不会取消委托。那是另一项单独的设置。
  • 钱包里的诈骗代币。 自己“飞来”的代币在你与之交互之前是无害的。没有什么可撤销的;只要不碰它们、不点击其名称中的链接即可。

总结:撤销授权是安全卫生中必不可少但并非唯一的一环。结合独立钱包、链接核实和仔细阅读你所签署的内容,它能让参与空投成为一项风险有限的活动。适合进行审查的项目状态——Reward available 和 Distributed——都可以在 CoinDropster 上跟踪。查看跟踪中的空投 →