hardhat 项目目录介绍
使用 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。它是一个声明式的智能合约部署系统,用于管理和自动化以太坊智能合约的部署流程
// 从 '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", // 网络连接类型为 HTTPchainType: "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;