在Web3智能合约开发的初期阶段 ,Remix 提供了一个便捷的在线编译与部署环境。面对大型项目、复杂的依赖管理以及自动化的批量测试需求时,引入本地化的工程化框架成为了走向专业开发的必经之路。本文将重点解析业内主流的Hardhat开发框架,并详细梳理从环境初始化到核心脚本编写的完整工作流。
特别说明:本文的实战代码与架构解析均基于目前应用最为广泛的 Hardhat 2.x 版本。鉴于官方推出的 Hardhat 3.x 版本在底层架构、插件生态与配置逻辑上存在较大差异,后续将专门撰写一篇 Hardhat 2.x 与 3.x 的深度对比解析指南,敬请期待。
笔记来自:17小时最全Web3教程:ERC20,NFT,Hardhat,CCIP跨链_哔哩哔哩_bilibili,十分推荐大家学习该课程!
目录
[一、 框架选型:Hardhat与Foundry的演进方向](#一、 框架选型:Hardhat与Foundry的演进方向)
[二、 Node项目构建与Hardhat安装](#二、 Node项目构建与Hardhat安装)
[三、 融入Git版本控制工作流](#三、 融入Git版本控制工作流)
[四、 Hardhat核心架构与CLI指令解析](#四、 Hardhat核心架构与CLI指令解析)
[五、 核心代码示例:使用Hardhat编写部署脚本](#五、 核心代码示例:使用Hardhat编写部署脚本)

一、 框架选型:Hardhat与Foundry的演进方向
目前智能合约开发生态中,占据主导地位的框架主要为Hardhat与Foundry。开发者在进行技术选型时,需要根据团队的技术栈与项目痛点进行评估。以下是两者的核心特性对比:
| 对比维度 | Hardhat | Foundry |
|---|---|---|
| 底层语言 | JavaScript / TypeScript | Rust |
| 测试语言 | JavaScript / TypeScript (Mocha, Chai) | Solidity |
| 编译与执行速度 | 常规水平,依赖Node.js环境 | 极快,原生支持并行编译与测试 |
| 生态与插件 | 极其丰富,拥有成熟的NPM包管理生态 | 相对较新,但增长迅速,支持Forge标准库 |
| 适用人群 | 熟悉前端与Node.js栈的全栈开发者 | 追求极致性能、精通Solidity底层的开发者 |
Hardhat凭借其与Web前端生态的无缝对接,依然是绝大多数企业级项目和初学者的首选方案。通过Hardhat,开发者可以利用熟悉的JavaScript语法编写极其复杂的部署逻辑与测试用例。
二、 Node项目构建与Hardhat安装
Hardhat的核心完全基于JavaScript编写。在代码编辑器中搭建开发环境,首要任务是初始化一个标准的Node.js项目。开发者需要在系统终端执行项目初始化命令,系统会通过交互式问答引导创建一个 package.json 文件,用以统一管理后续的所有依赖包。具体的终端执行过程如下代码块所示:
bash
D:\Projects\Web3_Hardhat_Learning>npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
package name: (web3_hardhat_learning)
version: (1.0.0)
description:
entry point: (index.js)
About to write to D:\Projects\Web3_Hardhat_Learning\package.json:
{
"name": "web3_hardhat_learning",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"description": ""
}
Is this OK? (yes)
项目初始化就绪后,即可将Hardhat正式引入当前工程。在终端执行包安装命令时,推荐附加 --save-dev 参数。该参数向系统明确声明,Hardhat仅作为开发环境的依赖工具,防止其被打包进最终的生产环境代码中,从而保持项目的极简与轻量化。相应的依赖安装指令如下:
javascript
D:\Projects\Web3_Hardhat_Learning>npm install --save-dev hardhat
三、 融入Git版本控制工作流
在正式编写合约前,将工程接入版本控制系统是企业级开发的标准动作。开发者可以在项目根目录执行 git init 命令,系统会即刻建立一个隐藏的 .git 文件夹以接管版本控制。在Git的底层架构中,文件状态流转存在三个核心阶段,具体定义如下:
| 状态名称 | 核心定义与操作逻辑 |
|---|---|
| Untracked (未追踪) | 新建的文件默认处于该状态,系统尚未将其纳入版本历史记录中。 |
| Staged (已暂存) | 开发者通过执行 git add 指令,将未追踪或已修改的文件推入暂存区,为下一步提交做准备。 |
| Committed (已提交) | 执行提交指令后,代码将作为固定的历史节点被永久记录在本地仓库中。 |
四、 Hardhat核心架构与CLI指令解析
在Hardhat工程初始化完成后,系统会自动生成标准化的目录结构,通常包含存放合约源码的 contracts/ 目录、存放部署逻辑的 ignition/ 或 scripts/ 目录,以及用于自动化测试的 test/ 目录。全局的编译与网络参数均由根目录下的 hardhat.config.js 文件统一调配。
结合终端可视化的命令面板,Hardhat CLI(命令行工具)提供了一套极其丰富的内置任务集合,开发者最常用的核心指令如下表所示:
| CLI 指令 | 功能解析 |
|---|---|
npx hardhat compile |
自动编译 contracts/ 目录下的整个项目,并生成供前端调用的ABI等所有构建产物。 |
npx hardhat test |
运行Mocha测试框架,执行自动化测试脚本以验证合约的业务逻辑。 |
npx hardhat run |
在编译项目后,运行开发者自定义的JavaScript部署或交互脚本。 |
npx hardhat flatten |
将合约文件及其所有依赖树压平并打印,便于直接在以太坊浏览器上进行源码开源验证。 |
npx hardhat clean |
清除本地的缓存以及所有的编译构建产物,通常在开发环境异常时用于重置系统状态。 |
五、 核心代码示例:使用Hardhat编写部署脚本
为了直观展现Hardhat的工程化优势,以下展示一个基于 Hardhat 2.x 的基础合约部署脚本(通常位于 scripts/deploy.js)。该脚本利用 ethers.js 库与本地区块链网络进行交互,彻底替代了Remix中繁杂的手动操作流程。
javascript
// 引入 Hardhat 运行环境
const hre = require("hardhat");
async function main() {
// 获取合约工厂,"FundMe"为编译后的合约名称
const FundMe = await hre.ethers.getContractFactory("FundMe");
// 触发合约部署请求
const fundMe = await FundMe.deploy();
// 等待合约部署交易在区块链上被打包确认
await fundMe.waitForDeployment();
// 打印部署成功后的智能合约地址
console.log(`FundMe 合约已成功部署至地址: ${fundMe.target}`);
}
// 捕获异步执行过程中的异常
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
在此脚本中,有两个极具代表性的核心概念。首先是**hre** (Hardhat Runtime Environment),它是 Hardhat 的运行时环境,封装了当前项目的所有配置与底层网络能力 ,允许开发者在脚本中直接调用全套工具组件。其次是紧密结合的**ethers.js 库,它是一个轻量且功能强大的以太坊交互接口,专门负责处理钱包交互、构建交易以及读取链上状态,是建立链下代码与链上智能合约通信的关键桥梁**。
开发者只需在终端敲击 npx hardhat run scripts/deploy.js,系统便会自动启动本地测试网络、分配测试账户、执行部署逻辑并输出最终的合约地址。这种基于代码定义一切的开发模式,为构建复杂的Web3商业应用奠定了坚实的工程基石。