加密代币授权与额度:如何检查和撤销 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 的信任程度,以及能否重新检查授权来决定。

签名前确认链、代币、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 也可能再被使用。
先把额度设为零并确认,再设置新值,可以减少旧额度和新额度同时有效的机会;但无法撤销零值交易确认前已经使用的旧额度。两个步骤可能分别产生手续费,代币行为也可能不同。按钱包或代币官方说明采用安全更新流程,并等待确认后再进行下一步。
不确定当前额度时,先在所选网络查询代币合约。若钱包显示空值或意外代币,确认自己没有查看另一条链或另一个地址。所有者地址与代币合约地址都必须匹配目标授权。
用简短流程复查钱包和代币权限
- 确认项目官方域名和当前网络。
- 核对代币合约和 spender 地址,再比较额度与计划操作所需数量。
- 阅读钱包显示的真实交易或 typed data;看不懂的请求不要签名。
- 对已用完或不再信任的 spender,在对应网络检查 allowance;必要时设为零并确认结果。
- 比较钱包时,除网络支持外,也要看它是否清楚展示授权,以及更新和恢复说明是否易懂。
硬件钱包是密钥保管与签名审查的一种选择,不保证合约安全,也不能阻止用户批准过大的额度。不要把判断交给签名界面;自己核对 spender、代币、网络和额度。知道授权会独立于网站连接保留,也有助于比较钱包功能及其实际局限。
常见问题
Q1断开钱包连接会清除已有代币授权吗?
不会。网站连接是钱包会话,ERC-20 allowance 是代币合约中的链上状态。需要时应在对应链和代币上单独检查并撤销 spender 权限。
Q2把 allowance 设为零可以追回已经转走的代币吗?
不能。确认后只能阻止后续使用,不能逆转已经完成的转账。其他授权和私钥是否泄露也要单独检查。
Q3所有加密代币和 NFT 都使用 ERC-20 allowance 吗?
不是。本文只讨论 ERC-20 approve和transferFrom。NFT 操作员授权、原生资产、其他代币标准和链特定权限都要按各自规则检查。
资料来源与延伸阅读
报告问题
我们会准备一封包含本文链接的邮件。发送后,Mark 才会收到你的反馈
快速检查
读完指南后,用 3 道题检查一下
问题 01
ERC-20 的 `approve(spender, amount)` 主要设置什么?
选择答案即可查看解释