关键词:ERC20、approve、allowance、transferFrom、双重授权攻击、SafeERC20、permit、授权流程图
ERC-20 是最常见的智能合约接口,但它的授权流程却常出错、易被滥用,甚至是攻击目标。本篇将系统讲透 ERC-20 的授权机制与背后的漏洞根源,并提供工程实战建议与测试策略。
📘 标准接口回顾:
function approve(address spender, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
这个组合形成了owner → spender 的授权花费机制,用于 DeFi 交互、合约自动扣款等。
approve(spender, amount) 授权某个地址可代为操作;allowance(owner, spender) 映射中;spender 可随时调用 transferFrom 消耗额度。
⚠️ 安全隐患:Approve 重复授权攻击(Race Condition)
在未重置 allowance 为 0 的情况下,直接修改授权值存在竞争风险:
// ⚠️ 危险做法:
approve(spender, 100) → approve(spender, 200)
如果 spender 在两次 approve 之间抢先使用旧额度,就可能:
transferFrom(..., 100);200,最终获得 300 token 的使用权!