hardhat学习笔记
hardhat学习笔记会不定时填充内容。
初始化项目
yarn init

安装hardhat依赖
yarn add --dev hardhat
初始化 Hardhat
yarn hardhat
代码格式化
yarn add --dev prettier prettier-plugin-solidity
项目中增加.prettierrc 与 .prettierignore 配置文件统一格式(根据项目自行配制即可)
//.prettierrc
{"$schema": "https://json.schemastore.org/prettierrc","semi": false,"tabWidth": 2,"singleQuote": true,"printWidth": 100,"trailingComma": "none"
}
//.prettierrc
node_modules
package.json
img
artifacts
cache
coverage
.env
.*
README.md
coverage.json
编译合约
yarn hardhat compile

设置环境按量
安装依赖
yarn add --dev dotenv
在 .env 文件中,我们可以设置环境变量
RINKEBY_RPC_URL=https://rinkeby.infura.io/v3/key
RINKEBY_PRIVATE_KEY=0xkey
ETHERSCAN_API_KEY=key
COINMARKETCAP_API_KEY=key
hardhat.config.js 读取环境变量
const INFURA_API_KEY = process.env.INFURA_API_KEY || "";
const RINKEBY_PRIVATE_KEY = process.env.RINKEBY_PRIVATE_KEY || "";
const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY || "key";
const COINMARKETCAP_API_KEY = process.env.COINMARKETCAP_API_KEY || "key";
配置网络环境
现配置本地网络环境,测试账号还没申请下来
运行 yarn hardhat node 命令,启动一个本地可持续的网络
yarn hardhat node

配置 hardhat.config.js
const config: HardhatUserConfig = {solidity: '0.8.24',defaultNetwork: 'hardhat',networks: {localhost: {url: 'http://localhost:8545'}// rinkeby: {// url: `https://rinkeby.infura.io/v3/${INFURA_API_KEY}`,// accounts: [`0x${RINKEBY_PRIVATE_KEY}`],// },}
}
部署脚本及关联合约
两个例子,一个hardhat自带的,一个网上找的,分别记录下。
deploy.ts
import { ethers } from 'hardhat'async function main() {const currentTimestampInSeconds = Math.round(Date.now() / 1000)const unlockTime = currentTimestampInSeconds + 60const lockedAmount = ethers.parseEther('0.001')const lock = await ethers.deployContract('Lock', [unlockTime], {value: lockedAmount})await lock.waitForDeployment()console.log(`Lock with ${ethers.formatEther(lockedAmount)}ETH and unlock timestamp ${unlockTime} deployed to ${lock.target}`)//简单合约 --------------------------------//获取合约工厂const simpleStorageFactory = await ethers.getContractFactory('SimpleStorage')//部署const simpleContract = await simpleStorageFactory.deploy()//等待部署完成await simpleContract.waitForDeployment()//输出合约地址simpleContract.getAddress().then((address) => console.log('SimpleStorage deployed to:address:', address))//获取当前值const value = await simpleContract.retrieve()console.log('SimpleStorage value:', value.toString())//设置值await simpleContract.store(13)//获取当前值const newValue = await simpleContract.retrieve()console.log('SimpleStorage new value:', newValue.toString())
}// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().then(() => process.exit(0)).catch((error) => {console.error(error)process.exitCode = 1})
Lock合约(Lock.sol)
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;// Uncomment this line to use console.log
// import "hardhat/console.sol";contract Lock {uint public unlockTime;address payable public owner;event Withdrawal(uint amount, uint when);constructor(uint _unlockTime) payable {require(block.timestamp < _unlockTime,"Unlock time should be in the future");unlockTime = _unlockTime;owner = payable(msg.sender);}function withdraw() public {// Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal// console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp);require(block.timestamp >= unlockTime, "You can't withdraw yet");require(msg.sender == owner, "You aren't the owner");emit Withdrawal(address(this).balance, block.timestamp);owner.transfer(address(this).balance);}
}
SimpleStorage合约(SimpleStorage.sol)
// SPDX-License-Identifier: UNKNOWN (this is a comment)pragma solidity ^0.8.24;contract SimpleStorage {uint256 favoriteNumber;bool favoriteBool;struct People {uint256 favoriteNumber;string name;}People public person = People({favoriteNumber: 2, name: 'Patrick'});People[] public people;mapping(string => uint256) public nameToFavoriteNumber;///存储值,是一个非view函数,会改变合约的状态function store(uint256 _favoriteNumber) public {favoriteNumber = _favoriteNumber;}///返回值,是一个view函数,不会改变合约的状态function retrieve() public view returns (uint256) {return favoriteNumber;}///增加人员function addPerson(string memory _name, uint256 _favoriteNumber) public {people.push(People(_favoriteNumber, _name));nameToFavoriteNumber[_name] = _favoriteNumber;}///返回人员function getPerson() public view returns (People[] memory) {return people;}
}
运行脚本
yarn hardhat run scripts/deploy.ts

相关文章:
hardhat学习笔记
hardhat学习笔记会不定时填充内容。 初始化项目 yarn init 安装hardhat依赖 yarn add --dev hardhat 初始化 Hardhat yarn hardhat 代码格式化 yarn add --dev prettier prettier-plugin-solidity 项目中增加.prettierrc 与 .prettierignore 配置文件统一格式࿰…...
算法刷题day28
目录 引言一、截断数组二、双端队列三、日期统计 引言 这几道题是周赛里的几道题目,第一道题目我没用这种方法,但还是做出来了,用的一种比较特殊的思考方法,就是把每一个点都判断出来,不满足要求的就舍弃,…...
vivado 使用Design Runs窗口、
使用Design Runs窗口 “设计运行”窗口显示在项目中创建的所有合成和实现运行。它包括用于配置、管理和启动运行的命令。 打开Design Run窗口 选择窗口 → Design Runs打开“Design Runs”窗口。 设计运行窗口功能 •每个实现运行都缩进显示在其子级的合成运行下面。 …...
基于YOLOv8的手机摄像头的自动检测系统
文章大纲 数据集网络爬虫开源数据集标注目标定义标注标准标注工具标签更换脚本自制数据集下载地址自动检测系统设计与搭建模型训练与准确率代码仓库下载地址参考文献与学习路径随着移动通信技术的飞速发展,消费者对移动终端的要求也越来越高,各厂商纷纷提出自己的特色卖点,其…...
Ubuntu18.04添加内核模块(字符设备)
Ubuntu18.04添加内核模块(字符设备) 虚拟机Ubuntu18.04(内核版本linux-5.4.0-135-generic) 参考 嵌入式Linux驱动开发(一)——字符设备驱动框架入门 1 编译内核模块 创建字符设备代码文件char_dev.c&a…...
PromptBreeder---针对特定领域演化和发展提示词的方法
原文地址:promptbreeder-evolves-adapts-prompts-for-a-given-domain 论文地址:https://arxiv.org/pdf/2309.16797.pdf 2023 年 10 月 6 日 提示方法分为两大类 硬提示是由人工精心设计的文本提示,包含离散的输入令牌;其缺点…...
Java后端八股文之Redis
文章目录 1. Redis是什么?2. Redis为什么这么快?3. 为什么要使用缓存?4. Redis几种使用场景:5. Redis的Zset底层为什么要使用跳表而不是平衡树、红黑树或者B树?6.Redis持久化6.1 什么是RDB持久化6.1.1RDB创建快照会阻塞…...
一维数组_与指定数相同的数的个数
任务描述 输出一个整数序列中与指定数字相同的数的个数。 输入格式: 第一行为N,表示整数序列的长度(N < 100); 第二行为N个整数,整数之间以一个空格分开; 第三行包含一个整数,为指定的整数m。输出格式: 输出为N…...
如何在Linux系统安装SVN并配置固定公网地址远程访问【内网穿透】
文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…...
获取webshell的十种方法
一、直接上传获取webshell 这种对php和jsp的一些程序比较常见,MolyX BOARD就是其中一例,直接在心情图标管理上传。php类型,虽然没有提示,其实已经成功了,上传的文 件url应该是http://forums/images/smiles/下…...
项目实战-tpshop商城项目
项目实战-tpshop商城项目 环境部署准备软件工具准备远程连接测试远程连接测试-查看虚拟机IP地址远程连接测试-检测本机与虚拟机是否连通远程连接测试-通过远程工具连接linux服务器 常见问题处理 环境部署项目技术架构介绍部署tpshop项目-tpshop验证数据库验证用户信息表熟悉商品…...
网络地址转换协议NAT
网络地址转换协议NAT NAT的定义 NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因…...
Vue教学18:Element UI进阶组件探索,提升Vue应用的专业性
大家好,欢迎回到我们的Vue教学系列博客!在前十七篇博客中,我们学习了Vue.js的基础知识、安装Node.js与npm、使用Vue Devtools进行调试、Vue实例与生命周期钩子、数据绑定(单向与双向)、计算属性与侦听器、条件渲染和列…...
UE5.1_TimeLine
UE5.1_TimeLine 问题引入:UE的Timeline可以在一个场景下无限制的使用多少次?一个动画流程的Timeline的时间持续怎么算?TimeLine中嵌套Timeline的做法是否是合理的?...
Qt自定义控件
自定义控件 目的:将多个控件或者窗口作为一个整体被多次复用。 操作方式 1.首先进行自定义的ui设计,以及对应的.h和.cpp文件 2.到要使用的UI界面上,从控件库中拖拽一个Widget控件 3.右键点击"提升为" 4.填写自定义实现的类名&…...
nRF52832——串口 UART 和 UARTE 外设应用
nRF52832——串口 UART 和 UARTE 外设应用 UART 和 UARTE 原理UART 功能描述UARTE 功能介绍 应用实例串口打印实例串口输入与回环UART 模式串口中断 UART 和 UARTE 原理 UART 功能描述 串口 UART 也称为通用异步收发器。是各种处理器中常用的通信接口,在 nRF52 芯…...
String 底层为什么使用 final 修饰?
1、典型回答 对于这个问题,Java之父詹姆斯 高斯林(James Gosling) 是这样回答的: I would use an immutable whenever I can 翻译为中文:只要允许,我就会使用不可变对象 而作为普通人的我们来说࿰…...
NIN网络中的网络
是什么 intro LeNet→AlexNet→VGG→NiN→GoogLeNet→ResNetLeNet→AlexNet→VGG 卷积层模块充分抽取空间特征全连接层输出分类结果AlexNet & VGG 改进在于把两个模块加宽 、加深(加宽指增加通道数,那加深呢?(层数增加叭 Ni…...
Cloudflare Tunnel:无惧DDOS_随时随地安全访问局域网Web应用
利用此方法,您可以在局域网(尤其是NAS)上搭建的Web应用支持公网访问,成本低而且操作简单! 如果这是博客的话,它还可以有效防止DDOS攻击! 准备工作: 需要一个域名(推荐N…...
高质量快刊!中科院1区TOP,Elsevier出版社,最快2个月23天录用!20天见刊!
【SciencePub学术】 01 期刊基本信息 【期刊简介】IF:11.0-11.5,JCR1区,中科院1区TOP 【出版社】Elsevier出版社 【版面情况】正刊,2023.3.31截稿 【检索情况】SCIE&EI双检,预计3个月左右录用 【征稿领域】…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

