一看就会的Hardhat使用入门教程

9,549 阅读4分钟

环境搭建

  • 安装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合约测试。