本文讨论了智能合约审计中存在的效率低下问题,建议通过在审计前进行充分准备,包括完善文档、进行代码清理、充分测试等手段,从而降低审计成本并提高效率。文章还提供了一个详细的审计前准备清单和常见问题解答。
智能合约审计很可能是你工程预算中最大的一笔支出。如果你是 Web3 领域的首席工程师或 CTO,你肯定知道其中的流程:你为顶级的安全研究人员支付高额费用,而且通常要等待数月才能获得一个名额。
但是,这种模式中隐藏着一个效率低下的问题。相当大一部分的审计成本——保守估计为 30%——本质上是对未做好准备的一种惩罚。
当你提交一个未经过处理的代码库时,你实际上是强迫那些高薪的审计员(每天收费高达 1,500 美元以上)去执行一些低级别的工作:解读没有文档记录的架构,映射变量名,或者标记一些免费的 linter 就能捕获的语法错误。这增加了“发现时间”,拖长了参与时间,并使最终的账单膨胀。
你的目标是将安全性“左移”。通过提供一个经过清理、有文档记录和严格测试的代码库,你可以让审计员跳过那些繁琐的工作,直接专注于高价值的逻辑验证。

以下是降低部署风险和优化审计费用的技术清单。
降低成本最有效的方法是定义“操作理论”。如果审计员必须从代码中反向工程你的意图,那么你就是在为他们的猜测买单。
实施严格的 NatSpec:标准化内联文档。每个公共和外部函数都需要 @notice、@param 和 @return 标签。
为什么: 它突出了“意图与实现”之间的差距。如果注释说“扣除 1% 的费用”,但代码计算的是 0.1%,审计员会立即发现它。NatSpec 是这种文档的行业标准。
可视化架构:不要让审计员在脑海中绘制你的系统。提供:

定义“冻结提交”:标记一个特定的 git 提交哈希(例如,git tag audit-v1),并且不要碰它。推送“快速修复”会移动行号并使审计员正在进行的注释失效,从而导致沮丧和“差异审查”附加费。

在房屋评估之前,你会先打扫房屋。一个“嘈杂”的代码库会掩盖漏洞并发出粗心大意的信号。
强制执行 Linter 合规性:使用 Solhint 或 Prettier-Solidity。如果审计员不得不指出样式不一致之处,你就是在浪费他们的时间。代码库应该看起来很标准,以便他们可以快速扫描它。
消除死代码:从生产版本中删除未使用的变量、注释掉的代码块和测试文件。
锁定依赖项:避免浮动 pragma(例如,^0.8.0)。锁定你的编译器版本(例如,0.8.19)并在 package.json 中锁定依赖项,以确保审计后的字节码与部署的字节码完全匹配。
低测试覆盖率是项目未准备好进行审计的主要指标。
分支覆盖率(“悲伤路径”):仅测试“快乐路径”是不够的。你必须测试合约在应该 revert 时是否会 revert。确保每个 require 语句都在测试用例中被触发。

运行静态分析 (Slither):Slither 是基于 Python 的静态分析的行业标准。它只需要几秒钟即可运行。
规则: 修复每个警告或准确记录为什么它是误报。提交包含 50 多个 Slither 警告的代码会迫使审计员在噪声中跋涉。
模糊测试(基于属性):单元测试验证已知的逻辑;模糊器寻找“未知的未知”。使用 Foundry (Forge) 或 Echidna 等工具来定义不变量(例如,total_deposits == total_withdrawals + current_balance),并使用随机输入来轰击合约。

视频演练:录制一个 30 分钟的 loom 视频,让首席开发人员解释架构和资金流。这会将审计员的学习曲线从几天缩短到几个小时。
明确定义范围:创建一个 scope.txt 文件,列出要检查的特定文件。明确排除模拟合约、部署脚本和未修改的第三方库(如 OpenZeppelin)。
| 类别 | 行动项目 | 准备就绪目标 |
|---|---|---|
| 文档 | 技术白皮书 | 定义公式和威胁模型 (LaTeX) |
| 文档 | NatSpec | 100% 的公共接口被注释 |
| 代码 | Linting | 零错误 (Solhint/Prettier) |
| 测试 | 覆盖率 | >95% 的分支覆盖率 |
| 测试 | 模糊测试 | 运行 24 小时以上且没有失败 |
| 工具 | 静态分析 | Slither 报告干净(或已记录) |
| 运营 | 冻结 | 识别并标记提交哈希 |
不要等到审计才发现“唾手可得的果实”。
行动:立即在本地安装 Slither,并针对你的核心合约运行它。这只需要不到 5 分钟的时间。如果它标记了你尚未发现的问题,那么你还没有准备好进行审计。现在修复这些问题不会花费你任何费用;在审计期间修复它们会花费你可计费的时间。
在 Zealynx,我们专注于帮助协议准备并接受严格的安全审计。无论你需要审计前审查来清理你的代码库,还是需要全面的安全参与,我们的团队都能确保你的协议安全、优化并为部署做好准备。
在你的计划发布前至少 6-8 周安排你的审计。这包括 2-3 周的准备时间(实施此清单),2-3 周的实际审计时间,以及 1-2 周的修复和重新审查时间。通过在发布前 1-2 周安排审计来仓促进行审计会迫使审计员更快地工作(增加成本并可能遗漏问题),并且没有为需要架构更改的关键发现留下缓冲。
不能。一旦审计开始,代码库必须在特定的提交哈希处冻结。任何更改——即使是很小的错误修复——都会使审计员正在进行的工作失效,移动行号并更改他们已经审查过的逻辑。这将触发昂贵的“差异审查”,审计员必须重新验证所有内容。如果你在审计期间发现了一个关键问题,请将其记录在初始审计报告交付后发生的修复阶段。
不能。Slither 是一种基线卫生工具,可以捕获已知的常见漏洞(如重入或未初始化的变量)。它_不_了解你的协议的特定业务逻辑或经济不变量。通过 Slither 是_准备好_进行审计的最低要求,但它不能替代人工审计或基于属性的模糊测试。
目标是 95%+ 的分支覆盖率,而不仅仅是行覆盖率。分支覆盖率确保你测试每个 if/else 和 require 语句的成功情况(“快乐路径”)和失败情况(“悲伤路径”)。许多协议错误地将目标定为 90% 的行覆盖率,这仅检查代码是否运行,而不是错误条件是否正确 revert。审计员会将未经测试的分支标记为潜在漏洞,因为未处理的边缘情况是 DeFi 中常见的利用向量。
NatSpec(自然规范)是 Solidity 的标准文档格式,它在函数上方使用 @notice、@param 和 @return 等标签。审计员需要它,因为它揭示了“意图与实现”之间的差距——如果你的注释说“扣除 1% 的费用”,但你的代码计算的是 amount * 100 / 10000 (0.1%),审计员会立即发现这个错误。如果没有 NatSpec,审计员必须仅从代码中反向工程你的意图,这会大大增加发现时间和审计成本。
浮动 pragma(例如,pragma solidity ^0.8.0;)允许编译器使用从 0.8.0 到 0.8.x 的任何版本。风险在于,如果在审计和部署之间发布了新的编译器版本,你审计的字节码可能与你部署的字节码不同。锁定版本(例如,pragma solidity 0.8.19;)可确保确定性编译——审计的代码和部署的代码是逐字节相同的。这消除了部署错误的一类问题,并防止了“但在审计环境中它可以工作”的问题。
- 原文链接: zealynx.io/blogs/pre-aud...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!