使用 npx hardhat init
初始化一个 Hardhat 项目后,会生成一个结构清晰的目录,每个部分都有其特定用途。下面是一个表格汇总了主要的目录和文件及其作用,方便你快速了解:
|--------------------------------------------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------|
|contracts/
| 存放项目的 Solidity 智能合约源代码 (.sol
文件) 。 | 项目核心,编译时会处理此目录下的合约。 |
| test/
| 存放项目的测试脚本 。Hardhat 通常使用 Mocha 测试框架和 Chai 断言库,测试文件可以是.js
或.ts
文件。 | 编写单元测试和集成测试来验证合约逻辑至关重要。 |
| scripts/
ignition/
| 存放部署脚本,用于将合约部署到区块链网络 。在较新版本的 Hardhat 中,ignition/modules/
目录用于定义部署模块(如使用 Ignition 引擎)。 | 部署脚本允许你指定部署参数和要部署的合约。老版本项目可能使用scripts/
目录存放部署脚本 。 |
| hardhat.config.js
hardhat.config.ts
| Hardhat 项目的核心配置文件 。用于配置 Solidity 编译器版本、网络、插件等。 | 根据初始化时的选择,可能是.js
(JavaScript) 或.ts
(TypeScript) 文件。 |
| artifacts/
| 编译产物目录 。在运行npx hardhat compile
后生成,存放合约的 ABI (应用程序二进制接口)、字节码 (bytecode) 等元数据 。 | 此目录内容由 Hardhat 自动生成,通常无需手动修改。 |
| cache/
| 编译缓存目录。Hardhat 用于缓存编译信息,以加速后续的编译过程 。 | 可以安全删除,下次编译时会重新生成,但可能会延长编译时间。 |
| node_modules/
| 存放项目的 npm 依赖包 。由npm install
或yarn install
命令创建。 | 此目录通常不在版本控制(如 git)中管理。 |
| package.json
| 项目依赖管理和脚本定义文件 。记录了项目所需的依赖包、版本信息以及可运行的脚本命令(如compile
,test
) 。 | 你可以通过npm run <script-name>
来运行这里定义的脚本。 |
Hardhat Ignition 。它是一个声明式的智能合约部署系统,用于管理和自动化以太坊智能合约的部署流程
javascript
// 从 'hardhat/config' 中导入 HardhatUserConfig 类型。
// 这主要用于 TypeScript 项目,为配置文件提供类型检查和自动补全,确保配置对象的结构正确。
import type { HardhatUserConfig } from "hardhat/config";
// 从 '@nomicfoundation/hardhat-toolbox-viem' 插件库中导入一个插件函数。
// 此插件集成了许多常用的 Hardhat 插件和工具(如测试、部署、交互等),但使用的是 Viem 库而非 Ethers.js。
import hardhatToolboxViemPlugin from "@nomicfoundation/hardhat-toolbox-viem";
// 从 'hardhat/config' 导入 configVariable 函数。
// 这是一个安全读取环境变量的辅助函数,通常用于获取敏感信息(如私钥、RPC URL),避免将其硬编码在配置文件中。
import { configVariable } from "hardhat/config";
// 使用 HardhatUserConfig 类型来声明 config 常量,这确保了该对象符合 Hardhat 配置的预期结构。
const config: HardhatUserConfig = {
// plugins 数组用于配置要启用的 Hardhat 插件。
// 这里启用了 hardhat-toolbox-viem 插件,它提供了许多开发任务和功能。
plugins: [hardhatToolboxViemPlugin],
// solidity 字段用于配置 Solidity 编译器。
solidity: {
// 新增的 profiles 配置允许为不同的场景(如开发、生产)定义不同的编译选项。
profiles: {
// 'default' 配置文件是当未指定特定配置时使用的默认配置。
default: {
// 指定 Solidity 编译器的版本
version: "0.8.28",
},
// 'production' 配置文件可用于生产环境部署,通常需要开启优化器以节省 Gas。
production: {
version: "0.8.28",
// settings 字段用于更细致的编译器配置。
settings: {
// optimizer 配置优化器
optimizer: {
enabled: true, // 启用优化器
runs: 200, // 设置优化器运行次数。较高的 runs 值会尝试生成更节省运行时 Gas 的代码,但可能会增加部署成本。
},
},
},
},
},
// networks 对象用于配置 Hardhat 可以连接的各种网络。
networks: {
// 定义一个名为 'hardhatMainnet' 的本地模拟网络,类型为 'edr-simulated',模拟 L1 主链环境。
// 这通常是 Hardhat 内部网络的一个增强或特定配置,用于本地开发和测试。
hardhatMainnet: {
type: "edr-simulated", // 使用 Hardhat 的 EDR (Ethereum Development Runtime) 模拟器
chainType: "l1", // 指定链类型为 Layer 1
},
// 定义另一个名为 'hardhatOp' 的本地模拟网络,模拟 Optimistic Rollup (OP) 链环境。
hardhatOp: {
type: "edr-simulated",
chainType: "op", // 指定链类型为 Optimism (Layer 2)
},
// 定义一个名为 'sepolia' 的外部测试网配置,类型为 'http',表示通过 HTTP RPC 端点连接。
sepolia: {
type: "http", // 网络连接类型为 HTTP
chainType: "l1", // 指定链类型为 Layer 1
// 使用 configVariable 函数从环境变量中获取 Sepolia 测试网的 RPC URL。
// 在实际项目中,你需要在项目根目录下的 `.env` 文件中定义 SEPOLIA_RPC_URL。
url: configVariable("SEPOLIA_RPC_URL"),
// 使用 configVariable 函数从环境变量中获取部署账户的私钥。
// 同样,需要在 `.env` 文件中定义 SEPOLIA_PRIVATE_KEY。
// 注意:数组形式允许配置多个账户私钥。
accounts: [configVariable("SEPOLIA_PRIVATE_KEY")],
},
},
};
// 使用 ES Module 的语法导出 config 对象作为默认导出。
// Hardhat 会自动读取此文件中的默认导出作为其配置。
export default config;
初始化contract 文件介绍
javascript
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.28;
contract Counter {
uint public x;
//这行代码声明了一个名为 Increment的事件。事件允许智能合约在区块链上记录信息(日志)
//,这些信息可以被外部应用程序(如前端 DApp)监听和响应。该事件接受一个 uint类型的参数 by,用于记录计数器增加的量。
event Increment(uint by);
function inc() public {
x++;
emit Increment(1);
}
function incBy(uint by) public {
//require是一个错误处理函数,用于检查条件,如果条件不满足(即 by > 0为 false),则交易会回滚(revert)
require(by > 0, "incBy: increment should be positive");
x += by;
emit Increment(by);
}
}