name: smart-contract-audit description: 智能合约部署前审计清单。仅限手动调用——在将任何智能合约部署到测试网或主网前使用。涵盖静态分析、访问控制、升级安全性、经济向量、Gas DoS、外部依赖、事件和文档。 disable-model-invocation: true
智能合约审计清单
在任何部署前运行此清单。逐节进行,不要跳过。
1. 静态分析
- [ ] 运行
forge build—— 零警告 - [ ] 运行
slither .(如果已安装)—— 审查所有发现 - [ ] 运行
forge test -vvv—— 所有测试通过 - [ ] 运行
forge coverage—— 检查关键路径的覆盖率 - [ ] 没有浮动 pragma(
^)—— 固定确切的 Solidity 版本 - [ ] 没有未使用的导入、变量或函数
2. 访问控制
- [ ] 所有外部/公共函数都有适当的访问修饰符
- [ ] 管理员函数使用
onlyOwner、onlyRole或等效方法 - [ ] 没有
tx.origin检查(使用msg.sender) - [ ] 所有权转移是两步的(
Ownable2Step) - [ ] 关键操作受时间锁或多签保护
- [ ] 初始化函数只能调用一次(如果是可升级合约)
3. 重入与CEI
- [ ] 所有外部调用遵循检查-效果-交互模式
- [ ] 在具有外部调用和状态更改的函数上使用
ReentrancyGuard - [ ] 考虑了跨函数重入(共享状态)
- [ ] 考虑了只读重入(回调期间的视图函数)
4. 升级安全性(如适用)
- [ ] 存储布局与先前版本保持一致
- [ ] 没有构造函数逻辑(使用
initializer) - [ ] 在实现构造函数中使用
_disableInitializers() - [ ] 使用 EIP-1967 存储槽存储代理状态
- [ ]
forge inspect存储布局与先前版本比较 - [ ] 升级函数受访问控制
5. 经济/DeFi向量
- [ ] 闪电贷抵抗(无同区块治理/定价)
- [ ] 交换的滑点保护(最小输出量、截止时间)
- [ ] 预言机新鲜度检查(Chainlink:
updatedAt、answeredInRound) - [ ] 不依赖单一来源的现货价格
- [ ] 代币批准模式安全(无理由不进行无限批准)
- [ ] 处理费用转移代币(如果接受任意 ERC-20)
- [ ] 处理回基代币(如果接受任意 ERC-20)
6. Gas 与 DoS
- [ ] 没有对用户控制数组的无限制循环
- [ ] 支付使用拉取而非推送模式
- [ ] 考虑了外部调用的 Gas 限制
- [ ] 没有针对迭代的区块 Gas 限制攻击
- [ ] 回退/接收函数没有复杂逻辑
7. 外部依赖
- [ ] OpenZeppelin 版本固定且最新
- [ ] 外部合约地址已验证(未错误地硬编码)
- [ ] 接口兼容性与实际部署的合约已验证
- [ ] 关键逻辑不依赖
block.timestamp(15秒差异) - [ ] 时序不依赖
block.number(因链而异)
8. 事件与 NatSpec
- [ ] 所有状态更改都发出事件
- [ ] 事件的关键字段有索引参数(最多3个)
- [ ] 所有公共/外部函数都有 NatSpec
@notice - [ ] 所有参数都有 NatSpec
@param - [ ] 所有返回值都有 NatSpec
@return - [ ] NatSpec
@dev用于实现说明
9. 部署验证
- [ ] 构造函数参数已记录并验证
- [ ] 部署脚本在本地分叉上测试
- [ ] 合约在区块浏览器上已验证
- [ ] 部署后初始状态已验证
- [ ] 管理员地址正确(主网不是部署者EOA)
严重性分类
| 严重性 | 影响 | 行动 |
|---|---|---|
| 严重 | 资金损失,访问控制绕过 | 阻止部署 |
| 高 | 重大财务风险,DoS | 阻止部署 |
| 中 | 有限影响,边缘情况 | 主网前修复 |
| 低 | 最佳实践,Gas 优化 | 方便时修复 |
| 信息 | 风格,文档 | 可选 |
审计后
完成此清单后:
- 记录所有发现及其严重性
- 修复所有严重和高危问题
- 修复后重新运行清单
- 对于高价值合约,考虑专业审计