Skip to content
全部期权指南
加密钱包安全约12分钟

加密代币授权与额度:如何检查和撤销 ERC-20 授权

了解 ERC-20 授权允许智能合约做什么、无限额度和 permit 签名如何运作,以及撤销授权能改变和不能改变的事项。

本指南内容连接钱包和授权代币是两种不同权限

简短摘要

ERC-20 的 `approve` 通常不会立即转出代币,而是在代币合约中记录某个 spender 以后可通过 `transferFrom` 使用的额度。断开钱包与网站的连接,不一定会清除链上授权;把额度改为零也无法撤回已经完成的转账。

连接钱包和授权代币是两种不同权限

连接网站通常让应用看到公开地址并请求钱包签名,但这本身不等于允许它转走所有 ERC-20 代币。代币额度单独保存在代币合约中。MetaMask 也把断开 dapp 连接和撤销代币授权视为不同操作。

ERC-20 allowance 对应代币合约、链、所有者地址和 spender 地址。在 Ethereum 上授予的额度,不等于在 Polygon 上对同名代币的授权,也不等于对另一种代币的授权。只记得“我授权过这个网站”,容易忽略具体是哪条链、哪个代币仍保留额度。

本文范围是 Ethereum 及兼容网络上的 ERC-20 approve、allowance 和 transferFrom。原生 ETH 转账、NFT 的 setApprovalForAll、其他代币标准和钱包登录连接都采用不同的权限模型。密钥备份和恢复是另一问题,可参阅助记词备份与钱包恢复指南。

`approve`记录额度,不会直接发送代币

ERC-20 持有人可以在代币合约调用 approve(spender, amount),允许指定 spender 使用不超过该额度的代币。标准的 transferFrom 让 spender 代表持有人转移代币。因此 approve 本身通常不改变余额,但后续合约调用可以消耗 allowance。这是 ERC-20 标准定义的授权流程。

例如,钱包有 300 枚代币,给某个路由合约 80 枚额度时,常见 ERC-20 spender 可用数量受剩余额度和当前余额中较小者限制。授权不一定只用于一笔交易:合约可以多次调用 transferFrom。如果获批合约或预期调用路径遭到滥用,代币可能以用户没想到的方式移动。代币的非标准行为和额外限制也需要核对。

授权通常是发往代币合约的链上交易,可能产生网络费。有的应用把授权和兑换拆成多笔交易;有的把签名授权与后续交易组合。不要只凭“Approve”按钮判断动作,要查看钱包要求签署的内容和所选网络。

无限额度不等于立刻提款

钱包显示“Unlimited”通常代表接近代币最大整数值的额度。它不会创造无限代币,也不会在授权时马上转走余额。但同一链上的同一代币以后进入钱包时,spender 仍可能使用留下的额度。某些实现会保留最大值而不递减,因此要了解该代币如何处理这个额度。

应用可能为减少重复授权而请求较大的额度,但方便与风险需要一并考虑。若 spender 合约存在漏洞,或其控制权被滥用,旧授权可能在以后被使用。Ethereum.org 的撤销指南解释了为什么把资产转回钱包后,宽泛额度仍可能带来风险。

较小额度也不会消除所有风险。授权了假代币或错误 spender,即使额度不大也可能造成损失;每笔交易重新授权则会增加手续费和操作失误机会。应结合计划使用的数量、使用频率、对 spender 的信任程度,以及能否重新检查授权来决定。

无文字插图:钱包、金色代币和表示不同代币授权额度的阀门。
Allowance 允许特定合约日后使用代币;签名前请核对地址和数量。

签名前确认链、代币、spender 和额度

签名前核对四项:所选网络是否与应用说明一致;代币合约地址是否正确,而不是只看代币简称;spender 地址是否与项目官方资料或可核实的合约信息一致;额度是否符合计划操作,还是会留下长期宽泛权限。

不要从私信、二维码、客服聊天或未经核实的广告链接连接钱包。钓鱼页面可以模仿真实应用。请从已保存的官方网址或项目官方资料开始;合约显示名称熟悉,并不证明地址正确。区块浏览器的验证标记也不代表合约安全。

硬件签名设备可以帮助把私钥与普通浏览器隔离,但不能替你判断 spender 或额度是否安全。如果设备无法清楚显示请求内容,请先停止签名并查看钱包提供方的官方说明。设备展示的信息越少,你能核实的内容也越有限。

`permit`改变授权路径,但仍会创建权限

部分 ERC-20 支持 ERC-2612 permit。持有人不必提交普通 approve 交易,而是对 typed data 签名;其他人可以提交该签名来设置 allowance。标准消息包含 owner、spender、额度、nonce 和 deadline,并用域信息将签名关联到链和合约。

ERC-2612 的 deadline 是提交签名的最后时刻,不表示成功设置的 allowance 会在该时刻自动过期。额度可能一直保留到被使用、修改或撤销。部分代币使用不同的 permit 设计或额外到期规则,因此不要把所有标为“permit”的请求都当成 ERC-2612。

签名可以让另一个账户代付网络费,但这不代表每种签名都只是无害登录。如果钱包没有清楚展示代币、spender、额度和时间条件,或与应用说明不符,请拒绝并查看官方资料。尚未提交的签名也可能在其期限前被他人提交。

断开网站连接不会撤销链上额度

退出登录或断开钱包,只会改变浏览器会话或连接权限。已经记录在代币合约里的 ERC-20 allowance 仍可能保留。反过来,撤销额度也不会抹去网站已看到的公开地址或链上历史。MetaMask 的断开连接说明也明确区分这两者。

撤销通常需要提交链上交易,把该代币和 spender 的额度设为零。交易会产生网络费,而且确认前旧权限可能仍有效。之后刷新授权列表或重新查询代币合约,确认同一钱包、链、代币和 spender 的额度确实为零。MetaMask 授权指南与 Ethereum.org 介绍了按网络检查授权的方法;无论使用哪个工具,都要核对官方域名和网络。

每条链分别保存状态。在 Ethereum 上清零,不会自动改变另一网络上的同类授权。逐一检查相关账户、代币合约、spender 和网络,并在交易确认后复核结果。撤销工具不需要助记词或私钥。

撤销只阻止未来使用,不能逆转已完成的转账

额度清零并确认后,该 allowance 不能再支持新的 transferFrom。但撤销不会逆转已完成的转账、从接收地址追回代币,也不会清除无关合约权限。若代币已经被可疑 spender 转走,单纯撤销不能保证资产恢复。

如果钱包私钥泄露,攻击者仍可能通过其他方式签署交易。其他 spender 或代币的授权、NFT 操作员权限、permit 签名和合约专属权限也可能继续存在。只在你实际检查过的钱包和链范围内解读撤销结果。

撤销后,下次兑换、存入或赎回可能需要重新授权。操作前检查该权限是否用于未完成交易或仍在使用的协议仓位;必要时查看协议官方帮助。关键是了解权限变化会怎样影响后续操作。

修改额度时要考虑 ERC-20 的竞态条件

ERC-20 建议界面在把一个非零额度改成另一个非零额度前先设为零。如果 spender 的交易插在旧额度与新额度之间,spender 可能使用超过用户预期的数量。例如从 100 改成 25 时,spender 若先使用旧的 100,之后新的 25 也可能再被使用。

先把额度设为零并确认,再设置新值,可以减少旧额度和新额度同时有效的机会;但无法撤销零值交易确认前已经使用的旧额度。两个步骤可能分别产生手续费,代币行为也可能不同。按钱包或代币官方说明采用安全更新流程,并等待确认后再进行下一步。

不确定当前额度时,先在所选网络查询代币合约。若钱包显示空值或意外代币,确认自己没有查看另一条链或另一个地址。所有者地址与代币合约地址都必须匹配目标授权。

用简短流程复查钱包和代币权限

  1. 确认项目官方域名和当前网络。
  2. 核对代币合约和 spender 地址,再比较额度与计划操作所需数量。
  3. 阅读钱包显示的真实交易或 typed data;看不懂的请求不要签名。
  4. 对已用完或不再信任的 spender,在对应网络检查 allowance;必要时设为零并确认结果。
  5. 比较钱包时,除网络支持外,也要看它是否清楚展示授权,以及更新和恢复说明是否易懂。

硬件钱包是密钥保管与签名审查的一种选择,不保证合约安全,也不能阻止用户批准过大的额度。不要把判断交给签名界面;自己核对 spender、代币、网络和额度。知道授权会独立于网站连接保留,也有助于比较钱包功能及其实际局限。

常见问题

Q1断开钱包连接会清除已有代币授权吗?

不会。网站连接是钱包会话,ERC-20 allowance 是代币合约中的链上状态。需要时应在对应链和代币上单独检查并撤销 spender 权限。

Q2把 allowance 设为零可以追回已经转走的代币吗?

不能。确认后只能阻止后续使用,不能逆转已经完成的转账。其他授权和私钥是否泄露也要单独检查。

Q3所有加密代币和 NFT 都使用 ERC-20 allowance 吗?

不是。本文只讨论 ERC-20 approve和transferFrom。NFT 操作员授权、原生资产、其他代币标准和链特定权限都要按各自规则检查。

资料来源与延伸阅读

报告问题

我们会准备一封包含本文链接的邮件。发送后,Mark 才会收到你的反馈

快速检查

读完指南后,用 3 道题检查一下

问题 1 / 3

问题 01

ERC-20 的 `approve(spender, amount)` 主要设置什么?

选择答案即可查看解释

期权术语表