从零开始掌握Hardhat开发
以下是一份简明实用的 Hardhat 开发教程,涵盖环境搭建、项目初始化、合约编写、测试部署等核心流程,结合最新官方实践整理而成:
一、环境准备与项目初始化
-
安装依赖
- Node.js ≥ v18 + npm/yarn
mkdir hardhat-project && cd hardhat-project npm init -y npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox
-
初始化项目
npx hardhat init
- 选择
Create a JavaScript project
(或 TypeScript 按需选择) - 生成目录结构:
contracts/ # 合约源码 test/ # 测试脚本 scripts/ # 部署脚本 hardhat.config.js # 配置文件
- 选择
二、核心开发工作流
1. 编写合约(示例:contracts/Lock.sol
)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Lock {uint public unlockTime;address payable public owner;constructor(uint _unlockTime) payable {owner = payable(msg.sender);unlockTime = _unlockTime;}function withdraw() public {require(block.timestamp >= unlockTime, "Not unlocked");owner.transfer(address(this).balance);}
}
2. 编译合约
npx hardhat compile
- 编译结果输出至
artifacts/
目录 - 缓存机制:仅重新编译修改过的文件(强制编译加
--force
)
3. 测试合约(示例:test/Lock.test.js
)
const { expect } = require("chai");
describe("Lock", function () {it("Should reject early withdrawal", async function () {const Lock = await ethers.getContractFactory("Lock");const unlockTime = Math.floor(Date.now() / 1000) + 3600; // 1小时后解锁const lock = await Lock.deploy(unlockTime, { value: 1e18 });await expect(lock.withdraw()).to.be.revertedWith("Not unlocked");});
});
运行测试:npx hardhat test
4. 部署合约
- 使用脚本部署(
scripts/deploy.js
):const hre = require("hardhat"); async function main() {const lock = await hre.ethers.deployContract("Lock", [unlockTime], { value: 1e18 });console.log("Deployed to:", await lock.getAddress()); } main();
- 执行部署:
npx hardhat run scripts/deploy.js --network localhost
三、网络配置与管理
-
启动本地节点
npx hardhat node
- 提供 JSON-RPC 端点:
http://localhost:8545
- 内置 20 个测试账户(含 10000 ETH)
- 提供 JSON-RPC 端点:
-
多网络配置(修改
hardhat.config.js
)
module.exports = {networks: {sepolia: {url: "https://sepolia.infura.io/v3/YOUR_KEY",accounts: [privateKey]}}
};
- 切换网络:
--network sepolia
四、进阶功能
-
调试合约
使用console.log
输出日志(需导入import "hardhat/console.sol";
):function withdraw() public {console.log("Current time:", block.timestamp);require(block.timestamp >= unlockTime, "Not unlocked"); }
-
自定义任务
在配置文件中添加任务:task("accounts", "Prints all accounts", async () => {const accounts = await ethers.getSigners();accounts.forEach((acc) => console.log(acc.address)); });
运行:
npx hardhat accounts
-
插件扩展
常用插件:@nomicfoundation/hardhat-verify
:合约开源验证hardhat-gas-reporter
:Gas 消耗分析
安装后需在配置中引入。
五、资源推荐
- 官方文档:Hardhat 官网
- 中文社区:Hardhat 中文网
- 实战项目:参考 Hardhat Toolbox 示例
提示:遇到网络问题时,清除缓存
npx hardhat clean
;调试交易使用npx hardhat console
交互环境。