当前位置: 首页 > news >正文

区块链——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代码地址:项目地址

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AndroidStudio 开发环境搭建
  • 全球相机控制面板市场展望与未来增长机遇:预计未来六年年复合增长率CAGR为4.3%
  • uniapp中出现图片过小会与盒子偏离
  • RDF中IEXT和ICEXT的区别
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布
  • Redis:RDB持久化
  • 2024 微信小程序 学习笔记 第二天
  • Spring Boot自动装配原理
  • MongoDB - 聚合阶段 $group 的使用
  • 网络战时代的国家安全:策略、技术和国际合作
  • 数据库开发:MySQL基础(二)
  • 7-25学习笔记
  • 数据结构:(1)线性表
  • easyExcel 3.x以上版本导入数据后,再把错误信息导出,外加自定义RGB背景色、行高、宽度等
  • PSINS工具箱函数介绍——insplot
  • 30天自制操作系统-2
  • 78. Subsets
  • angular组件开发
  • AWS实战 - 利用IAM对S3做访问控制
  • HashMap ConcurrentHashMap
  • iOS编译提示和导航提示
  • Map集合、散列表、红黑树介绍
  • React16时代,该用什么姿势写 React ?
  • Vue2.0 实现互斥
  • 阿里研究院入选中国企业智库系统影响力榜
  • 搞机器学习要哪些技能
  • 聊聊flink的TableFactory
  • 前端攻城师
  • 前端面试总结(at, md)
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 鱼骨图 - 如何绘制?
  • 正则表达式
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ‌移动管家手机智能控制汽车系统
  • #NOIP 2014#Day.2 T3 解方程
  • (8)STL算法之替换
  • (C语言)共用体union的用法举例
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (黑马点评)二、短信登录功能实现
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)为C# Windows服务添加安装程序
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Core引入性能分析引导优化
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • @我的前任是个极品 微博分析
  • [20160807][系统设计的三次迭代]
  • [240621] Anthropic 发布了 Claude 3.5 Sonnet AI 助手 | Socket.IO 拒绝服务漏洞
  • [Android]通过PhoneLookup读取所有电话号码
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [BZOJ]4817: [Sdoi2017]树点涂色