DAPP开发框架之hardhat进阶使用

本文详细介绍了如何使用Hardhat工具进行智能合约的开发过程,包括编写、编译calculate.sol合约,安装依赖,测试合约功能,并部署到本地链。作者通过示例展示了如何设置和获取合约变量,以及使用Chai和NomicFoundation库进行测试。
摘要由CSDN通过智能技术生成


前言

上回书说到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

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值