使用 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", // 网络连接类型为 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;…