Gas优化漏洞案例复盘
在以太坊与 Binance 智能链上,Gas 优化几乎是每个项目方都会做的事。但有些「节省」事后看来代价惨重。本文整理几起代表性的 Gas优化漏洞案例,按成因归类,帮助团队建立更稳健的优化纪律。
案例一:存储槽冲突导致代理合约状态错乱
某 DeFi 项目为了压缩存储成本,把多个状态变量塞进同一个 uint256 槽位。代理升级后,新版本逻辑合约错误地把第 0 槽当作普通变量使用,而第 0 槽实际上是 ERC-1967 规定的 implementation slot。结果,攻击者通过一笔交易就把代理指向恶意逻辑合约。
教训:任何位压缩都必须配合显式的存储布局图(storage layout),并在 CI 中比对升级前后两个版本的布局。
案例二:unchecked 包裹用户输入引发铸币漏洞
一个 NFT 项目把铸币函数中的所有算术运算都用 unchecked 块包裹,目的是省下 0.8 默认的溢出检查 Gas。结果,攻击者传入一个接近 type(uint256).max 的 amount,绕过总量限制,铸出无数 NFT。