本文介绍了Hardhat这一以太坊开发环境的关键组件、环境搭建步骤、项目结构、智能合约的编写编译部署流程、调试方法、测试方法以及插件的使用。通过本文,读者可以了解如何使用Hardhat进行原生以太坊智能合约的开发和测试。
Hardhat 是一个全面的以太坊软件开发环境。它可以帮助我们高效地构建、测试和部署智能合约和去中心化应用程序(dApps)。让我们来探索它的关键组件:
关键组件:
Hardhat Runner: 这是我们使用的主要接口。它允许我们自动化诸如编译合约、运行测试和部署到网络等任务。我们还可以使用插件扩展它,以适应我们的工作流程。(hardhat.org)
Hardhat Network: 这个内置的原生以太坊网络允许我们在我们的机器上直接部署合约、运行测试和调试代码。它提供快速反馈,并支持 Solidity console.log()
以简化调试。
Hardhat Ignition: 这是一个声明式部署系统,使我们能够在不导航部署过程的机制的情况下部署我们的智能合约。
要使用 Hardhat 开发以太坊应用程序,我们需要安装 Node.js 和 npm。Node.js 是一个 JavaScript 运行时,它允许我们在浏览器之外运行 JavaScript 代码。npm (Node Package Manager) 帮助我们管理项目依赖。
让我们逐步介绍不同操作系统的安装步骤。
🪟 Windows
.msi
安装程序。按照提示操作,接受许可协议,然后继续使用默认设置。确保选中安装 npm 的选项。$ node -v
v22.11.0
$ npm -v
10.9.0
这些命令应显示已安装的 Node.js 和 npm 的版本。
🍏 macOS
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install node
$ node -v
v22.11.0
$ npm -v
10.9.0
🐧 Linux (Ubuntu/Debian)
sudo apt update
$ sudo apt install nodejs
$ sudo apt install npm
$ node -v
v22.11.0
$ npm -v
10.9.0
$ 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 此文件夹包含我们的测试脚本。使用诸如 Mocha 和 Chai 之类的框架,我们编写测试以确保我们的合约按预期运行。例如,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
的新文件。
打开 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
此命令编译你的合约并生成必要的构件。
在你的终端中,运行:
$ 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
替换为部署期间打印的实际地址。在输出中,我们将看到更新后的消息。
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 的文件
我们将使用 Mocha 和 Chai(两者都附带 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 的功能,允许你无缝集成诸如 Ethers.js、Waffle 和部署管理器之类的工具。
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 是在以太坊上构建和测试智能合约的最强大的工具之一。这是我们所涵盖的内容:
你现在拥有了一个坚实的基础,可以开始在本地构建和测试你自己的智能合约。
👉 在此处查看完整的源代码:
GitHub 仓库 — Hardhat Messaging 示例
- 原文链接: coinsbench.com/getting-s...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!