Hardhat部署安全审计:上线前必查的 10 个工程化检查项
合约安全审计不只关注代码逻辑漏洞,部署环节同样是事故高发区域。本文聚焦 Hardhat部署安全审计的工程化视角,整理 10 个上线前必查的检查项,配合 Hardhat 工具链给出具体落地方法。代码层审计可以同时参考 Hardhat漏洞案例 系列。
一、私钥与签名身份的隔离
第一条铁律:部署私钥不能与运营私钥共用。建议:
- 部署私钥仅在 CI Secrets 中存在,部署完成后立即轮换
- 关键运营动作走 Safe 多签或 Defender
- 私钥永远不出现在仓库、日志、聊天工具中
这一规范在 Hardhat部署最佳实践 中被列为最高优先级。
二、构造参数完整性校验
部署脚本必须把构造参数写成显式变量,不能硬编码在 deployContract 调用里。脚本运行时先打印一遍参数,部署前要求人工二次确认。完成后通过区块浏览器调用只读函数比对,确保链上状态与脚本传入一致。
三、权限初始化校验
部署完成后立即调用:
owner():是否为预期多签地址paused():是否为初始预期状态roles:所有自定义 role 是否分配正确proxyAdmin:可升级合约的管理员是否为治理多签
这些字段错一个,资产就可能被错误地址掌控。检查脚本可以沉淀到 tasks/audit.ts,未来每次部署后自动跑一遍。
四、storage 布局对比
对于可升级合约,每次升级前必须跑 storage layout 对比:
- 使用 OpenZeppelin Upgrades 内置
validateUpgrade - 如果新增字段,确保只追加到 layout 末尾
- 如果字段类型变化,必须改名以触发警告
这一项在 Hardhat部署漏洞案例 历史事故中是最常见的杀手。
五、Reentrancy 与外部调用顺序
虽然属于代码层审计,但部署脚本里也需要校验:
- 使用 OpenZeppelin
ReentrancyGuard的函数是否都加了nonReentrant - 部署完成后用模拟交易跑一遍核心路径,验证 CEI 模式
- 任何 external call 都必须有失败处理
六、币安智能链与多链一致性
多链部署时,必须确保每条链上的合约代码字节一致:
- 用同一 commit 部署,CI 中固化 git sha
- Verify 通过后比对 etherscan 与 bscscan 上的 bytecode
- 跨链桥配置同步更新,避免一条链已升级另一条未升级造成的不一致
七、依赖库版本锁定
package-lock.json 与 foundry.lock 必须提交仓库,OpenZeppelin 等依赖锁定到具体小版本。审计报告对应的版本号必须与部署版本一致,否则审计就是无效的。
八、部署日志与事件记录
部署脚本生成的 deployments JSON 应包含:tx hash、block number、构造参数、部署者地址、git sha、审计报告链接。这份记录是事后追溯的唯一可信源,必须入库并定期备份。
九、应急响应预案
上线前要准备好:
- Pausable 按钮的触发流程
- 多签成员的联系方式与值班表
- Tenderly/Defender 告警规则
- 资金撤离/迁移路径
这些预案与 Hardhat部署完整教程 末尾介绍的运维流程相辅相成。
十、上线后的持续监控
部署不是终点。建议接入 Tenderly 监听异常事件,每日跑只读检查脚本对比关键参数,每周做一次治理动作回顾。安全是持续的工程实践,靠的是流程而不是某一次审计。把以上 10 项检查写进部署 checklist,让每一次上线都按清单执行,是工程化降低事故率最直接的方式。