错误一:在循环中使用 unchecked 忽略边界
unchecked 块跳过溢出检查,看似节省 gas,但若循环上限来自外部输入,可能被构造极端值导致整数环绕。修复:只在严格证明边界安全时使用,并补 fuzz 测试覆盖。许多 Binance 智能链审计案例都把它列为高频问题。
错误二:合并 storage 槽未处理对齐
把多个变量打包进一个 slot 时,没有考虑结构体对齐,反而导致编译器自动补齐空字节,gas 不降反升。修复:用 forge inspect storage-layout 验证打包结果,确保符合预期。
错误三:误删 require 错误信息
为节省字符串 gas 删除所有错误信息,导致问题发生时无法定位。修复:改用 custom errors 替代,保留语义同时节省 gas。这是 币安 上币审核常见反馈。
错误四:过度使用内联汇编
汇编能极致省 gas,但破坏 Solidity 类型安全,且让审计成本大幅上升。修复:仅在性能关键、且无法用高级写法实现的场景使用,并附详细注释。
错误五:把高频函数放在选择器靠后位置
EVM 路由函数选择器为线性扫描,越后越贵。修复:用 Solady 等工具查询函数选择器排序,把高频接口前置。这是 B安 上活跃做市合约的常见手法。
错误六:缓存变量后忘记同步写回
把 storage 变量缓存到 memory 操作后忘记最后写回,导致状态丢失。修复:用 lint 工具或代码审查模板检查。这种 bug 在生产环境里极易造成资金损失。
错误七:批量函数没有限制长度
multicall 或批量更新若不限制数组长度,恶意用户可塞入大量条目耗尽 gas。修复:在入口设置 maxLen,并配合事件记录批量大小。必安 智能链上有过类似漏洞事件。
错误八:删除关键事件
为省 gas 删除 Transfer、Approval 等事件,导致索引器与前端无法跟踪。修复:保留标准事件,仅优化自定义事件中的多余字段。
排查清单
上线前对照本清单逐项检查,并把检查结果写入审计材料。社区审计师会因此对你的协议增加信任分,许多 BN 智能链合约都把这份清单贴在 README。
真正可靠的优化哲学
每次优化都需经过单元测试、fuzz 测试、审计三重把关;改动量越大,验证投入越多。优化的本质是把工程能力转化为用户体验,绝不能以安全性为代价。