hardhat 项目目录介绍

发布于:2025-09-12 ⋅ 阅读:(19) ⋅ 点赞:(0)

使用 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

​项目依赖管理和脚本定义文件​​。记录了项目所需的依赖包、版本信息以及可运行的脚本命令(如 compiletest

你可以通过 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", // 网络连接类型为 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 文件介绍

// 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);
  }
}


网站公告

今日签到

点亮在社区的每一天
去签到