使用?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;
初始化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);}
}