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;

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96665.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96665.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96665.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

9.11網編項目——UDP網絡聊天

服務器端#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <unistd.h> #include <25061head.h> #d…

第3節-使用表格數據-數據庫設計

摘要: 在本教程中&#xff0c;你將學習如何為自己的應用程序設計 PostgreSQL 數據庫。 業務需求 我們將為一個簡單的庫存管理系統設計數據庫。 讓我們從業務需求開始&#xff1a; “我們的庫存管理系統使倉庫用戶能夠高效管理多個倉庫的庫存。” 它簡化了產品管理&#xff0c;使…

Linux下清理磁盤空間——df 磁盤占用100%,du占用很少空間的原因

背景 一臺測試服務器&#xff0c;/data磁盤大小為300G&#xff0c;時不時就滿了&#xff0c;通過df命令查看300G基本全用了&#xff0c;use 100%。但是進到/data目錄中通過du 命令查看&#xff0c;也就用了20個G左右&#xff0c;怎么都對不上。如何清理都沒有釋放太多空間。查看…

分鐘級長視頻生成迎來“記憶革命”,7倍成本降低,2.2倍端到端生成速度提升!|斯坦福字節

論文鏈接&#xff1a;https://arxiv.org/pdf/2508.21058 項目鏈接&#xff1a;https://primecai.github.io/moc/亮點直擊提出了一種自適應上下文混合&#xff08;Adaptive Mixture of Contexts&#xff0c;MoC&#xff09;框架&#xff0c;該框架學習將每個查詢路由到視頻序列中…

JavaScript 設計模式概覽

1. 設計模式是什么? 設計模式是開發中解決常見問題的經典方案。設計模式并非具體代碼&#xff0c;而是解決問題的通用解決方案&#xff0c;幫助開發者避免重復造輪子&#xff0c;提升代碼的可維護性、可擴展性。 2. 設計模式的歷史 設計模式起源于建筑領域&#xff0c;由克…

(九)Spring Cloud Alibaba 2023.x:微服務接口文檔統一管理與聚合

目錄 前言 準備 實踐 網關服務配置 1.pom.xml 引入 webflux 版本 springboc 依賴 2.application-dev.yml 配置 springboc 多服務地址 3.application-dev.yml 配置springboc 文檔路由 4.網關過濾器AuthFilter.class 中放行 springboc 訪問路徑 業務服務配置 1.pom.xml…

在Cursor里安裝極其好用的Mysql Database Client 插件

&#x1f4f8; 插件界面展示 圖片1&#xff1a;插件主界面和連接配置圖片2&#xff1a;數據編輯和查詢結果展示&#x1f3af; 核心優勢 1. 直接編輯數據 - 像DataGrip一樣強大 ? 點擊即編輯: 直接雙擊數據單元格&#xff0c;立即進入編輯模式? 實時保存: 編輯完成后按 Enter …

Cursor 不香了?替代與組合實踐指南(Windsurf、Trae、Copilot、MCP)

當你感覺 Cursor 的產出質量和穩定性不如從前&#xff0c;未必一定要“全盤換掉”。本文從“替代”與“組合”兩個維度給出可落地的工具編排方案&#xff0c;并附帶決策矩陣與常見工作流&#xff0c;幫助你在不同場景獲得穩定、可控的產出。0. 適用讀者 正在使用或評估 Cursor&…

【MFC】對話框屬性:X Pos(X位置),Y Pos(Y位置)

前言 本文介紹對話框屬性中的X Pos(X位置)、Y Pos(Y位置)&#xff0c;同時給出相關示例便于理解。 目錄1 位置2 詳解3 示例1 位置 首先介紹一下這個屬性在哪里。 在資源視圖中雙擊對話框節點&#xff0c;打開該對話框&#xff1b; 鼠標右鍵工作區空白處&#xff0c;單擊屬性&am…

Java面試小冊(1)

1【Q】&#xff1a;序列化和反序列化【A】&#xff1a;序列化是將Java對象轉化為字節流&#xff0c;用于網絡傳輸&#xff0c;持久化或緩存。Java提供了java.io.Serializable接口實現序列化。反序列化是將字節流轉為為對象。2【Q】&#xff1a; Java中Exception和Error有什么區…

html獲取16個隨機顏色并不重復

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>16個不重復隨機顏色</title><style>…

Redis 緩存穿透、擊穿、雪崩:防御與解決方案大全

&#x1f6e1;? Redis 緩存穿透、擊穿、雪崩&#xff1a;防御與解決方案大全 文章目錄&#x1f6e1;? Redis 緩存穿透、擊穿、雪崩&#xff1a;防御與解決方案大全&#x1f9e0; 一、緩存穿透&#xff1a;防御不存在數據的攻擊&#x1f4a1; 問題本質與危害&#x1f6e1;? 解…

量子計算機的發展對傳統密碼學的打擊

量子計算機的發展對傳統密碼學的核心威脅&#xff0c;源于其能高效解決傳統計算機“計算不可行”的數學問題——而這些問題正是當前主流密碼算法保障安全的基石。這種影響并非“全面摧毀”&#xff0c;而是針對傳統密碼學的不同分支&#xff08;非對稱密碼、對稱密碼、哈希函數…

《var, let, const:現代JS聲明指南》

文章目錄JavaScript 中 var、let、const 的差異1. 作用域&#xff08;Scope&#xff09;2. 變量提升&#xff08;Hoisting&#xff09;3. 重復聲明4. 變量值是否可變對比表5. 示例代碼總結JavaScript 中 var、let、const 的差異 1. 作用域&#xff08;Scope&#xff09; var 函…

在 Docker 中安裝 MySQL 教程

拉取 MySQL 鏡像docker pull mysql:8.0創建并啟動 MySQL 容器docker run -d \--name mysql8 \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD123456 \-v mysql_data:/var/lib/mysql \mysql:8.0命令說明&#xff1a;-d&#xff1a;后臺運行容器 --name mysql8&#xff1a;給容器起個名字…

C#線程理解

目錄 一.線程類 1.基礎線程類&#xff08;Thread&#xff09; 2.線程池類&#xff08;Threadpool&#xff09; 3.任務并行庫&#xff08;Task&#xff09; 4.并行循環&#xff08;Parallel&#xff09; 二.線程池(threadPool)和Thread/Task之間的聯系 1.ThreadPool和Thr…

Java入門級教程16——JUC的安全并發包機制

目錄 1.JUC的安全并發包機制 1.1 包含 1.2 Barrier(柵欄)機制——CyclicBarrier&#xff08;循環屏障&#xff09; 1.2.1 定義 1.2.2 特性 1.2.1 模擬包車 1.2.2 模擬學生到齊上課 1.2.3 計算任務總耗時 1.3 CountDownLatch(閉鎖)機制 1.3.1 定義 1.3.2 特性 1.3.3…

【網絡通信】全面解析MAC地址:網絡設備的唯一標識

【網絡通信】全面解析MAC地址&#xff1a;網絡設備的唯一標識 文章目錄【網絡通信】全面解析MAC地址&#xff1a;網絡設備的唯一標識前言一、MAC 地址的定義&#xff1a;設備的 “網絡身份證”?二、MAC 地址的格式與組成&#xff1a;48 位的 “數字編碼”?三、MAC 地址的工作…

Perforce Klocwork 2025.2版本更新:默認啟用現代分析引擎、支持 MISRA C:2025 新規、CI構建性能提升等

Perforce Klocwork 現已更新至2025.2版本&#xff01;該版本增強了對 C/C的分析能力&#xff0c;提升了現代 C 分析的準確性&#xff0c;并改進了對源文件編碼的支持。該版本還為 MISRA C:2025 標準引入了新的分類體系&#xff0c;并增強了 Visual Studio Code 插件的可用性。 …

機器人馭風而行:低空經濟如何開啟智能新紀元【科普類】

新晉碼農一枚&#xff0c;小編會定期整理一些寫的比較好的代碼和知識點&#xff0c;作為自己的學習筆記&#xff0c;試著做一下批注和補充&#xff0c;轉載或者參考他人文獻會標明出處&#xff0c;非商用&#xff0c;如有侵權會刪改&#xff01;歡迎大家斧正和討論&#xff01;…