mac搭建hardhat以太坊开发环境
2025-01-22 13:34:43 # Web3

Node环境配置

首先安装nvm,再安装node18,为了和hardhat的运行环境匹配

1
brew install nvm

配置nvm环境,在~/.zshrc中加入下面的内容。

编辑~/.zshrc,如下:

1
vim ~/.zshrc

加入

1
2
3
export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh" # This loads nvm
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion

保存,并

1
source ~/.zshrc

配置好后,如下:

image-20250113214138233

接下来,安装node18,使用下面命令:

1
nvm install 18

如下,安装成功。

image-20250113214511440

搭建hardhat环境

创建一个目录,专门用于以太坊学习,随意,如/Web3

1
2
3
4
5
cd /Web3
mkdir hardhat-simple-contract
cd hardhat-simple-contract
npm init -y
npm install --save-dev hardhat

然后初始化hardhat项目

1
npx hardhat

选择第一个创建一个JavaScript project,项目路径选择刚开始创建文件夹的路径。

注意⚠️我这里是换了一个路径演示一下。

image-20250113232445250

初始化后的文件目录如下:

image-20250113234740753

其中的scripts文件夹需要自己创建。

部署智能合约

进入到文件夹contracts下,创建合约文件SimpleStorage.sol,简单的部署一个合约,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStorage {
uint256 private storedValue;

event ValueChanged(uint256 newValue);

function set(uint256 value) public {
storedValue = value;
emit ValueChanged(value);
}

function get() public view returns (uint256) {
return storedValue;
}
}

然后进入到创建的scripts文件夹下,创建部署合约的脚本deploy.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const hre = require("hardhat");

async function main() {
// 获取合约工厂
const SimpleStorage = await hre.ethers.getContractFactory("SimpleStorage");

// 部署合约
const simpleStorage = await SimpleStorage.deploy();

// 等待部署完成
await simpleStorage.waitForDeployment();

// 获取合约地址
console.log(`SimpleStorage deployed to: ${simpleStorage.target}`);
}

main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});

首先需要对编写的智能合约进行编译

1
npx hardhat compile

编译成功后,会输出Compiled 2 Solidity files successfully (evm target: paris)

然后启动本地的以太坊网络,如下:

1
npx hardhat node

image-20250113221945116

以太坊网络启动成功。

进行合约的部署,执行部署的js文件如下:

1
npx hardhat run scripts/deploy.js --network localhost

image-20250113222224915

合约成功部署,得到部署合约的地址0x5fbdb2315678afecb367f032d93f642f64180aa3

调用合约函数

创建一个调用合约的代码test.js,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// scripts/test.js
async function main() {
const SimpleStorage = await ethers.getContractAt("SimpleStorage", "0x5fbdb2315678afecb367f032d93f642f64180aa3");

// 在这里继续编写脚本逻辑,例如读取或调用合约方法
const value = await SimpleStorage.set(42); // 假设你的合约有一个 `get` 方法
//const value = await SimpleStorage.get()
console.log("Stored value:", value);
}

// 捕获错误
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});

将其保存在scripts文件夹下。

代码的大致意思是,调用合约的set函数方法,设置值为42,然后再调用get方法去读取数据。

先是调用set方法,如图所示:

1
npx hardhat run scripts/test.js  --network localhost

image-20250113235445672

然后再调用get方法,获取set的值。

image-20250113235806214