我们不做审计。我们交付并加固智能合约代码,然后由外部机构审计。在那段审计窗口打开之前,我们跑这份30 项审前清单,分为6 类:编译器与工具链、访问控制与角色、算术与溢出、外部调用与重入、可升级性与存储、Gas 与 DoS 面。下面每一项都在我们或同行的真实项目里烧过。把 30 项全部清掉,按我们的项目历史,能把审计师在我们移交品上的发现数减少大约 60% 到 80%,意味着更便宜的审计和更快的主网。
这是我们希望在 Scramble Pay、Quivr、Lightbridge 以及 Account Abstraction 工作的第一天就有人递给我们的列表。我们不称之为审计。它是一次加固评审,目的是让审计变得无聊。
马上要进审计?
预约免费咨询6 类,每类 5 项,共 30 项。我们把清单当成关卡。任一项失败,合约不会离开我们的仓库,除非被修复或被客户书面豁免并说明原因。我们把它和 TDD 工作流以及 QA 服务 一起搭配,使每个修复都带回归测试落地。
foundry.toml 或 hardhat.config 中锁定单一编译器版本。^0.8.20 这种浮动 pragma 意味着两位开发者能从同一份源码编译出两份不同字节码。main 的 git 依赖。每次依赖升级我们都做 diff。onlyOwner。我们把每个函数映射到角色并记录部署时谁持有它。Ownable2Step 或等价方案。一步转移上的笔误是不可恢复的。_disableInitializers(),无例外。unchecked 块附注释解释为何在调用点不可能溢出。/ 并逐一评审。uint256 到 uint128 或更小的转换都有显式上限检查或 SafeCast。onERC1155Received、ERC721 onERC721Received。假定任何外部代币都是敌对的。(bool ok, ) = target.call(...) 不检查返回数据是一个等着发生的静默失败。
"加固让审计变得无聊。无聊的审计能上线。"
forge inspect 存储布局,拒绝任何被重排的 slot。uint256[50] private __gap;。try/catch。forge snapshot 测量,超过 5% 的回归就驳回。审计师按代码行和天数收费。把未加固的代码送审,就是花 每天 €2,000 到 €4,000 让资深工程师去找那些你自己团队用 Slither 和 fuzz 框架就能抓到的 bug。在我们的项目历史里,移交审计前完成全部 30 项的项目,审计师发现数回来时只是个位数,大多是 informational。跳过清单的项目通常回来 30+ 发现,包括 critical,然后要重新审计、付全价。
这是 Wavect 与一家通用型外包的差别。完整背景请见 Wavect vs 一家通用型开发外包。我们用一种把安全放在第一位的节奏构建 Web3 系统,这也内建在我们的区块链服务里,因此审计变成签字而非救火。
该项目的 Wavect 技术负责人。他们对每一项以提交引用加测试引用签字。客户在审计移交包里收到签字清单,外部审计师会和代码一起拿到这份清单。审计师喜欢这样,因为这告诉他们把注意力集中到哪里。
30 项、6 类、每次发布一份签字文档。这就是审前加固评审。我们不替代外部审计师,也从不这样声称。我们做的是把已经清掉明显向量的代码递给他们,让他们的费用买到深层发现,而不是显然的发现。
如果你即将把一份 Solidity 代码库送上主网,却没跑过结构化加固,你就在用审计的价做工程的活。书审计档期之前,先来找我们,不是之后。
在交付智能合约?
预约免费咨询