Skip to main content

Command Palette

Search for a command to run...

使用hardhat开发、测试web3项目

Published
3 min readView as Markdown
C
酷愛計算機技術Ardently Love Computer Technology 長期關註反洗錢反欺詐Long-term Focus on Anti-Money Laundering and Anti-Fraud 精通支付結算的技術、系統、流程和製度Proficient in the Technology, System, Process and Institution of Payment and Settlement

下载vscode安装包

https://vscode.download.prss.microsoft.com/dbazure/download/stable/dfaf44141ea9deb3b4096f7cd6d24e00c147a4b1/code_1.101.0-1749655245_amd64.deb

安装

$ sudo dpkg -i code_1.101.0-1749655245_amd64.deb

vscode设置字体,安装插件

solidity hardhat

javascript

Prettier Code formatter增强代码易读性


创建项目文件夹Web3Tutorial

$ mkdir Web3Tutorial

npm初始化

$ npm init

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help init` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (web3tutorial) 
version: (1.0.0) 
description: 
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: 
license: (ISC)

一律默认回车


新建hardhat项目

$ npx hardhat

Need to install the following packages:
hardhat@2.24.3
Ok to proceed? (y) y

选第一个创建javascript项目

Welcome to Hardhat v2.24.3
? What do you want to do? 
? Create a JavaScript project
  Create a TypeScript project
  Create a TypeScript project (with Viem)
  Create an empty hardhat.config.js
  Quit

又会要求选择,全部默认回车,等待安装创建


在项目文件夹下打开vscode

hardhat.config.js是hardhat配置

.gitignore是git不需要上传的文件

配置git全局文件,把当前文件夹纳入git管理

$ git init

已重新初始化已存在的 Git 仓库于 /home/zhangyu/Web3Tutorial/.git/

查看git状态

$ git status

位于分支 master 尚无提交未跟踪的文件: (使用 "git add <文件>..." 以包含要提交的内容)

添加全部文件

$ git add .

$ git status

位于分支 master 尚无提交 要提交的变更: (使用 "git rm --cached <文件>..." 以取消暂存)

$ git commit -m "project init"

[master(根提交) c9b3d14] project init 9 files changed, 8062 insertions(+)

想要忽略任何文件/文件夹,就把它加入到.gitignore


https://github.com/smartcontractkit/Web3_tutorial_Chinese/

contracts文件夹下新建FundMe.sol文件

把源代码全部复制进来

import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

chainlink/contracts找不到所以显示红色线 命令行

cnpm安装chainlink/contracts,等待安装完成

$ cnpm install @chainlink/contracts --save-dev

? Linked 1 latest versions fallback to /home/zhangyu/Web3Tutorial/node_modules/.store/node_modules
? Installed 1 packages on /home/zhangyu/Web3Tutorial
? All packages installed (used 2s(network 2s), speed 0B/s, json 0(0B), tarball 0B, manifests cache hit 1, etag hit 1 / miss 0)
devDependencies:
+ @chainlink/contracts ^1.3.0

回到vscode看到package.json文件的devDependencies下已经多了 "@chainlink/contracts": "^1.3.0"

再回到FundMe.sol文件 import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol" 的红色线已经消失

在项目文件夹内使用hardhat编译

$ npx hardhat compile

Error HH404: File @chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol, imported from contracts/FundMe.sol, not found.

报错还是找不到这个导入文件

来到chainlink的github代码,文件路径发生变化

在代码仓库搜索AggregatorV3Interface.sol 当前路径加了shared

修改合约开头导入文件的路径,再次编译成功

$ npx hardhat compile

Compiled 3 Solidity files successfully (evm target: paris).

生成artifacts和cache文件夹


编译之后就是部署,使用脚本部署

新建文件夹scripts,并在文件夹内新建文件deployFundMe.js

首先导入ethers.js,再创建主函数,最后执行主函数 运行脚本错误

$ npx hardhat run scripts/deployFundMe.js

contract is deploying

Error: incorrect number of arguments to constructor

构造函数需要传入参数 _locktime取值设为10 再次运行脚本成功

$ npx hardhat run scripts/deployFundMe.js

contract is deploying

contract has been deployed successfully, contract address is 0x5FbDB2315678afecb367f032d93F642f64180aa3

以上是部署在hardhat本地网络 这是hardhat自带内置的网络,即本地的ethereum网络


在hardhat.config.js文件里配置defaultNetwork

module.exports = { defaultNetwork:"hardhat",...}

在部署脚本的时候,加参数,即部署到默认网络,成功

$ npx hardhat run scripts/deployFundMe.js --network hardhat

contract is deploying

contract has been deployed successfully, contract address is 0x5FbDB2315678afecb367f032d93F642f64180aa3

只有默认网络不是hardhat,才需要修改配置文件和加参数


下面把部署的网络参数写到配置文件里

使用alchemy服务商取得url 通过邮箱和密码登录之后,在主界面Apps里创建应用,选择ethereum链和sepolia测试网,选择https协议,复制url 把url粘贴到hardhar.config.js文件的network

下面填写accounts的钱包私钥

选择某个钱包地址对应的私钥,粘贴到accounts[""]里

由于暂时未取得测试币,所以报错。即便更换holesky网络也不行

$ npx hardhat run scripts/deployFundMe.js --network sepolia

contract is deploying

ProviderError: insufficient funds for gas * price + value: have 0 want 1485678494676


下面配置.env敏感信息文件。一定要在根目录下创建.env文件[否则报错找不到环境变量]

在.env文件里,设置变量名分别保存敏感信息

SEPOLIA_URL=

PRIVATE_KEY=

把之前hardhat.congfig.js文件中sepolia网络参数粘贴过来

为了能在config.js文件中调用.env需要安装dotenv 直接使用npm安装还是太慢,仍然使用cnpm安装,速度飞快

$ npm install -g cnpm --registry=https://registry.npmmirror.com

changed 66 packages in 28s

59 packages are looking for funding

$ cnpm install --save-dev dotenv

? Linked 1 latest versions fallback to /home/zhangyu/Web3Tutorial/node_modules/.store/node_modules
? Installed 1 packages on /home/zhangyu/Web3Tutorial
? All packages installed 
devDependencies:
+ dotenv ^16.5.0

在package.json文件的"devDependencies"也看到"dotenv": "^16.5.0"安装

在config.js文件开头引入dotenv.config()方法,再运行变量设置为常量

把sepolia网络配置参数替换为常量,可以运行


虽然敏感信息保存在.env文件,但还是明文。现在使用env-enc包对敏感信息加密

仍然使用cnpm安装

$ cnpm install --save-dev @chainlink/env-enc

All packages installed
devDependencies:
+ @chainlink/env-enc ^1.0.5

回到package.json文件,看到"@chainlink/env-enc": "^1.0.5"确实安装成功

现在使用env-enc对敏感信息加密,先要设置密码

$ npx env-enc set-pw

Enter the password (input will be hidden):*****

再把变量加密

$ npx env-enc set

Please enter the variable name (or press ENTER to finish): 
SEPOLIA_URL
Please enter the variable value (input will be hidden): 
*********************************************************************
Would you like to set another variable? Please enter the variable name (or press ENTER to finish): 
PRIVATE_KEY
Please enter the variable value (input will be hidden): 
******************************************************************
Would you like to set another variable? Please enter the variable name (or press ENTER to finish):

回到vscode,在根目录下多了.env.enc文件,保存的就是加密后的敏感变量

SEPOLIA_URL: ENCRYPTED|

PRIVATE_KEY: ENCRYPTED|

在config.js文件中,引入的不再是dotenv而是chainlink/env.enc

$ npx hardhat run scripts/deployFundMe.js --network sepolia

contract is deploying

ProviderError: insufficient funds for gas * price + value: have 0 want 1238079237144

此时可以删除.env文件,只保留加密后的文件.env.enc,并把.gitignore文件加入.env.enc


使用hardhat对合约进行验证,需要安装插件@nomicfoundation/hardhat-verify

https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify 有详细说明

安装hardhat-verify

$ cnpm install @nomicfoundation/hardhat-verify --save-dev

All packages installed
devDependencies:
+ @nomicfoundation/hardhat-verify ^2.0.14

安装完成后,在config.js文件出现"@nomicfoundation/hardhat-verify": "^2.0.14"

More from this blog

Penetration Test、Python、Weaponization

721 posts

微信 smartcat9999 反欺詐Anti-Fraud 反洗錢Anti-Money Laundering 反逃稅Anti-Tax Evasion 滲透測試Penetration Test 武器化Weaponization