5月28日 05:30

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 类型绑定,合约交互时有完整的类型提示和自动补全
bash
npx 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 }; });

部署到测试网并验证合约:

bash
npx 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 一样用:

solidity
import "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提供 revertedWithemit 等链上断言

安装插件只需 npm install 并在 hardhat.config.jsrequire,配置和扩展都很直观。

Hardhat 还是 Foundry?

2026 年选框架,这个问题绕不开。

选 Hardhat 的场景

  • 团队主力是 JavaScript/TypeScript,前端和合约在同一仓库
  • 需要 Etherscan 验证、可升级合约、多链部署等成熟插件
  • 合约逻辑不复杂,更看重开发流程的整体顺滑度

选 Foundry 的场景

  • 纯 Solidity 开发,不需要 JS 生态
  • 追求极致编译和测试速度(Foundry 仍然比 Hardhat 3 快约 2 倍)
  • 需要 Fuzz 测试和 Invariant 测试
  • 做协议层开发或安全审计

实际选择:不少团队两边都用——Foundry 负责合约开发和快速测试,Hardhat 负责部署脚本和前端集成。Hardhat 3 支持 Solidity 测试后,纯用 Hardhat 的门槛也在降低。

快速开始

bash
mkdir my-project && cd my-project npm init -y npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox npx hardhat init # 选择 TypeScript 项目

初始化后的项目结构:

shell
my-project/ ├── contracts/ # Solidity 合约 ├── ignition/ # Ignition 部署模块 ├── test/ # 测试文件 ├── hardhat.config.ts # 配置文件 └── artifacts/ # 编译产物(gitignore)

开发循环就是三个命令:

bash
npx hardhat compile # 编译 npx hardhat test # 测试 npx hardhat ignition deploy ignition/modules/Deploy.ts --network sepolia # 部署
标签:Hardhat