环境搭建

  • 装置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合约测验。