答案先抛

不会自动撤销。ERC-20 标准的 approve(address, amount) 函数只有两个参数:被授权的合约地址和允许的数量。没有时间字段,没有截止日期。一次签完之后,这个 allowance 永久存在于链上,直到你主动调用 approve 把数额改成 0,或者通过 Revoke.cash 这种界面替你提交一笔归零交易。

为什么

这是 ERC-20 在 2015 年定型时的设计选择。当时考虑的是合约调用要尽量简单、状态尽量少。授权设计成"一次性 → 永久"的好处是 gas 便宜(用户不用每次 swap 都重新 approve),代价是安全性 —— 你 2021 年牛市为了玩一个忘了名字的 DEX 签的"无限授权",今天还在链上活着。

2017 年到 2023 年的所有授权类钓鱼都靠这个机制生效。攻击者诱导你签一次"无限 approve"(数额是 2^256 - 1,相当于无穷大),之后随时可以把你钱包里的对应代币转走。即使你后来再也没去过那个钓鱼网站,授权依然在生效。

EIP-2612 引入的 Permit 签名稍微好一点 —— 它有 deadline 字段,约定这条签名只能在某个时间戳之前被提交。但 deadline 是单条签名的时效,不是授权本身的时效。攻击者拿到一条 deadline 一年后的 Permit 签名,可以在这一年里任何时候用一次,钱就被划走。

常见误解

"我转出钱包里的钱,旧授权就失效了"。错。授权挂在"地址对地址"的关系上,跟余额无关。地址里没钱时授权依然存在,等你下次转钱回来,对方立刻可以划走。这就是为什么"中过签名钓鱼的地址要永远废弃"。

"硬件钱包里的资产没事"。错。硬件钱包只是签名时多一道物理确认,不改变授权本身的逻辑。你用硬件钱包签过的 approve 同样永久有效,攻击者依然能划走。

"换链就好了"。错。每条链的授权是独立的,但同一个地址在以太坊上的旧 approve 跟你在 Polygon、BSC、Arbitrum 上的授权是分开的。换链不解决以太坊上的历史问题,要分别去每条链上撤。Revoke.cash 支持多链切换。

延伸阅读

撤销操作的详细步骤:Revoke.cash 词条。Permit 的隐蔽性见 Permit 签名为什么这么危险?。授权钓鱼的完整图谱:钓鱼诈骗全图谱 · 2026 版