【开发提效工具】hardhat 深入学习指南

hardhat集成了编译、测试、部署等功能,支持TypeScript,还提供了本地开发网络和调试工具。这篇文章详细介绍了hardhat的特点以及核心功能。

什么是 hardhat

Hardhat 是一个用于以太坊智能合约的开发环境,它集成了编译、测试、部署等功能,支持 TypeScript,还提供了本地开发网络和调试工具。

特点

  • 专为以太坊开发的智能合约开发环境(支持其他EVM链)。
  • 功能:编译、部署、测试、调试、任务自动化。

核心功能

  • 内置本地网络:快速测试交易,默认端口 8545
  • Solidity 调试:精确错误信息,堆栈跟踪。
  • 任务系统:自定义脚本自动化流程。
  • 插件生态:集成工具如 Etherscan、Waffle。

安装

你需要确保已经安装了 Node.js 和 npm(Node 包管理器)。 最好你的 node 版本 >= 18,然后执行一下命令安装 hardhat。

npm install --save-dev hardhat
npx hardhat init

然后根据自己的需要选择合适的模板即可(Javascript/typescript)。

目录结构

contracts/    # Solidity 合约
scripts/     # 部署脚本
test/        # 测试用例
hardhat.config.js  # 配置文件

自定义任务

  1. 自定义任务 Hardhat 的核心是一个任务运行器,可让您自动化开发工作流程。它自带一些内置任务,例如 compile 和 test ,但您也可以添加自己的自定义任务。

    比如我们可以自己写一个打印可用账号列表的任务:

    task(
    "accounts", 
    "Prints the list of accounts", 
    async (taskArgs, hre) => { 
        const accounts = await hre.ethers.getSigners(); 
        for (const account of accounts{
                console.log(account.address); 
            } 
        }
    );

    执行npx hardhat accounts 即可运行。

task参数说明:

  • 第一个参数:任务的名称
  • 第二个参数:任务的描述,它会在 npx hardhat help 中打印出来
  • 第三个参数:是一个异步函数,在运行任务时执行 这个函数又包括两个参数:
    1. 任务参数的对象。这里我们并没有定义
    2. hardhat 运行时环境(HRE),包含hardhat及其插件的所有功能

测试与调试

在 test 目录下编写合约的测试用例,例如 sample-test.js

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("Greeter", function () {
  it("Should return the new greeting once it's changed", async function () {
    const Greeter = await ethers.getContractFactory("Greeter");
    const greeter = await Greeter.deploy("Hello, world!");
    await greeter.deployed();

    expect(await greeter.greet()).to.equal("Hello, world!");

    const setGreetingTx = await greeter.setGreeting("Hola, mundo!");

    // wait until the transaction is mined
    await setGreetingTx.wait();

    expect(await greeter.greet()).to.equal("Hola, mundo!");
  });
});

上述测试用例使用了 ethers.js 库和 chai 断言库,用于测试 Greeter 合约的 greet 和 setGreeting 方法。

  • 运行测试:npx hardhat test

如果所有测试用例都通过,你会看到类似以下的输出:

Greeter
    √ Should return the new greeting once it's changed (102ms)

  1 passing (123ms)

部署合约

在 scripts 目录下创建一个部署脚本,例如 deploy.js

 console.log("Account balance:", (await deployer.getBalance()).toString());

  const Greeter = await ethers.getContractFactory("Greeter");
  const greeter = await Greeter.deploy("Hello, Hardhat!");

  console.log("Greeter address:", greeter.address);
}

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

使用以下命令来部署合约:

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

这里的 --network localhost 表示使用 Hardhat 提供的本地开发网络进行部署。

如果跨链部署只需修改为自己配置的网络即可,如:

npx hardhat run scripts/deploy.js --network sepolia

调试技巧

  • console.log:在 Solidity 中使用(需 HardhatConsole 导入)。
  • 错误跟踪:Hardhat 提供精确的错误位置及调用堆栈。

配置文件示例

你可以在 hardhat.config.js 中配置不同的网络,例如以太坊主网、sepolia 测试网等。以下是一个示例配置:

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config(); // 用于环境变量配置

module.exports = {
  solidity: "0.8.20",
  networks: {
    sepolia: {
      url: process.env.ALCHEMY_URL,
      accounts: [process.env.PRIVATE_KEY]
    },
    localhost: { 
      url: "http://127.0.0.1:8545"
    }
  },
  etherscan: {
    apiKey: process.env.ETHERSCAN_KEY
  }
};

在使用不同网络之前,你需要在 .env 文件中设置相应的环境变量,例如 ROPSTEN_URLPRIVATE_KEY 和 ETHERSCAN_API_KEY

验证合约

如果你想在 Etherscan 等区块链浏览器上验证合约,可以使用 Hardhat 提供的插件。首先安装 @nomiclabs/hardhat-etherscan 插件:

npm install --save-dev @nomiclabs/hardhat-etherscan

然后在 hardhat.config.js 中配置 Etherscan API 密钥。最后,使用以下命令验证合约:

npx hardhat verify --network ropsten <DEPLOYED_CONTRACT_ADDRESS> "Hello, Hardhat!"

将 <DEPLOYED_CONTRACT_ADDRESS> 替换为你实际部署的合约地址。

常用插件

  • @nomicfoundation/hardhat-verify:验证合约源码。
  • hardhat-gas-reporter:分析 Gas 消耗。
  • hardhat-deploy:管理部署脚本。

Gas 优化报告

Gas Reporter 是一个 Hardhat 插件,用于分析智能合约的 Gas 消耗,帮助开发者:

  1. 量化函数成本:精确测量每个函数调用消耗的 Gas。
  2. 优化合约代码:定位高 Gas 消耗的函数,针对性优化。
  3. 预估费用:根据当前 Gas 价格估算实际费用(支持 ETH/USD 等货币单位)。

这里涉及的内容比较多,如果想知道更多详细的内容,请移步gas优化报告的详细使用方法

资源推荐

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
mengbuluo222
mengbuluo222
前端开发求职中... 8年+开发经验,拥有丰富的开发经验,擅长VUE、React开发。