Hardhat部署开发教程:从合约编写到主网上线的工程化路径
Hardhat 已经成为 Solidity 开发者最常用的本地工具,但从写完合约到真正部署到主网,中间还有大量值得规范化的工程细节。本文围绕 Hardhat部署开发教程的核心环节,按顺序串联起开发流程,让你写出来的部署脚本既可重复运行又易于审计。系统了解工具栈可以先看 Hardhat是什么。
一、项目初始化与目录约定
用 npx hardhat init 创建项目后,建议立刻规范目录:
contracts/放主合约与接口scripts/放部署与运维脚本deployments/保存每次部署的地址、ABI、tx hashtasks/写自定义任务,例如批量给地址打白名单
这种目录结构在 Hardhat最佳实践 中也是默认推荐。hardhat.config.ts 里使用 TypeScript 而非 JS,编译期就能拦下网络名拼写错误等低级问题。
二、网络配置与私钥管理
部署的核心是网络配置。建议为每条目标链单独配置一段:本地 anvil、测试网 sepolia、币安智能链 bsc-mainnet 等。永远不要把私钥写进配置文件,应该走 .env 加 dotenv 加载,并把 .env 加入 gitignore。生产部署建议进一步用硬件钱包或 KMS 代签,杜绝私钥落盘。这也是 Hardhat漏洞案例 中出现频率最高的安全教训。
三、合约编译与产物校验
执行 npx hardhat compile 之前,先在 hardhat.config.ts 里锁定 Solidity 版本与 optimizer runs。不同 runs 值对 Gas 消耗和合约大小影响显著,部署到主网前建议跑一遍 gas-reporter 对比。编译完成后会在 artifacts/ 与 cache/ 下生成产物,CI 中应该把这两个目录加入构建产物归档,便于后续 Verify。
四、部署脚本的写法
推荐使用 ethers v6 与 hardhat-ethers 插件:
- 在
scripts/deploy.ts中通过ethers.deployContract('Token', [args])部署 - 调用
.waitForDeployment()阻塞到合约确认 - 把地址、网络名、tx hash 写入
deployments/<network>.json,方便后续脚本读取
更复杂的多步部署(先部署 Proxy 再 Init),建议使用 @openzeppelin/hardhat-upgrades 提供的 deployProxy,避免手写代理冲突。这一步与 Hardhat实战教程 中提到的模式一致。
五、Verify 与上链后自检
部署完成后必须 Verify 源码,否则区块浏览器上的合约对用户来说就是黑盒。Hardhat 自带 hardhat-verify 插件,配置好 etherscan/bscscan 的 API Key 后,一条命令即可完成验证。Verify 通过后,再用浏览器手动调用一次只读函数,确认初始化参数与预期一致;写一个集成脚本,用真实地址跑一遍核心业务逻辑,确保上线即可用。
六、币安智能链与多链注意事项
部署到币安智能链时,注意 RPC 限流与 gasPrice 模式仍是 legacy,需要在脚本里显式指定 type: 0。多链部署建议把网络列表抽到一个数组中遍历,避免脚本重复。配合 Hardhat迁移指南 中介绍的流程,可以做到「同一份脚本,多链一键部署」。
按照上述六步实践,你的 Hardhat 部署流程就具备了可重复、可审计、可回滚三大工程属性,从此告别「手动改一改 config 就部署」的混乱状态。