为什么需要一套规范的 Hardhat 部署教程
Hardhat 已经成为 Solidity 项目最主流的开发框架,但「能编译」和「能上主网」之间还有相当距离。一份完整的 Hardhat 部署教程,必须覆盖从本地测试链到生产网络的所有细节:编译产物管理、私钥不落地、Gas 价格估算、部署脚本幂等、合约源码验证。这些环节任何一处出错,都可能让一次主网部署变成事故。
对于以 bn 智能链为主战场的项目,部署流程的规范化更重要:链上 Gas 虽然便宜,但出错后的迁移成本依然不低。
项目结构与网络配置
初始化 Hardhat 项目后,建议保持以下目录约定:
contracts/业务合约源码scripts/部署脚本,每个网络一份独立文件deploy/使用hardhat-deploy插件后的描述式部署test/单元测试与集成测试tasks/自定义命令行任务,例如「快速 verify」
在 hardhat.config.ts 里为 必安 智能链等目标网络分别配置 url、chainId、accounts,并通过环境变量注入私钥,避免直接写入代码仓库。
私钥与密钥管理
生产部署的核心是「私钥永远不落地」。推荐做法:
- 开发阶段使用
dotenv加载本地私钥,仅用于测试网 - 主网部署使用硬件钱包或 KMS 服务签名,Hardhat 通过
@nomicfoundation/hardhat-ledger或自定义 signer 注入 - CI 环境只允许调用 dry-run 与编译,禁止保管主网私钥
部署脚本的幂等设计
好的部署脚本应当具备幂等性:第二次执行不会重复部署同一合约。常见模式是先查询链上某地址是否已有代码,再决定走部署还是复用分支。使用 hardhat-deploy 插件可以省去自己维护「合约地址表」的工作量,它会自动生成 deployments/<network>/ 目录持久化记录。
在 B安 智能链等多人协作的环境下,这种自动持久化对避免「同事重复部署同名合约」尤其有用。
合约源码验证
部署完成后必须做源码验证,否则浏览器上呈现的是字节码,用户无法审计。安装 @nomicfoundation/hardhat-verify 插件后,一条命令即可向 Etherscan、BscScan 等主流浏览器提交源码。注意 settings 中编译器版本、优化器开关必须与部署时完全一致,否则验证会失败。
常见错误排查清单
- nonce 冲突:通常是同一私钥并发部署导致,串行执行即可
- Gas 不够:上调
gasLimit或使用 estimateGas 自动计算 - 合约 size 超限:开启 IR 优化或拆分合约
- verify 失败:核对优化器参数、依赖库地址是否对齐
与 CEX 资金通道的衔接
部署完成后,项目方往往需要把测试用的资金从 BN 等 CEX 出金到部署地址用于初始化流动性。建议把部署、初始化、注资作为三个独立阶段,每个阶段都留下可审计的链上痕迹,避免事后追溯困难。这样的 Hardhat 部署教程才算真正闭环。