很多人在新网站上点过“连接钱包”和“批准”,用完就在钱包里点一下断开,觉得事情已经结束。可代币授权是写在链上的,断开连接只是让网页暂时看不到你的地址,授权本身还在。这篇想弄清楚一件事:代币授权到底是什么,怎么查自己给出过哪些授权,又该怎么撤。
代币授权是什么
在以太坊这类链上,USDC 这样的代币大多遵循 ERC-20 标准,也就是一套代币合约的通用接口规范。标准里有个 approve 函数,作用是允许某个地址从你的钱包里划走指定数量的某种代币。这个地址通常是去中心化应用的智能合约,下文叫它“被授权方”。允许的数量记录在代币合约里,叫 allowance,可以理解为“对方最多能动用多少”。
兑换、借贷这类应用需要这一步,因为合约必须先拿到许可,之后才能调用 transferFrom,也就是按授权代你转账的函数,把币转走。ERC-20 标准文档(EIP-20,2015 年发布)写得很直白:approve 允许对方在额度内多次提取,再调用一次会覆盖原来的额度。
所以授权更像交出一把带限额的备用钥匙,对方在额度内动用,不需要你再点确认。
为什么断开连接后风险还在
钱包里的“断开连接”只管网页能不能读到你的地址,不会改链上的 allowance。想让授权失效,得另发一笔交易把额度改成 0,这笔交易同样要付 Gas,也就是链上手续费。ethereum.org 的撤销授权指南也写明,撤销时钱包会弹出一笔新交易,需要你确认并付费。
旧授权出问题,常见的是这几种情况:
- 无限授权:不少应用为了省事,默认请求一个极大的额度,几乎等于不设上限。
- 被授权的合约后来出现漏洞或被攻击,旧授权可能被人利用。
- 在钓鱼网站上点了“批准”,被授权方本身就是攻击者。
还有一种不发交易的授权方式。ERC-2612 标准定义了 permit 函数,你只需要签一个名,别人就能拿着这个签名去链上把授权生效。签名本身不花 Gas,但让授权上链生效的那笔交易仍要有人付 Gas,效果同样是修改授权额度,所以签名前同样要看清楚内容。
一个假设的例子
假设小 A 钱包里有 2,000 枚 USDC。半年前她在某个兑换应用上换币,本来只打算用 100 枚,但弹窗默认给的是无限授权,她没细看就确认了。这次换币用掉了 100 枚,钱包余额剩 1,900 枚,可授权额度仍视为无限,并没有因此减少。换完后她点了断开连接。
再假设这个应用的合约后来出了问题,攻击者可以利用旧授权调用 transferFrom。因为额度没有上限,能被划走的是她钱包里的全部余额,也就是剩下的 1,900 枚,远不止当初打算用的 100 枚。
换个做法看看。如果她当时只授权 100 枚,换完后剩余额度是 100 − 100 = 0,合约出事也划不走东西。如果授权了 500 枚、用掉 100 枚,剩余额度是 500 − 100 = 400 枚,风险敞口就是 400 枚,比 1,900 枚小得多。以上数字都是假设。
额度越大、留得越久,出事时可能损失的上限就越高。
怎么检查和撤销授权
- 先查:打开对应链官方区块浏览器的授权检查页面,以太坊主网是 Etherscan 的 Token Approval 工具。输入自己的地址就能查看,查看授权本身不会动你的资产,撤销则是一笔需要签名并付手续费的链上交易。不同链要分别查,在以太坊主网上只能看到主网的授权。
- 看三栏:资产是哪种代币,被授权方是哪个合约,当前额度是多少。不认识的、早就不用的、额度显示为无限的,优先处理。
- 撤销:连接钱包后点对应条目的 Revoke,钱包会弹出一笔交易。确认代币、被授权地址都和你要撤的那条一致,新额度为 0,再签名。钱包里记得留一点原生币付手续费。
- 复查:交易确认后刷新页面,看这条授权是否消失或额度变成 0。
- 以后再授权时,能手动改额度就改成这次要用的数量,签名请求也要读清楚内容再点。
第一次用新工具时,可以先拿小额资产把流程走一遍。网址自己手动输入或从收藏夹打开,地址逐位核对。助记词就是恢复钱包用的那组单词,任何网站和“客服”都不需要它,不要给任何人,也不要存进截图、云笔记这类联网设备。
这个办法的局限
撤销授权只能防以后,已经被转走的资产撤销了也追不回来。如果怀疑助记词或私钥已经泄露,撤销授权帮不上忙,因为对方可以直接转账,这时更要紧的是把剩余资产转到一个用新助记词生成的新钱包。检查工具也有仿冒站点,搜索结果里的广告链接要留神。不同工具显示可能有差别,有疑问可以交叉核对。
代币授权是一份留在链上的长期许可,断开连接收不回来,把额度改成 0 的那笔交易才算数。按需授权、定期复查,比出事后补救轻松得多。你的钱包里,现在还有几条自己都想不起来的授权?
以上仅为个人学习记录,不构成投资建议。
