区块链——hardhat使用

一、引入hardhat

yarn add --dev hardhat
// 引入验证合约的插件
yarn add --dev @nomicfoundation/hardhat-verify

二、创建hardhat项目

yarn hardhat

三、编写我们的合约

在这里插入图片描述

四、编译我们的合约

yarn hardhat compile

五、编写脚本部署合约以及验证合约

在这里插入图片描述

// 获取hardhat环境对象
const hre = require("hardhat")
// 获取ethers
const { ethers, network } = hre
// network是运行脚本时当前的网络配置
console.log(network)
async function main() {// 从ethers中获取合约生成工厂const SimpleStorageFactory = await ethers.getContractFactory("SimpleStorage")console.log("Deploying contract...")// 部署合约const simpleStorage = await SimpleStorageFactory.deploy()// 等待合约部署完毕,后面出现其他的区块后,再验证合约await simpleStorage.deploymentTransaction().wait(6)// 获取合约地址const contractAddress = await simpleStorage.getAddress()console.log(`Deployed contract to: ${contractAddress}`)// 验证合约await verifyCode(contractAddress)
}/*** @param {合约地址} contractAddress* @param {合约构造函数参数} args*/
async function verifyCode(contractAddress, args) {console.log("Verifying contract...")await hre.run("verify:verify", {address: contractAddress,constructorArguments: args,})
}main().then(() => process.exit(0)).catch((err) => {console.log(err)})

六、配置hardhat

require("@nomicfoundation/hardhat-toolbox")
// 用来验证我们发布的合约
require("@nomicfoundation/hardhat-verify")
require("dotenv").config()
require("./task/blockNumber")task("accounts", "Prints the list of accounts", async (taskArgs, hre) => {const accounts = await hre.ethers.getSigners()for (const account of accounts) {console.log(account.address)}
})const SEPOLIA_RPC_URL = process.env.SEPOLIA_RPC_URL
const SEPOLIA_PRIVARY_KEY = process.env.SEPOLIA_PRIVARY_KEY
const SEPOLIA_CHAIN_ID = process.env.SEPOLIA_CHAIN_ID
const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {// 表示默认使用hardhat网络defaultNetwork: "hardhat",// 也可以添加其他网络networks: {hardhat: {},sepolia: {url: SEPOLIA_RPC_URL,accounts: [SEPOLIA_PRIVARY_KEY],chainId: Number(SEPOLIA_CHAIN_ID),},localhost: {url: "http://127.0.0.1:8545/",chainId: 31337,},},solidity: "0.8.24",// 配置etherscanetherscan: {// Your API key for Etherscan// Obtain one at https://etherscan.io/apiKey: ETHERSCAN_API_KEY,},
}

七、命令行运行脚本

// 我们的脚本在scripts目录下,如果没有–network则使用上面配置的默认网络hardhat
yarn hardhat run scripts/deploy.js --network sepolia

八、测试代码

const { expect, assert } = require("chai")
const hre = require("hardhat")
const {time,loadFixture,
} = require("@nomicfoundation/hardhat-toolbox/network-helpers")describe("SimpleStorage", function () {// 在it之前需要做什么事情,我们肯定需要先部署我们的合约const deployContractFunc = async () => {const contractFactory = await hre.ethers.getContractFactory("SimpleStorage")const simpleStorage = await contractFactory.deploy()return { contractFactory, simpleStorage }}// 展示it assert用法it("合约初始化时favoriteNumber应该是0", async () => {// 定义我们的预期值const expectValue = "0"const { simpleStorage } = await loadFixture(deployContractFunc)const favorateNumber = await simpleStorage.retrieve()assert.equal(favorateNumber.toString(), expectValue)})// 展示it expect用法it("合约初始化时favoriteNumber应该不是0", async () => {// 定义我们的预期值const expectValue = "0"const { simpleStorage } = await loadFixture(deployContractFunc)const favorateNumber = await simpleStorage.retrieve()expect(favorateNumber).to.not.equal(expectValue)})
})

本地启动节点:yarn hardhat node
运行测试代码:yarn hardhat test test/SimpleStorage.js --network localhost

九、测试时输出gas

1.计算gas使用的库
yarn add --dev hardhat-gas-reporter
2.在hardhat.config.js中添加
require(“hardhat-gas-reporter”)

module.exports = {
...
// 计算gas使用gasReporter: {enabled: true,// outputFile: "./gas-report.txt",noColors: true,currency: "USD",coinmarketcap: COINMARKET_API_KEY,token: "MATIC",},
}

十、使用hardhat-deploy部署合约

1、安装依赖

yarn add --dev hardhat-deploy
// 如果使用了ether.js,我们还需要导入下面的包
yarn add --dev @nomiclabs/hardhat-ethers hardhat-deploy-ethers ethers

2、在hardhat-config.js中添加require(“hardhat-deploy”)

在这里插入图片描述

3、创建deploy文件夹,在文件夹下写脚本,因为hardhat-deploy会根据文件名顺序执行脚本,所以我们一般命名为00-xxx.js,01-xxx.js

4、项目git代码地址:项目地址

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

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

相关文章

Python操作Redis指南

文本主要介绍使用Python中的redis-py库来操作Redis数据库,包括安装必要的包、建立和关闭连接、执行增删改查操作以及处理可能的异常。这些操作将在Python应用程序中与Redis数据库进行有效的交互。 一. 简介和包的安装 Redis是一种开源的内存数据结构存储&#xff…

Jmeter混合压测(2407)

一 压测需求: 电商作为服务端,至少需要满足并发量,QPS:100/s,TPS:20/s。例如场景: 电商交易中,商品图片请求量最多,电商服务端需要满足并发请求查询图片信息。各家可能会并发请求同一家电商商品、订单等内容。 二 压…

代码随想录算法训练营day7 | 454.四数相加II、383.赎金信、15.三数之和、18.四数之和

文章目录 454.四数相加II思路 383.赎金信思路 15.三数之和思路剪枝去重 18.四数之和思路剪枝去重复习:C中的类型转换方法 总结 今天是哈希表专题的第二天 废话不多说,直接上题目 454.四数相加II 建议:本题是 使用map 巧妙解决的问题&#x…

HarmonyOS(45) 控件拖动或者拖拽PanGesture

PanGesture实现控件拖动的效果,通过拖动的坐标位置调用position或者translate方法来更新UI的位置。效果见下图: 具体代码如下: // xxx.ets Entry Component struct PanGestureExample {State offsetX: number 0State offsetY: number 0pos…

【AI学习指南】轻量级模型-用 Ollama 轻松玩转本地大模型

目录 探索 最小的AI模型 发现 其他轻量级模型 用 Ollama 轻松玩转本地大模型 本地大模型 Ollama 快速上手 安装 手动安装 下载ollama二进制文件 添加 Ollama 作为启动服务(推荐) 安装 CUDA 驱动程序(可选 - 适用于 Nvidia GPU) 安装 ROCm(可选 - 对于 Radeo…

Typesript的type和interface的异同?

详解TypeScript中type与interface的区别_javascript技巧_脚本之家 一、相同的地方 1、都可以用来定义对象,描述函数 我们在用typescript开发的时候经常要用到数据类型定义,比如我们写一个接口或者函数的时候定义传参数据类型及字段等。这样子方便知道这…

代码随想录day21 二叉树最后一天 || 669修剪二叉树 108将有序数组转变为平衡搜索二叉树 538把搜索二叉树变为累加二叉树

669修剪二叉树 力扣题目链接 题目描述: 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果…

K8s 核心组件——API Server

1. Kubernetes API Server 概述 1.1 基本概念 Kubernetes API Server(API Server)是 Kubernetes 的核心组件之一,负责暴露 Kubernetes API 给用户和客户端,接收和处理来自客户端的请求,并将其存储到 etcd 中。Kubern…

花几千上万学习Java,真没必要!(三十一)

集合: 1、数组的特性: 2、ArrayList(动态数组): 测试代码1: package listtest.com; import java.util.ArrayList; import java.util.List; public class HashCodesArrayList { public static void ma…

深入分析 Android ContentProvider (六)

文章目录 深入分析 Android ContentProvider (六)ContentProvider 的性能优化和实践案例(续)1. 性能优化技巧(续)1.6. 使用批量插入优化性能示例:批量插入实现 1.7. 使用 Projections 优化查询示例:使用 Pr…

本周热点丨快手《可灵》国际版正式上线、《王者荣耀》国际服海外下载量破5000万

7月第4周 秦彻带动《恋与深空》2.0霸榜全球 《蔚蓝档案》上线3.5周年庆典版本,登顶日服iOS畅销榜 《Honor of Kings》下载量突破五千万 英伟达将开发"Blackwell"的中国定制版芯片 人工智能初创公司Cohere获得5亿美元融资 Fal AI推出全新开源图像生成模型A…

reshape函数及MATLAB应用

reshape 函数在 MATLAB 中是一个非常有用的函数,通过重新排列现有元素来重构数组。它允许你重新调整数组(或矩阵)的尺寸,而不改变其数据。这个函数特别适用于当你需要将一个矩阵或数组从一种结构转换为另一种结构时,只…

AFSim 仿真系统--任务处理器入门指南

任务处理器 任务处理器(WSF_TASK_PROCESSOR)是一个WSF处理器,它提供了检查轨迹管理器中的数据(轨迹)并对其采取行动的能力。这些行动包括: *向下属分配任务 *激活或停用传感器或干扰器 *开火武器 *操纵平台…

昇思MindSpore 应用学习-DCGAN生成漫画头像-CSDN

日期 心得 昇思MindSpore 应用学习-DCGAN生成漫画头像(AI代码学习) DCGAN生成漫画头像 在下面的教程中,我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中,使用的动…

vue2和el-input无法修改和写入,并且不报错

文章目录 一. 业务场景描述二. 原因分析三.解决方案3.1 方案一 原生标签(不建议)3.2 方案二 父子传递(不建议)3.3 方案三 vuex,pinia 状态传值(不建议)3.4 方案四 vue初始化属性 (建…

Java从入门到精通(十三)~ 枚举和注解

晚上好,愿这深深的夜色给你带来安宁,让温馨的夜晚抚平你一天的疲惫,美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 目录 前言 一、枚举 1.1 枚举的概念 ​编辑 1.2 枚举的特点 1.3 枚举的实际运用 1. 状态机,描述属性的…

Nginx配置详解

1. Nginx安装 进入到/usr/local目录下,执行命令: yum install -y nginx通过如下命令启动nginx服务 systemctl start nginx通过如下命令,设置nginx开启自启动 systemctl enable nginxnginx默认占用80端口。 访问ip:80,可以看到…

Open3D 点云按xyz轴等距切片

目录 一、概述 1.1原理 1.2实现步骤 1.3应用 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2按x轴切片 3.3按y轴切片 3.4按z轴切片 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总&#xff…

Java中线程池的基本使用

参考这个课程,讲的非常详细 27.线程池使用步骤总结_哔哩哔哩_bilibili 应用场景 商品秒杀 文件上传 订票系统 自定义线程池(让我们了解底层逻辑的) 构造方法 饱和机制 就是我们的队列饱和后我们该怎么处理 是拒绝这个任务还是啥…

Aria2 任意文件写入漏洞

目录 Aria2介绍漏洞描述漏洞复现 Aria2介绍 Aria2是一个在命令行下运行,多协议,多来源下载工具(HTTP / HTTPS,FTP,BitTorrent,Metalink),内建XML-RPC用户界面。Aria提供RPC服务器&a…