Hardhat 3 实战入门:以太坊智能合约开发环境搭建与核心功能
Hardhat 是什么?
Hardhat 是以太坊智能合约开发的事实标准工具链之一,由 Nomic Foundation 维护。它把编译、测试、部署、调试这些每天要重复几十遍的操作串成一条流水线,让你专注于写合约本身。
2026 年发布的 Hardhat 3 是一次大版本重构——底层模拟器从 JavaScript 重写为 Rust(EDR),编译和测试速度提升了 2-5 倍,同时新增了 Solidity 测试和 OP Stack 本地模拟。如果你还在用 Hardhat 2,升级的体感差异很明显。
核心功能拆解
本地开发网络(Hardhat Network)
Hardhat Network 是一个跑在本地的以太坊模拟器,每次运行测试时自动启动。你不需要连真实网络,不需要付费 Gas,合约部署和调用都是即时的。
实际开发中最有用的几个能力:
- 即时挖矿:每笔交易立刻出块,不用等出块时间
- 账户自动解锁:内置 20 个预充值账户,直接拿来部署和交互
- 快照与回滚:
evm_snapshot/evm_revert让测试之间互不干扰,一个beforeEach回滚就能重置状态 - Hardhat 3 新增:OP Stack 网络本地模拟,部署到 Optimism 的合约可以本地跑通完整流程
javascript// hardhat.config.js - 配置本地网络 module.exports = { solidity: "0.8.28", networks: { hardhat: { chainId: 31337, // Hardhat 3: 模拟 OP Stack 网络 opStack: true } } };
智能合约编译
Hardhat 的编译模块处理了大部分你不想手动管的事:
- 多版本 Solidity 共存:一个项目里可以同时用 0.6.x 和 0.8.x 的合约,Hardhat 按版本分别编译
- 依赖自动解析:
node_modules里的@openzeppelin/contracts之类的库,直接import就行 - TypeChain 集成:编译后自动生成 TypeScript 类型绑定,合约交互时有完整的类型提示和自动补全
bashnpx hardhat compile # 输出:Compiled 3 Solidity files successfully
编译产物放在 artifacts/ 目录,包含 ABI 和 bytecode。配合 @nomicfoundation/hardhat-toolbox 插件,TypeChain 绑定会自动生成到 typechain-types/。
测试框架
Hardhat 内置的测试框架基于 Mocha + Chai + ethers.js,写测试的体验和写前端测试差不多。
Hardhat 3 的重大变化:除了 TypeScript 测试,现在也支持 Solidity 测试。纯逻辑的单元测试用 Solidity 写更快(省去 JS-EVM 通信开销),集成测试和涉及复杂交互的场景仍然用 TypeScript。
typescript// test/Token.ts - TypeScript 集成测试 import { expect } from "chai"; import { loadFixture } from "@nomicfoundation/hardhat-toolbox/network-helpers"; describe("Token", function () { async function deployTokenFixture() { const [owner, addr1] = await hre.ethers.getSigners(); const Token = await hre.ethers.getContractFactory("Token"); const token = await Token.deploy(1000000); return { token, owner, addr1 }; } it("应该能转账", async function () { const { token, owner, addr1 } = await loadFixture(deployTokenFixture); await token.transfer(addr1.address, 100); expect(await token.balanceOf(addr1.address)).to.equal(100); }); });
solidity// test/Token.t.sol - Solidity 单元测试 (Hardhat 3) import "forge-std/Test.sol"; import "../contracts/Token.sol"; contract TokenTest is Test { Token token; function setUp() public { token = new Token(1000000); } function testTransfer() public { address addr1 = makeAddr("addr1"); token.transfer(addr1, 100); assertEq(token.balanceOf(addr1), 100); } }
loadFixture 是测试性能的关键——它只在第一次调用时执行部署,后续测试复用快照,速度比每个 it 都重新部署快一个数量级。
部署与验证
Hardhat Ignition 是 Hardhat 3 官方的部署方案。和手写部署脚本不同,Ignition 用声明式的方式定义部署流程,自动处理依赖顺序、重试和并发。
typescript// ignition/modules/TokenModule.ts import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; export default buildModule("TokenModule", (m) => { const token = m.contract("Token", [1000000]); return { token }; });
部署到测试网并验证合约:
bashnpx hardhat ignition deploy ignition/modules/TokenModule.ts --network sepolia npx hardhat verify --network sepolia <CONTRACT_ADDRESS> 1000000
Ignition 的一个实际好处:如果部署中途失败(比如 Gas 不够),它会记住已完成的步骤,重试时跳过不再需要重新执行的部分。
调试工具
这是 Hardhat 区别于其他框架最明显的功能。
Solidity 堆栈跟踪:合约 revert 时,Hardhat 给出的错误信息包含完整的 Solidity 调用栈,而不只是一个 revert 地址。这在排查复杂合约交互时省了大量时间。
console.log:在合约里直接 console.log,和 JavaScript 一样用:
solidityimport "hardhat/console.sol"; function transfer(address to, uint256 amount) public { console.log("Transferring from", msg.sender, "to", to); console.log("Amount:", amount); // ... 转账逻辑 }
部署到真实网络时,console.sol 的调用会被编译器自动移除,不消耗额外 Gas。
插件生态
Hardhat 的插件系统是它最大的生态优势。几个常用插件:
| 插件 | 用途 |
|---|---|
@nomicfoundation/hardhat-toolbox | 一站式工具包,包含 ethers.js、TypeChain、测试工具等 |
@nomicfoundation/hardhat-verify | 在 Etherscan 等区块浏览器上验证合约源码 |
@openzeppelin/hardhat-upgrades | 支持可升级合约的部署和管理 |
@nomicfoundation/hardhat-chai-matchers | 提供 revertedWith、emit 等链上断言 |
安装插件只需 npm install 并在 hardhat.config.js 里 require,配置和扩展都很直观。
Hardhat 还是 Foundry?
2026 年选框架,这个问题绕不开。
选 Hardhat 的场景:
- 团队主力是 JavaScript/TypeScript,前端和合约在同一仓库
- 需要 Etherscan 验证、可升级合约、多链部署等成熟插件
- 合约逻辑不复杂,更看重开发流程的整体顺滑度
选 Foundry 的场景:
- 纯 Solidity 开发,不需要 JS 生态
- 追求极致编译和测试速度(Foundry 仍然比 Hardhat 3 快约 2 倍)
- 需要 Fuzz 测试和 Invariant 测试
- 做协议层开发或安全审计
实际选择:不少团队两边都用——Foundry 负责合约开发和快速测试,Hardhat 负责部署脚本和前端集成。Hardhat 3 支持 Solidity 测试后,纯用 Hardhat 的门槛也在降低。
快速开始
bashmkdir my-project && cd my-project npm init -y npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox npx hardhat init # 选择 TypeScript 项目
初始化后的项目结构:
shellmy-project/ ├── contracts/ # Solidity 合约 ├── ignition/ # Ignition 部署模块 ├── test/ # 测试文件 ├── hardhat.config.ts # 配置文件 └── artifacts/ # 编译产物(gitignore)
开发循环就是三个命令:
bashnpx hardhat compile # 编译 npx hardhat test # 测试 npx hardhat ignition deploy ignition/modules/Deploy.ts --network sepolia # 部署