审计准备清单

本文档提供了一份智能合约审计准备清单,旨在帮助开发者在代码审计前进行自查,主要包括代码质量、测试覆盖率、安全工具使用、文档编写等方面,以确保代码的质量和安全性,从而更有效地进行审计。

审计准备检查清单

最低质量检查清单

  • [ ] 使用Solidity的最新主要版本。
  • [ ] 尽可能使用已知/已建立的库。OpenZeppelin contracts 是首选,因为它们将安全性置于一切之上,并且大多数审计员已经熟悉它们。Solmate contracts 对于 gas 优化至关重要的函数来说,可能是一个不错的选择。
  • [ ] 具有针对“happy path”用户故事的测试,以及针对应该失败的操作的revert测试。所有测试都应该通过。
  • [ ] 纳入模糊测试。模糊测试已被证明在发现错误方面非常有效。像 FoundryEchidna 这样的工具允许无状态和有状态的模糊测试。Foundry 不变量参考指南 概述了如何设置用于模糊测试的合约不变量。如果你使用的是 Hardhat,那么包含上述工具之一来增强你的测试能力也是值得的。
  • [ ] 在你的代码上运行静态分析工具(首选 SlitherMythX 是替代方案)并考虑它告诉你的内容。他们经常为非问题提出警告,但他们有时可以抓住唾手可得的东西,所以值得这样做。
  • [ ] 准备部署脚本和模拟升级脚本(如果适用),并将它们作为审计范围的一部分。部署和升级与运行时代码一样重要,并且需要相同程度的安全关注。
  • [ ] 记录所有函数。对 public/external 函数使用 NatSpec documentation。将此视为合约公共接口的一部分。
  • [ ] 合约在编译时没有任何来自编译器的错误或警告。
  • [ ] 通过拼写检查器运行代码。
  • [ ] 尽可能避免使用汇编。使用汇编会增加审计时间,因为它抛弃了 Solidity 的保护措施,并且必须更加仔细地检查。
  • [ ] 记录 unchecked 的使用。具体描述为什么对每个代码块不执行算术检查是安全的。最好是针对每个操作。
  • [ ] 任何可以设为 externalpublic 函数都应该设为 external。这不仅仅是 gas 的考虑,而且还减少了审计员的认知负担,因为它减少了可以调用该函数的可能上下文的数量。
  • [ ] 在任何可能的地方使用 函数需求-效果-交互-协议不变量 (FREI-PI) 模式。将所有 token 和 ETH 转移视为“交互”。验证你的系统级协议不变量在每次交互结束时仍然成立。
  • [ ] 至少让你组织外部的一位受信任的 Solidity 开发人员或安全人员对你的合约进行完整性检查。如果你的代码一团糟并且需要进行重大更改,你希望尽早从受信任的朋友(免费)那里听到这些信息,而不是在昂贵的审计之后。

锦上添花

  • [ ] 使用形式验证工具来验证不变量,但请注意,在实践中,当前的形式验证工具并非万能药,并且有一些未处理的边缘情况。CertoraRuntime Verification 是此类中常用的(付费)工具的示例。
  • [ ] 写下你的外部安全假设。这不必非常正式。例如,“我们假设owner 不是恶意的,Chainlink 预言机不会谎报 token 价格,Chainlink 预言机将始终至少每 24 小时报告一次价格,owner 批准的所有 token 都是没有转移 hook 的符合 ERC20 标准的 token,并且永远不会有超过 30 个区块的链重组。” 这有助于你了解事情可能出错的方式,即使你的合约没有错误。优秀的审计师将能够帮助你了解你的假设是否现实。他们也可能能够指出你正在做出的你没有意识到的假设。
  • [ ] 如果你不确定自己代码中的某些内容,或者你希望审计员花更多时间在某些领域,请列出这些内容以与审计员分享。
  • [ ] 为审计员添加范围界定详细信息。Code4rena 准备中使用的表格在下面的可折叠部分中提供作为一个例子。 <details> <summary>审计范围界定详细信息</summary>

    • 如果你有公共代码仓库,请在此处分享:
    • 有多少合约在范围内?:
    • 这些合约的总 SLoC 是多少?:
    • 有多少外部导入?:
    • 范围内合约有多少单独的接口和结构定义?:
    • 你的代码通常使用组合还是继承?:
    • 有多少外部调用?:
    • 你的测试提供的总体行覆盖率百分比是多少?:
    • 是否需要了解代码库的单独部分/获取上下文才能审计协议的这一部分?:
    • 如果是这样,请描述所需的上下文:
    • 它是否使用预言机?:
    • 该 token 是否符合 ERC20 标准?:
    • 你是否期望 ERC721、ERC777、FEE-ON-TRANSFER、REBASING 或任何其他非标准 ERC 与智能合约交互?:
    • 是否有任何新颖或独特的曲线逻辑或数学模型?:
    • 它是否使用时间锁功能?:
    • 它是 NFT 吗?:
    • 它是否有 AMM?:
    • 它是流行项目的 fork 吗?:
    • 它是否使用 rollups?:
    • 它是多链的吗?:
    • 它是否使用侧链?:
    • 描述你希望解决的任何特定领域。例如,请尝试破坏 XYZ。": </details>
  • 原文链接: github.com/nascentxyz/si...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
nascentxyz
nascentxyz
江湖只有他的大名,没有他的介绍。