以太坊 - Hardhat入门 - Coinsbench

  • CoinsBench
  • 发布于 2025-05-29 16:22
  • 阅读 106

本文介绍了Hardhat这一以太坊开发环境的关键组件、环境搭建步骤、项目结构、智能合约的编写编译部署流程、调试方法、测试方法以及插件的使用。通过本文,读者可以了解如何使用Hardhat进行原生以太坊智能合约的开发和测试。

Hardhat 简介

什么是 Hardhat?

Hardhat 是一个全面的以太坊软件开发环境。它可以帮助我们高效地构建、测试和部署智能合约和去中心化应用程序(dApps)。让我们来探索它的关键组件:

关键组件:

Hardhat Runner: 这是我们使用的主要接口。它允许我们自动化诸如编译合约、运行测试和部署到网络等任务。我们还可以使用插件扩展它,以适应我们的工作流程。(hardhat.org

Hardhat Network: 这个内置的原生以太坊网络允许我们在我们的机器上直接部署合约、运行测试和调试代码。它提供快速反馈,并支持 Solidity console.log() 以简化调试。

Hardhat Ignition: 这是一个声明式部署系统,使我们能够在不导航部署过程的机制的情况下部署我们的智能合约。

设置开发环境

Node.js 和 npm 的安装

要使用 Hardhat 开发以太坊应用程序,我们需要安装 Node.js 和 npm。Node.js 是一个 JavaScript 运行时,它允许我们在浏览器之外运行 JavaScript 代码。npm (Node Package Manager) 帮助我们管理项目依赖。

让我们逐步介绍不同操作系统的安装步骤。

🪟 Windows

  1. 访问 Node.js 官方网站 并下载适用于 Windows 的 LTS(长期支持) 版本。此版本包括 Node.js 和 npm。
  2. 运行下载的 .msi 安装程序。按照提示操作,接受许可协议,然后继续使用默认设置。确保选中安装 npm 的选项。
  3. 打开终端并运行:
$ node -v
v22.11.0
$ npm -v
10.9.0

这些命令应显示已安装的 Node.js 和 npm 的版本。

🍏 macOS

  1. 安装 Homebrew(如果尚未安装)
  2. 打开终端并运行:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. 安装 Homebrew 后,运行:
brew install node
  1. 检查已安装的版本:
$ node -v
v22.11.0
$ npm -v
10.9.0

🐧 Linux (Ubuntu/Debian)

  1. 更新软件包索引
sudo apt update
  1. 运行以下命令:
$ sudo apt install nodejs
$ sudo apt install npm
  1. 检查已安装的版本:
$ node -v
v22.11.0
$ npm -v
10.9.0

Hardhat 安装

  1. 创建一个新的项目目录 首先,为你的项目创建一个目录并导航到该目录:
$ mkdir my-hardhat-project
$ cd my-hardhat-project

2. 初始化一个新的 npm 项目 初始化一个新的 npm 项目。这将创建一个 package.json 文件来管理你的项目的依赖项:

$ npm init -y

-y 标志自动接受默认设置。

3. 安装 Hardhat 将 Hardhat 安装为开发依赖项:

$ npm install --save-dev hardhat

此命令下载 Hardhat 并将其安装到你的项目目录中。安装后,Hardhat 将出现在你的 package.json 文件中的 devDependencies 下。

4. 初始化 Hardhat 项目 安装 Hardhat 后,使用新的初始化命令设置你的项目:

npx hardhat init

此命令启动 Hardhat 设置向导。系统将提示你选择项目类型。要快速入门,请选择 “创建一个 JavaScript 项目” 并处理下一个向导步骤。此选项设置一个基本项目,其中包含示例合约和测试。最后,我们将看到以下消息:

Project created

See the README.md file for some example tasks you can run

Give Hardhat a star on Github if you're enjoying it!

https://github.com/NomicFoundation/hardhat

项目结构概览

当我们初始化一个新的 Hardhat 项目时,它会设置一个结构化的环境来简化智能合约的开发。让我们探索这个结构的关键组件。

文件夹

📁 contracts 此目录包含我们所有的 Solidity 智能合约。每个 .sol 文件定义了合约的逻辑和状态。例如,Lock.sol 演示合约可以管理时间锁定的资金。

📁 ignition/modules 在这里,我们使用 Hardhat Ignition 定义部署模块。Ignition 允许我们声明式地指定应如何部署和配置合约。每个模块概述要部署的合约及其初始化参数。这种方法通过自动处理依赖关系和执行顺序来简化复杂的部署过程。部署文件示例:

const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules");

const JAN_1ST_2030 = 1893456000;
const ONE_GWEI = 1_000_000_000n;

module.exports = buildModule("LockModule", (m) => {
  const unlockTime = m.getParameter("unlockTime", JAN_1ST_2030);
  const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI);

  const lock = m.contract("Lock", [unlockTime], {
    value: lockedAmount,
  });

  return { lock };
});

📁 test 此文件夹包含我们的测试脚本。使用诸如 MochaChai 之类的框架,我们编写测试以确保我们的合约按预期运行。例如,Lock.js 可能会测试 Lock.sol 合约的功能,从而验证在各种情况下的正确行为。

配置

hardhat.config.js 是我们 Hardhat 项目的中心配置文件。它定义了诸如 Solidity 编译器版本、网络配置和插件集成之类的设置。以下是其组件的细分。

Solidity 版本。 指定要使用的 Solidity 编译器的版本:

  module.exports = {
    solidity: "0.8.17",
  };

网络。 配置不同的区块链网络以进行部署和测试。例如,设置 Rinkeby 测试网:

  module.exports = {
    networks: {
      rinkeby: {
        url: "https://rinkeby.infura.io/v3/YOUR_INFURA_PROJECT_ID",
        accounts: ["0xYOUR_PRIVATE_KEY"],
      },
    },
  };

插件。 将其他功能集成到 Hardhat 中。例如,添加 Hardhat Toolbox 插件:

require("@nomicfoundation/hardhat-toolbox");

编写和编译智能合约

让我们编写一个简单的 Solidity 智能合约,以获得以太坊开发的实践经验。我们将创建一个存储和检索消息的合约。

设置合约文件

在你的项目的 contracts 目录中,创建一个名为 Messaging.sol 的新文件。

编写 Solidity 代码

打开 Messaging.sol 并添加以下代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

contract Messaging {
    string public message;

    constructor(string memory _message) {
        message = _message;
    }

    function updateMessage(string memory _newMessage) public {
        message = _newMessage;
    }
}

此合约执行以下操作:

  • 声明一个公共字符串变量 message
  • 通过构造函数设置初始消息。
  • 提供一个函数 updateMessage 来更改消息。

编译合约

在你的终端中,运行:

npx hardhat compile

此命令编译你的合约并生成必要的构件。

启动本地 Hardhat 节点

在你的终端中,运行:

$ npx hardhat node

这将在 http://127.0.0.1:8545/ 上运行一个原生以太坊网络。

部署合约

要在本地环境中部署合约,请在 ignition/modules/ 目录中创建一个名为 MessagingModule.js 的新文件,其中包含以下内容:

const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules");

module.exports = buildModule("MessagingModule", (m) => {
  const messaging = m.contract("Messaging", ["Hello, Hardhat!"]);
  return { messaging };
});

此模块定义了 Messaging 合约的部署配置,将其初始消息设置为“Hello, Hardhat!”。要部署合约,请在你的终端中运行以下命令:

$ npx hardhat ignition deploy ignition/modules/MessagingModule.js --network localhost

成功部署后,Hardhat 将输出已部署合约的地址。部署完成后,你可以使用 Hardhat 的控制台与你的合约进行交互:

$ npx hardhat console --network localhost
$ const messaging = await ethers.getContractAt("Messaging", "DEPLOYED_CONTRACT_ADDRESS");
> undefined

$ await messaging.message();
> 'Hello, Hardhat!' # 我们的初始消息
$ await messaging.updateMessage("Hello, Ethereum!");
> ContractTransactionResponse...

$ await messaging.message();
> 'Hello, Ethereum!'

DEPLOYED_CONTRACT_ADDRESS 替换为部署期间打印的实际地址。在输出中,我们将看到更新后的消息。

调试和日志记录

在 Solidity 中使用 console.log

Hardhat 提供了一个 console.log 函数,允许我们在开发期间直接从 Solidity 代码打印消息。这对于跟踪变量值和理解合约行为非常宝贵。

要开始使用它,请在你的 Solidity 合约 的顶部,导入 Hardhat 控制台库:

import "hardhat/console.sol";

在你的函数中使用 console.log 来输出变量值或消息:

function updateMessage(string memory _newMessage) public {
    console.log("Previous message:", message);
    message = _newMessage;
    console.log("New message set:", message);
}

当使用 Hardhat 运行测试或脚本时,这会将指定的消息打印到控制台。

注意: console.log 仅在开发和测试期间可用。在部署到生产环境之前,请确保删除或注释掉这些语句

错误处理

了解常见错误以及如何解决它们。

测试智能合约

我们已经构建了一个简单的 Messaging.sol 合约。现在让我们编写一些测试来确保一切正常。

测试的位置?

Hardhat 在你的项目根目录中使用一个 test/ 文件夹。如果它还不存在,让我们创建它。

将所有测试文件放在此文件夹中。对于我们的 Messaging.sol 合约,让我们创建一个名为 test/MessagingTest.js 的文件

编写基本测试

我们将使用 MochaChai(两者都附带 Hardhat)。首先,导入工具:

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

Mocha 是一个功能丰富的 JavaScript 测试框架,在 Node.js 和浏览器中运行。它通过允许测试串行运行来简化异步测试,从而提供灵活而准确的报告。Mocha 广泛用于在部署之前测试 JavaScript 代码

Chai 是一个用于 Node.js 和浏览器的 BDD/TDD 断言库,可以与任何 JavaScript 测试框架配对。它为开发人员提供了丰富的断言集,以验证代码的正确性,支持多种断言样式,如 should、expect 和 assert。Chai 通常与 Mocha 等测试运行器结合使用,以创建完整的测试环境。

这是一个完整的 Messaging 合约的基本测试:

describe("Messaging Contract", function () {
  let messaging;

  beforeEach(async function () {
    Messaging = await ethers.getContractFactory("Messaging");
    messaging = await Messaging.deploy("Hello Hardhat");
    await messaging.waitForDeployment();
  });

  it("should return the default message", async function () {
    expect(await messaging.message()).to.equal("Hello Hardhat");
  });

  it("should update the message", async function () {
    const tx = await messaging.updateMessage("New message");
    await tx.wait();
    expect(await messaging.message()).to.equal("New message");
  });
});

在每个测试之前使用 beforeEach() 部署一个干净的合约。这确保每个测试都隔离运行。

运行测试

让我们运行带有以下命令的测试:

$ npx hardhat test

我们将看到如下输出:


  Messaging Contract
    ✔ should return the default message
Previous message: Hello Hardhat
New message set: New message
    ✔ should update the message

正如我们所看到的,我们的调试日志消息也显示在控制台中。

如果在测试之前我们需要重新编译合约,我们可以执行以下命令:

$ npx hardhat clean
$ npx hardhat compile

Hardhat 插件

插件扩展了 Hardhat 的功能,允许你无缝集成诸如 Ethers.jsWaffle 和部署管理器之类的工具。

流行的插件

Hardhat Toolbox 该插件捆绑了所有常用的软件包和 Hardhat 插件。

hardhat-ethers 用于与 ethers.js 集成的插件

Ethers.js 是一个轻量级且全面的 JavaScript 库,旨在与以太坊区块链交互。

hardhat-verify 用于验证已部署合约的代码源的插件。

hardhat-waffle plugin 此插件将 Hardhat 与 Waffle 集成。

Waffle 是一个基于 JavaScript 的库,旨在促进以太坊智能合约的测试。它与 ethers.js 无缝集成,并提供一套专门为智能合约断言量身定制的 Chai 匹配器。

安装和配置插件

安装插件:

使用 npm 或 yarn 安装所需的插件:

$ npm install - save-dev @nomiclabs/hardhat-waffle

在 hardhat.config.js 中配置:

require("@nomiclabs/hardhat-waffle");

此设置使插件的功能在你的整个 Hardhat 项目中可用。

总结

在本指南中,我们演练了使用 Hardhat 进行完整的本地开发设置,Hardhat 是在以太坊上构建和测试智能合约的最强大的工具之一。这是我们所涵盖的内容:

  • 我们介绍了 Hardhat 并解释了为什么它是 Solidity 开发人员的首选框架。
  • 我们使用 Node.js、npm 和 Hardhat 设置了环境。
  • 我们探索了默认项目结构,包括合约、测试和 ignition。
  • 我们编写并部署了一个名为 Messaging.sol 的示例 Solidity 合约。
  • 我们使用 Hardhat 的测试实用程序运行了自动化测试。
  • 我们使用 console.log 调试了合约。

你现在拥有了一个坚实的基础,可以开始在本地构建和测试你自己的智能合约。

👉 在此处查看完整的源代码:

GitHub 仓库 — Hardhat Messaging 示例

  • 原文链接: coinsbench.com/getting-s...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
CoinsBench
CoinsBench
https://coinsbench.com/