环境搭建
- 装置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合约测验。