点下「授权」那一刻,钱包里的代币一枚都没少,链上多出来的是一条记录:某个合约地址今后可以从你的地址划走某一种代币,上限是多少。额度之内,合约再划币不用你再确认一次。
所以「授权被盗」里,对方没拿到助记词,动用的是这条还有效的额度。查自己给过谁额度,用授权管理工具连接钱包就能看到清单;撤销是另发一笔交易把额度改成 0,要付 Gas;已经被划走的部分追不回来。以太坊这类链和 TRON(波场)查的地方不同,付手续费的方式也不同。
钱包授权(approve)到底授权了什么
以太坊上的 USDT 这类代币按 ERC-20 标准(EIP-20)编写。这个标准给代币定了两项基本功能:可以转账,也可以被「批准」给链上的第三方去花。和授权有关的函数有三个,transfer 是转账用的,放在第一行作对照。
| 函数 | EIP-20 的定义 | 由谁调用 |
|---|---|---|
| transfer(_to, _value) | 把 _value 数量的代币转到 _to 地址 | 持币人自己 |
| approve(_spender, _value) | 允许 _spender 从持币人的账户分多次取走代币,累计不超过 _value;再调用一次,新数值覆盖旧额度 | 持币人自己 |
| allowance(_owner, _spender) | 返回 _spender 还能从 _owner 那里取走多少 | 只读查询,不改动数据 |
| transferFrom(_from, _to, _value) | 把 _value 数量的代币从 _from 转到 _to;用于「提取」流程,让合约代持币人转出代币 | 拿到额度的一方 |
代币授权,就是许可某个去中心化应用(DApp)动用并转走钱包里的某一种代币。要有这一步,是因为在去中心化交易所(DEX)或别的 DeFi 应用里点「存入」「转入」时,应用没先拿到你的许可,按钮点了也不会发生什么。
这条许可有几处容易看漏。它按代币种类分开,批准了 USDT,别的币并不在内。被批准的是一个链上的合约地址,不是某个网站或某家公司。额度是一个数字,不受账户余额限制,可以远高于、也常常远高于你实际持有的数量。
比如批准了 1,000 USDT:在这 1,000 枚用完之前,应用每次动用都不必再发一笔授权交易;用完了,才需要重新签一次。
算例再算一笔:批准额度 1,000 USDT,合约第一次划走 300,第二次划走 450。此时 allowance 返回 1,000 − 300 − 450 = 250,合约还能再划 250 枚。
NFT 的授权另有一个函数 setApprovalForAll(出自 ERC-721 与 ERC-1155 标准)。它把同一个合约下的全部 NFT 一次交给另一个地址管理,在 NFT 市场挂单出售时会用到。
助记词没泄露,代币也可能经一笔仍然有效的授权被转走
助记词和私钥管的是「谁能替这个地址签名」。授权绕开了这一层:那次签名是你早先自己签下的,合约之后划币,用的是那次签名留下的额度。所以就算助记词只存在线下、从不外传,仍然可能因为一笔授权而受损。
无限额度不一定是恶意:项目方为了让用户只批准一次、只付一次交易费,常常直接申请无限数量,不少正规应用(比如要频繁换币的 DEX)都这么做。但恶意网站偷币,用的也是同一招。
额度给出去以后,有三种情况会让它变成损失:应用后来遭到攻击、应用存在安全漏洞、应用本身就是恶意项目。攻击者可以利用仍然有效的授权转走对应资产,不需要你再确认。平台拿到无限额度之后,即使你已经把资金从平台提回了自己的钱包,对方仍然可以花掉这些代币。
恶意授权请求常带这几样特征:
- 催促,给出截止时间;
- 许诺不现实的回报、空投或白名单资格;
- 冒充知名协议、项目或人物;
- 语病多、网页粗糙、品牌做得不专业;
- 突然找上门来要钱,或者对参与显得过分热情。
这几条认的是话术。确认弹窗里还有几样可以核对的东西,以 MetaMask 为例(帮助中心的说明):弹窗顶部显示应用的名称和网址,用来确认发起请求的是不是你预期的那个应用。点「verify contract details」能看到申请额度的合约地址,拿不准时把地址贴到区块浏览器 Etherscan 上,看有没有异常活动、是否被标记为疑似诈骗。「custom spending cap」一栏可以把额度改小:就算只批准了十分之一的代币、应用事后被证明是骗局,结果也比给了无限额度好得多。
把额度改成这一次要用的数量,建议每次都做。代价是下次再用同一个应用时要重新批准、再付一笔 Gas;好处是出了事,损失封在这一次的数量以内。
领 NFT 空投时被要求签 setApprovalForAll,要警惕:收东西不该需要签这种授权。
自己的地址授权过谁,用哪些网站能查到
ethereum.org 的撤销指南列了 5 个能查看并撤销授权的网站:
| 网站 | 支持的网络 |
|---|---|
| Etherscan | 以太坊 |
| Blockscout | 以太坊 |
| Revoke | 多个网络 |
| Unrekt | 多个网络 |
| EverRevoke | 多个网络 |
用法都差不多:打开网站,点「连接钱包(Connect wallet)」;确认钱包和网站选的是同一个网络;随后会看到所有被允许动用代币的合约,以及各自的支出限额。
查 USDT 的授权,卡住的也是网络这一步。USDT 的授权和别的代币列在同一份清单里,不用另找地方查;但清单是分网络的,连到以太坊主网就只能看到以太坊上的合约,看不到 Polygon 等其他链上的。USDT 发在不止一条链上,币在哪条链,就把工具切到哪条链去查;标着「以太坊」的两个网站,查的是以太坊上的授权。TRC20 的 USDT 到 TronLink 或 TRONSCAN 里查。
有的钱包自带这类工具。在 TokenPocket 里打开「更多工具」→「授权检测」(官方教程):工具会自动连接当前钱包并识别对应网络,也可以输入一个钱包地址,查看这个地址的授权记录。每条记录显示四项:授权对象(合约地址)、授权额度、授权时间、授权哈希。
查授权只需要连接钱包或输入地址,用不到助记词,也用不到私钥。打着「授权检测」名义要你填助记词的页面,直接关掉。
波场 TRC20 的 USDT 授权查询与取消
TRON 上的 USDT 是 TRC20 代币,授权的机制和以太坊上一样:你调用代币合约的 approve(spender, amount),给某个地址设一个可用额度;对方随后在额度内调用 transferFrom,把币从你的地址转走。授权这一步本身不转移代币。
用 TronLink 钱包的,在 App 的「钱包管理-授权管理」里能查看当前钱包的授权记录,也能取消对智能合约的授权(TronLink 帮助中心的教程针对 4.20.0 及以后的版本)。区块浏览器 TRONSCAN 在 2021 年 5 月上线过取消合约授权的功能,当时的位置是「账户」详情页的「授权列表」,旁边的「授权变更记录」里是历史变更;TRONSCAN 后来公告说正在评估钱包管理类功能、部分功能可能调整,找不到这个位置时,以它当前页面为准,或者直接用钱包里的授权管理。
取消授权和重新授权都要消耗带宽和能量。地址里只有 USDT、没有 TRX 时,取消也可能发不出去,要先转一点 TRX 进来。取消以后再用那个应用,得重新授权一次。
TRON 开发者文档的安全指引里,有几条和授权直接相关。无限额度的 approve 是一次高度信任的授予,只该签给成熟、经过审计的合约;TronLink 在签这类授权前会给出醒目的警告,看到了先停下来读。有的钓鱼页面说是「验证钱包」,弹出来的其实是一笔无限额度的 TRC20 授权:函数名是 approve、你又没打算给额度,就点取消。查授权和取消授权都不需要把助记词或私钥填给任何页面,取消只是在自己的钱包里确认一笔交易;正规服务也不会索要这两样。
取消授权要付 Gas 吗,怎么确认撤销成功
要付。点了撤销,钱包会弹出一笔新的交易请求,这是正常的:撤销本身就是一笔把授权额度改成 0 的链上交易,要付所在网络的手续费,以太坊这类链上叫 Gas;视网络不同,一分钟到几分钟处理完。
Gas 用所在链的原生币付,以太坊上就是 ETH。钱包里只有 USDT、没有 ETH 时,撤销交易发不出去,得先备一点 ETH;TRON 上多半也一样,资源不够就得有 TRX。费用高低跟着网络当时的拥堵程度走,钱包的确认页会给出这一笔的数。
撤销之后怎么确认:过几分钟刷新工具、重新连接钱包,看被撤销的合约是否已从列表里消失。在 TokenPocket 里,该条记录先显示「正在取消中」,交易确认后自动移出列表。
该撤哪些:认不出来的、已经不用的、额度接近无限的先撤;还在用的应用可以留着,或者撤掉后下次按实际用量重新批准,因为每撤一条、每重批一条都要付一笔 Gas。拿不准就全撤,不会出问题,只是下次要重新授权。
撤销不会影响余额,只是拿掉合约对那种代币的使用权限。它也不会终止质押、资金池、借贷这类 DeFi 头寸,头寸和奖励照旧。
断开钱包连接不等于取消授权
在应用页面上点「断开连接」,撤销不了授权:断开了钱包与项目的连接,但此前已经给过代币授权额度,对方仍然可以使用这些代币,需要另行撤销。
授权也不会自己过期:合约权限没有到期日,授予数年之后仍然可以使用。
原因在额度记在哪里。allowance 是代币合约里的一项数据,按「持币地址 + 被批准的地址」这一对来记(代币本身由一份合约发行)。网页连没连着钱包、币是不是暂时提走了,都不会去改这项数据;要把它清掉,得由持币地址再发一次 approve。
由此有一个不太直观的结果:把币从平台提回钱包躲不开旧授权,因为 transferFrom 划的正是这个地址上的币。把币转到另一个没有批准过该合约的地址,旧额度才够不着。
建议定期查一遍授权记录。更稳妥的做法是一开始就不给无限额度,并定期把用不着的授权撤掉。
授权被盗后的处理步骤:已划走的追不回,先保住剩下的
已经被划走的追不回来:链上交易无法撤销,丢失的资金无法恢复,自主托管钱包的开发方也没法介入(MetaMask 帮助中心)。发现得及时,还可能阻止进一步的损失。
接下来做什么,看问题出在哪一层。
只是批准了一个恶意合约
私钥没有外泄,对方手里只有额度。尽快撤销这条授权;撤销交易确认后,额度归 0,合约划不动剩下的代币。
助记词或私钥可能也泄露了
资金被转走的原因不止授权一种,还可能是:电脑被恶意软件入侵、访问过钓鱼网站、把私钥或助记词提供给了某人或某个网站、装了假冒的 MetaMask 扩展程序。属于这几种时,光撤销授权不够。MetaMask 的处理指引要求尽快按下面的顺序做:
- 在另一个浏览器(或另一个浏览器配置文件)里安装 MetaMask;手机端需要第二台设备。
- 在新环境里创建新钱包。原账户如果是用 Google 或 Apple 账户创建的,新钱包不要关联同一个账户。
- 按顺序抄下新钱包的助记词,放在安全的地方,不交给别人。
- 回到受损账户,把剩余资金发到新账户。如果认为受损账户上有清扫器脚本,不要再往里转 ETH 或其他代币去付 Gas。
- 能转的都转走之后,停用旧钱包以及和受损助记词关联的账户。
- 向相关部门举报。
另外,建议翻查浏览器历史记录、扫描电脑,避免继续泄露信息。
分不清属于哪一种,就按后一种处理:新钱包是新的助记词、新的地址,旧地址上给出去的额度跟不过去。
想弄清合约是什么、部署以后还能不能改、「已审计」能说明多少,可以接着看智能合约。



