前言
上回书说到hardhat入门使用的操作,这次我们用hardhat来创建一个自己的项目
参考网站:http://hardhat.cn/kn/
一、准备工作
大概步骤包括编写合约,编译合约,测试合约,部署验证合约,准备npm,hardhat,本次我会具体讲解代码的实际含义是什么,让我们开始吧
二、操作步骤
1.编写合约
写一个sol文件,包含设置ABC的大小,获取DE大小的 calculate.sol
// SPDX-License-Identifier: BXYMIT
pragma solidity ^0.8.19;
contract Calculate {
uint256 public A; //序号29
uint256 public B; //手机尾号7679
uint256 public C; //幸运数字23
function setA(uint256 _value) public {
A = _value;
}
function setB(uint256 _value) public {
B = _value;
}
function setC(uint256 _value) public {
C = _value;
}
function getD() public view returns (uint256) {
return A + B - C;
}
function getE() public view returns (uint256) {
return A * B - C;
}
}
2.编译合约
在创建hardhat项目过程中选择创建(empty)空项目,前面的步骤可以参考上期博客
npx hardhat init
在项目文件夹下手动创建contracts/calculate.sol,test/calculate.js,scripts/deploy.js。将要编译的合约文件放到contracts目录下面
再启动本地链 npx hardhat node
编译合约 npx hardhat compile
3.下载依赖
在hardhat.config.js文件里手动输入 require("@nomicfoundation/hardhat-toolbox");
并且在控制台里用npm下载npm i --save-dev @nomicfoundation/hardhat-toolbox
4.测试合约
npm下载依赖npm i --save-dev @nomicfoundation/hardhat-network-helpers
,测试合约的结果是否符合自己的预期结果 npx harhat test
- 代码解释:用了chai断言库中的expect方法,loadFixture 方法来自于
@nomicfoundation/hardhat-network-helpers 包,用于加载一个固定的测试环境。 - deployCalculateFixture 函数用于部署合约并返回相关的对象,包括合约实例、签名器等。
- Deployment 描述块描述了合约部署后的功能测试,使用了 loadFixture
函数加载了一个固定的测试环境,解构赋值得到部署了合约的实例 hardhatCalculate,然后通过合约的方法来设置合约中的参数,并且在每次设置完参数后都对对应的D设置了断言
const { expect } = require('chai');
const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
describe('Calculate contract', function () {
async function deployCalculateFixture() {
const Calculate = await ethers.getContractFactory('Calculate');
const [owner,addr1,addr2] = await ethers.getSigners();
const hardhatCalculate = await Calculate.deploy();
const CalculateAddress = await hardhatCalculate.getAddress();
console.log("合约地址==>", CalculateAddress)
return { Calculate,hardhatCalculate,owner,addr1,addr2 };
}
describe("Deployment", function(){
it("D获取到的值应该为A+B-C", async function () {
const { hardhatCalculate } = await loadFixture(deployCalculateFixture);
await hardhatCalculate.setA(29);
expect(await hardhatCalculate.getD()).to.equal(29);
await hardhatCalculate.setB(7679);
expect(await hardhatCalculate.getD()).to.equal(7708);
await hardhatCalculate.setC(23);
expect(await hardhatCalculate.getD()).to.equal(7685);
});
});
});
5.部署合约
npx hardhat run ./scripts/deploy.js
deploy.js文件内调用异步函数main,首先获取了两个账户的签名器(deployer 和 address1)
getContractFactory 方法来获取一个名为 “Calculate” 的智能合约的工厂,在括号中传入的是该智能合约的 Solidity 文件的文件名(不包括文件扩展名 .sol),Hardhat 将会根据这个文件找到相应的合约代码,并生成一个合约工厂对象,然后用该对象部署一个叫做 “calculate” 的智能合约,并输出了合约的地址。接着通过调用合约的方法设置了几个参数,分别是 A、B、C,并输出了每次调用的区块号。最后,它调用了合约的两个方法获取了 D 和 E 的值,并将它们输出。
const hardhat = require("hardhat");
async function main() {
const [deployer,address1] = await ethers.getSigners();
console.log("合约部署账户==>", await deployer.getAddress());
console.log("接受者账户==>", await address1.getAddress());
const Calculate = await hardhat.ethers.getContractFactory("Calculate");
const calculate = await Calculate.deploy();
console.log("calculate合约地址==>",await calculate.getAddress())
await calculate.setA(29).then(res => (
console.log("setA成功,区块号===>",res.blockNumber)
));
await calculate.setB(7679).then(res => (
console.log("setB成功,区块号===>",res.blockNumber)
));
await calculate.setC(23).then(res => (
console.log("setC成功,区块号===>",res.blockNumber)
));
await calculate.getD().then(res => (
console.log("获取D成功===>",res)
));
await calculate.getE().then(res => (
console.log("获取E成功===>",res)
));
}
main();
总结
以上操作实现了用hardhat编译部署一个自己的合约,并进行了测试和部署验证,下次博客是与前端交互,实现一个完整的DAPP