Hardhat 提供了一个灵活且易于使用的开发环境,可以轻松地编写、测试和部署智能合约。Hardhat还内置了Hardhat 网络(Hardhat Node),它是为开发而设计的本地以太坊网络。

下面是hardhat的官方文档

https://hardhat.org/hardhat-runner/docs/getting-started

一、创建及配置Hardhat项目

Hardhat 构建在 Node.js 之上, 使用 Hardhat 要求我们在电脑先安装好Node.js (>= 16.0),创建hardhat-tutorial文件夹。

1、初始化Node项目

2、安装Hardhat 

 3、运行hardhat

用键盘选择create a JavaScript project

生成project后的项目目录 

二、编写合约 

合约开发推荐使用 VSCode 编辑器 + solidity 插件,在VSCode下添加solidity插件

contracts 文件夹下新建一个合约文件 Counter.sol

Counter.js代码如下: 

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Counter {uint counter;constructor() {counter = 0;}function count() public {counter = counter + 1;}function get() public view returns (uint) {return counter;}
}

 在编写合约时,尽量不要重复造轮子,基于优质开源的第三方库,不仅可以提高效率,还可以让我们的合约代码更安全,例如要开发一个 Token,可以用npm 安装OpenZepplin 库:

npm install @openzeppelin/contracts --save-dev

然后在合约中 import 相应库中的合约文件及可。

pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract Token is ERC20 {constructor(uint256 initialSupply) ERC20("Token Name", "Token Symbol") {_mint(msg.sender, initialSupply);}
}

 三、编译合约

hardhat.config.js 有默认的Solidity 编译器配置,因此我们直接编译合约即可,在终端中运行 npx hardhat compile。

成功编译后,会在 artifacts/contracts/ 目录下生成Counter.json 和 build-info, Counter.json包含了智能合约的 ABI 、字节码(Bytecode)等

智能合约的ABI信息,包括了合约的函数、事件等接口信息。这个文件通常会与其他合约交互时使用,因为它可以被其他合约和DApp使用。

Bytecode是部署合约所需的字节码,部署合约时候就是把该字节码作为交易的输入数据发送链上。

 四、编写测试用例

为智能合约编写自动化测试至关重要,因为事关用户资金。

使用 Harhdat 内置的网络,使用ethers.js与前面的合约进行交互,并使用 Mocha 作为测试运行器。在test文件夹下创建Counter.js文件代码如下:

// 引入 Hardhat 提供的 ethers 库,用于部署和交互智能合约
const { ethers } = require("hardhat");// 引入 chai 的断言函数 expect,用于编写测试判断条件
const { expect } = require("chai");// 定义一个全局变量,用于存储部署后的合约实例
let counter;// 定义测试套件,描述被测试的合约模块为 "Counter"
describe("Counter", function () {// 初始化函数:部署 Counter 合约并获取实例async function init() {// 获取测试账户数组,其中 owner 是部署者,otherAccount 可用于后续扩展测试权限等const [owner, otherAccount] = await ethers.getSigners();// 获取 Counter 合约工厂(ContractFactory),可以用来部署合约const Counter = await ethers.getContractFactory("Counter");// 部署合约并返回实例(此时合约已经部署完成,不需要调用 .deployed())counter = await Counter.deploy();// 打印部署后合约的地址(ethers v6 中使用 .target 属性获取地址)console.log("counter:" + counter.target);}// 所有测试用例运行前执行一次初始化操作(部署合约)before(async function () {await init();});// 第一个测试用例:测试合约初始值是否为 0it("init equal 0", async function () {// 调用 counter 合约的 get() 方法,断言返回值为 0expect(await counter.get()).to.equal(0);});// 第二个测试用例:调用 count() 函数自增,验证是否变为 1it("add 1 equal 1", async function () {// 调用 count() 方法进行加 1 操作let tx = await counter.count();// 等待交易被打包确认await tx.wait();// 调用 get() 方法获取当前计数值,断言为 1expect(await counter.get()).to.equal(1);});
});

运行npx hardhat test之后输出全部通过,证明测试通过。 

还可以在Solidity代码中调用console.log()打印日志信息和合约变量,可以方便我们调试代码。

在合约代码中导入Hardhat console.log就可以使用它。

 五、部署合约

部署合约我们需要编写一个部署脚本。

在项目下新建scripts文件夹,新建一个deploy.js 用来写部署脚本,代码如下

const { ethers } = require("hardhat");async function main() {// 获取合约工厂const Counter = await ethers.getContractFactory("Counter");// 部署合约(v6 会自动等待部署完成)const counter = await Counter.deploy();// 输出部署的合约地址(v6 使用 counter.target)console.log("Counter address:", counter.target);
}main().catch((error) => {console.error(error);process.exitCode = 1;
});

运行 npx hardhat run scripts/deploy.js 时,合约会部署到 Hardhat 内置网络上。 

 为了在运行任何任务时指示Hardhat连接到特定的EVM网络,可以使用--network参数。

npx hardhat run scripts/deploy.js --network <network-name>

network-name 需要在 hardhat.config.js 文件中进行配置:

require("@nomicfoundation/hardhat-toolbox");// 填入自己的私钥或助记词,
const PRIVATE_KEY1 = "0x.... YOUR PRIVATE KEY1";
const PRIVATE_KEY2 = "0x....  YOUR PRIVATE KEY1";
const Mnemonic = "YOUR Mnemonic";module.exports = {solidity: "0.8.9", // solidity的编译版本networks: {goerli: {url: "https://eth-goerli.api.onfinality.io/public",accounts: [PRIVATE_KEY1,PRIVATE_KEY2],chainId: 5,},mumbai: {url: "https://endpoints.omniatech.io/v1/matic/mumbai/public",accounts: {mnemonic: Mnemonic,},chainId: 80001,},}
};

以上配置了两个网络,一个是以太坊测试网 goerli, 一个是 Polygon 测试网mumbai, 我们可以在 https://chainlist.org 找到每个网络的节点 URL 及 chainID。

在网络配置中,需要提供提交交易账号, 可以通过私钥或助记词 进行配置,这里配置的账号(需要提前充币进入到账号中),在hardhat 脚本中(测试及部署脚本)调用getSigners 即可获得:

const [owner, otherAccount] = await ethers.getSigners();

六、代码开源验证

智能代码开源会增加了合约的透明度和可靠性,是项目建立信任很重要的一个步骤。

1、安装 hardhat-toolbox 或 hardhat-etherscan , 这一步我们这里已经完成,因为在初始化项目的时候安装了 hardhat-toolbox , 如果没有安装,可以使用以下命令安装

npm install --save-dev @nomiclabs/hardhat-etherscan

2、在hardhat.config.js 中配置您的 Etherscan API 密钥和网络设置,例如: 

      require("@nomicfoundation/hardhat-toolbox");或// require("@nomiclabs/hardhat-etherscan");etherscan: {apiKey: ""},

     如何获取 Etherscan API 密钥?

    1. 访问部署网络对应主网的 Etherscan 网站,并注册一个账号(如果还没有账号的话)。
    2. 登录你的账号并进入 Etherscan 的「我的帐户」页面。
    3. 点击页面左侧的「API-KEYs」标签页。
    4. 在页面上方的「Create New API KEY」部分,输入 API 密钥的名称和描述,然后选择需要访问的 API 权限。
    5. 点击「Generate」按钮来生成 API 密钥。

     

    3、执行验证命令:

    npx hardhat verify <deployed-contract-address> "参数(若有)" --network <network-name> 
    

    该命令会为我们上传合约代码并验证其源代码。如果一切顺利(网络顺畅的话),在 Etherscan 上看到的合约被成功验证。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如若转载,请注明出处:http://www.pswp.cn/web/90179.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/web/90179.shtml
    英文地址,请注明出处:http://en.pswp.cn/web/90179.shtml

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    Ubuntu 1804 编译ffmpeg qsv MediaSDK libva 遇到的问题记录

    之前都是 用的xeon服务器的cpu 不支持intel QSV 硬件加速 最近把自己的 14年买的pc机装上了ubuntu 1804 然后准备开启ffmpeg qsv 硬件加速功能 CPU i3-4170 内存DDR3 16G 硬盘机械盘500G 主板ASUS B85M-G首先安装vainfo工具apt install vainfo装完提示如下出错了 网上说是…

    Elasticsearch(ES)介绍和安装

    目录 一、Elasticsearch(ES)介绍 1.为什么需要单独的搜索服务 2.全文检索 3.Elasticsearch简介 1.Elasticsearch的特点 2.应用场景 3.ElasticSearch数据的存储和搜索原理 二、Elasticsearch(ES)安装 1、拉取镜像 2、创建目录并给目录赋权 3、创建并编辑配置文件 4、…

    html结构解析

    <!DOCTYPE html>&#xff1a;声明为 HTML5 文档 <html lang"zh-CN">&#xff1a;根元素&#xff0c;指定页面语言为中文 <meta charset"UTF-8">&#xff1a;设置字符编码&#xff0c;确保中文正常显示 <meta name"viewport"…

    面试150 最大子数组和

    思路 贪心法&#xff1a;设定最小标志result为float(‘-inf’),遍历一次数组元素进行求和&#xff0c;如果当前元素大于result&#xff0c;则更新result的值&#xff0c;如果sum小于0&#xff0c;则重新置0进行计算&#xff0c;最后返回result class Solution:def maxSubArray(…

    MyBatis动态SQL实战:告别硬编码,拥抱智能SQL生成

    MyBatis动态SQL实战&#xff1a;告别硬编码&#xff0c;拥抱智能SQL生成在电商平台的用户管理模块中&#xff0c;需要面对多种不同的用户查询组合条件。当使用传统的硬编码SQL方式时&#xff0c;代码膨胀到了2000多行&#xff0c;维护成本极高。而引入MyBatis动态SQL后&#xf…

    Web前端开发:JavaScript遍历方法详解与对比

    1. 传统 for 循环const arr [10, 20, 30]; for (let i 0; i < arr.length; i) {console.log(索引 ${i}: 值 ${arr[i]}); } // 输出&#xff1a; // 索引 0: 值 10 // 索引 1: 值 20 // 索引 2: 值 30特点&#xff1a;最基础的循环&#xff0c;可通过索引精准控制适用场景&…

    Python 爬虫(一):爬虫伪装

    目录 1 简介2 伪装策略 2.1 Request Headers 问题2.2 IP 限制问题 3 总结 1 简介 对于一些有一定规模或盈利性质比较强的网站&#xff0c;几乎都会做一些防爬措施&#xff0c;防爬措施一般来说有两种&#xff1a;一种是做身份验证&#xff0c;直接把虫子挡在了门口&#xff…

    TODAY()-WEEKDAY(TODAY(),2)+1

    这个Excel公式 TODAY()-WEEKDAY(TODAY(),2)1 用于计算 当前周的周一日期。下面详细解释它的逻辑和用法&#xff1a;公式解析TODAY()返回当前日期&#xff08;例如今天是2023年12月20日&#xff0c;则 TODAY() 2023/12/20&#xff09;。WEEKDAY(TODAY(), 2)计算当前日期是星期几…

    Fast Frequency Estimation Algorithm by Least Squares Phase Unwrapping

    I. 引言 单个含噪正弦信号的频率估计是一个研究已久的问题&#xff0c;并有多种应用[1]。在高斯白噪声假设下&#xff0c;最大似然(ML)频率估计器是Rife和Boorstyn [2]中提出的周期图估计器&#xff0c;其中傅里叶变换用于搜索周期图的最大值。周期图估计器被广泛认为是单频估计…

    C语言常见的预定符号常量

    C语言常见的预定符号常量C 语言提供了丰富的预定义符号常量&#xff0c;分布在不同头文件中&#xff0c;用于获取编译信息、数值范围、浮点特性等关键信息。以下是常见预定义符号常量的分类总结&#xff1a;一、预定义宏&#xff08;编译时信息&#xff09;由编译器自动定义&am…

    【2025】使用vue构建一个漂亮的天气卡片

    1. 核心框架&#xff1a;Vue Vue 以其轻量、易用、响应式数据绑定的特点&#xff0c;非常适合快速构建这类小型界面组件。即使是直接通过 CDN 引入&#xff0c;也能高效开发&#xff0c;降低项目复杂度&#xff0c;无需搭建完整工程化环境 。 2. 网络请求&#xff1a;Axios 用于…

    Ruby 命令行选项详解

    Ruby 命令行选项详解 引言 Ruby 是一种广泛使用的编程语言,它以其简洁、优雅和强大的功能而闻名。在 Ruby 的使用过程中,命令行界面(CLI)提供了丰富的选项,可以帮助开发者更高效地与 Ruby 环境交互。本文将详细解析 Ruby 命令行选项,旨在帮助开发者更好地利用这些工具。…

    NLP复习

    1.文本预处理 分词,词性标注,命名实体识别 1.1分词:jieba jieba.lcut(content,cut_alltrue) 全模式 jieba.lcut(content,cut_allfalse) 精确模式 jieba.lcut_for_search(content) 搜索引擎模式 lcut和cut的区别:cut返回的是一个生成器Generator,lcut返回的是列表 生成器调…

    WEB :实战演练——从零实现一个交互轮播图(附源码)

    文章目录 一、轮播图整体功能规划二、HTML结构深度解析三、CSS样式实现细节1. 定位系统详解2. 显示/隐藏机制3. 按钮交互效果实现4. 纯CSS箭头实现5. 指示器&#xff1a;当前位置可视化 四、JavaScript逻辑深入解析1. 核心变量与DOM获取2. 图片切换函数&#xff08;核心逻辑&am…

    MCP 协议详细分析一 initialize ping tools/list tools/call

    MCP 协议详细分析一 &#xff08;initialize ping tools/list tools/call) 本节基于 实现一个 java 的mcp client 调用的 一个python 的mcp server 的日志&#xff0c;完整展示一次典型的 MCP Java SDK 通信流程、工具调用、通知机制与日志记录&#xff0c;仅包含 echo-simple…

    SLAM学习资料记录

    ORB_SLAM2 创建自己的数据集&#xff08;还未使用&#xff09; 【SLAM实战篇】Ubuntu 20.04版本&#xff08;OpenCV版本4.5.3&#xff09;对于ORB-SLAM2安装运行&#xff0c;代码编译&#xff0c;自己的数据集构造_ubuntu20.04 安装运行orb_slam2算法-CSDN博客 卡尔曼滤波数据…

    用Phi-3 Mini微调实现英文到尤达语翻译

    用Phi-3 Mini微调实现英文到尤达语翻译 引言 本文将带你快速上手大模型微调实践——以微软的Phi-3 Mini 4K Instruct模型为例&#xff0c;教你如何将其微调为一个能把英文翻译成"尤达语"&#xff08;《星球大战》中尤达大师的独特说话风格&#xff09;的模型。这是一…

    AI助力,轻松实现人声分离伴奏提取

    亲爱的小伙伴们&#xff01;前段时间&#xff0c;有一位同事家的可爱小孩参加了一场英语演讲比赛。同事找到我&#xff0c;希望我能帮个忙&#xff0c;把讲视频中的人声去掉&#xff0c;只提取出其中相应的伴奏。今天&#xff0c;我就来和大家分享一下究竟如何实现从 MP4 视频中…

    第1章第2章笔记

    OSI参考模型---开放式系统互联模型---OSI/RM ISO--->国际标准化组织&#xff1b;特点&#xff1a;先有模型&#xff0c;在又协议。 OSI七层参考模型&#xff1a;应用层 --- 提供网络服务&#xff1b;自然语言-->编码表示层 --- 对数据的处理&#xff1b;格式化&#xff0…

    图的BFS和DFS

    一&#xff0c;图的遍历逻辑1.之前我们学了图的存储&#xff0c;可以邻接表存和邻接矩阵存。现在我们要学习图的遍历操作和树类似可以分为深度遍历和广度遍历&#xff0c;而深度遍历也是用递归实现&#xff0c;广度遍历是用队列实现2.深度遍历(DFS)a.确定起点b.找到一条边按顺时…