环境搭建
- 安装Node.js和npm:访问Node.js官网,下载并安装Node.js,npm会自动安装。
- 创建Hardhat项目
- 使用npm安装Hardhat:在终端中输入npm install --save-dev hardhat即可安装Hardhat。
- 输入npx hardhat,按照提示进行项目的创建。
mkdir LearnHardhat
cd LearnHardhat
npm init
npx hardhat
# 项目目录如下
├── README.md
├── contracts
│ └── HelloWorld.sol
├── hardhat.config.js
├── node_modules
├── package-lock.json
├── package.json
├── scripts
│ └── deploy.js
└── test
└── Lock.js
- contracts是自动创建的存放智能合约的目录
- scripts是自动创建的存放部署脚本的目录
- hardhat.config.js是hardhat的配置文件
配置文件
Hardhat的配置文件是一个JavaScript文件,用于配置Hardhat的各种选项和插件。该配置文件的默认名称为hardhat.config.js。 Hardhat的配置文件结构如下:
module.exports = {
solidity: {
version: "0.8.4",
settings: {
optimizer: {
enabled: true,
runs: 200
}
}
},
networks: {
hardhat: {
chainId: 1337
}
}
}
其中,solidity选项用于配置Solidity编译器的版本和优化选项;networks选项用于配置Hardhat支持的网络,例如Hardhat本地测试网络和以太坊主网等。 以下是一些常用选项的解释和示例:
solidity.version:指定Solidity编译器的版本,例如"0.8.4"; solidity.settings.optimizer.enabled:开启Solidity优化选项; solidity.settings.optimizer.runs:Solidity优化运行次数; networks.hardhat.chainId:Hardhat本地测试网络的链ID。
Solidity合约编写
- 编写简单的Solidity智能合约:在Hardhat项目中,使用Solidity编写合约代码并保存为.sol文件。例如,可以创建一个简单的HelloWorld.sol合约,代码如下:
pragma solidity ^0.8.0;
contract HelloWorld {
string public greeting = "Hello, World!";
}
- 编译Solidity合约:在终端中输入
npx hardhat compile命令,编译Solidity合约代码。编译后的合约代码将被保存在./artifacts/contracts目录中。 - 部署Solidity合约:在Hardhat项目中,使用JavaScript编写合约部署脚本,并在终端中输入
npx hardhat run scripts/deploy.js命令,部署Solidity合约。以下是一个简单的部署脚本deploy.js的示例代码:
async function main() {
const [deployer] = await ethers.getSigners();
console.log("Deploying contracts with the account:", deployer.address);
const HelloWorld = await ethers.getContractFactory("HelloWorld");
const helloWorld = await HelloWorld.deploy();
console.log("Contract address:", helloWorld.address);
}
main()
.then(() => process.exit(0))
.catch(error => {
console.error(error);
process.exit(1);
});
Solidity合约测试
- 编写Solidity合约测试脚本:在Hardhat项目中,使用JavaScript编写Solidity合约测试脚本,并在终端中输入
npx hardhat test命令,运行Solidity合约测试。以下是一个简单的测试脚本test.js的示例代码:
const { expect } = require("chai");
describe("HelloWorld", function() {
it("Should return the correct greeting", async function() {
const HelloWorld = await ethers.getContractFactory("HelloWorld");
const helloWorld = await HelloWorld.deploy();
await helloWorld.deployed();
expect(await helloWorld.greeting()).to.equal("Hello, World!");
});
});
这段代码是用于测试Solidity合约的代码,它包括一个测试用例。该测试用例使用chai断言库中的expect函数检查
helloWorld.greeting()函数是否返回了字符串"Hello, World!",以验证Solidity合约是否按照预期工作。在这个测试用例中,我们首先使用ethers.js中的getContractFactory函数获取HelloWorld合约的工厂类,然后使用该工厂类的deploy函数部署合约。最后,我们调用deployed函数等待合约部署成功,再调用greeting函数获取合约的问候语,然后使用chai中的expect函数判断获取到的问候语是否为"Hello, World!"。
- 运行Solidity合约测试:在终端中输入npx hardhat test命令,运行Solidity合约测试。
npx hardhat test
Hardhat插件
- 插件介绍:Hardhat支持各种插件,用于扩展Hardhat的功能。例如,Hardhat Network插件用于在本地模拟以太坊网络,可以方便地进行合约部署和测试。
- 安装Hardhat Network插件:在终端中输入
npm install --save-dev @nomiclabs/hardhat-waffle,安装Hardhat Network插件。 - 修改配置文件:在配置文件中添加Hardhat Network插件的配置,例如:
require("@nomiclabs/hardhat-waffle");
module.exports = {
solidity: "0.8.0",
networks: {
hardhat: {
chainId: 1337
}
}
};
@nomiclabs/hardhat-waffle插件是Hardhat中用于测试Solidity合约的插件之一,提供了对Waffle和Ethers.js等库的支持。
module.exports是Node.js模块系统的输出对象,它定义了Hardhat的配置信息,包括:
solidity:Solidity编译器版本,这里设置为"0.8.0"。networks:网络配置对象,这里只配置了一个Hardhat本地节点,其chainId为1337。在Hardhat中,每个网络都有一个唯一的chainId,用于在多个网络之间进行区分。这里的配置表示我们在Hardhat本地节点上进行Solidity合约的开发和测试。
- 运行Hardhat Network:在终端中输入
npx hardhat node命令,启动Hardhat Network。 - 在Hardhat Network上部署和测试Solidity合约:在终端中输入
npx hardhat run scripts/deploy.js --network localhost,部署Solidity合约; - 在终端中输入
npx hardhat test --network localhost,运行Solidity合约测试。