跳转至主要内容

如何使用 Hardhat 创建和部署智能合约

更新于
2025年11月26日

阅读时间 6 分钟

概述

Hardhat这样的以太坊开发环境,让开发智能合约和以太坊节点变得更加轻松。它们提供了一套工具,可无缝地编写、测试和部署智能合约。在本指南中,我们将使用 Hardhat 和 Quicknode 创建一个“Hello World”智能合约,并将其部署到 Sepolia 测试网。

先决条件


  • 一个 Quicknode 账户(点击此处免费注册)
  • 一款兼容EVM的钱包(例如MetaMask
  • 已安装Node.js
  • 已安装Hardhat(本指南中也将对此进行说明)
  • 命令行界面/终端窗口
  • 代码或文本编辑器(例如 VSCode)
  • Sepolia 测试网上的 ETH(您可以使用Quicknode 多链水龙头免费领取一些)

什么是Hardhat?

Hardhat是一个开发环境,可帮助开发者编译、部署、测试和调试其以太坊应用程序。它拥有一些最为清晰、详尽的文档。Hardhat 还提供了类似于 JavaScript 的 console.log() 功能,用于调试。此外,Hardhat 还拥有众多插件,进一步扩展了其功能。

安装 Hardhat 及其他依赖项

我们将使用npm 安装 Hardhat,npm 是node.js 自带的。 

首先,创建一个新的项目目录并进入该目录。此处您可以随意使用自己的名称代替:

mkdir HardhatTutorial
cd HardhatTutorial

在项目目录下打开终端/命令提示符,并输入以下命令。

npm init --y
npm install --save-dev hardhat

既然已经安装了 Hardhat,我们就来创建一个新的 Hardhat 项目吧。我们将使用 npx 来完成这一操作。npx 用于处理 Node.js 可执行文件。 

npx hardhat init

此时将显示 CLI Hardhat 界面。选择“创建一个空的 hardhat.config.js 文件”,然后按回车键。

安全帽初始化

现在,让我们安装使用 Hardhat 所需的其他依赖项。

npm install --save-dev @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai

我们需要这些依赖项来编写合同的自动化测试。

使用 npm 安装包时最常见的问题可能是 `node-gyp` 出现的内部错误。您可以按照此处的 node-gyp 安装说明进行操作。

注意:如果您遇到 node-gyp 相关问题,请确保您的 Python 版本与上述说明中列出的兼容版本之一一致。 

另一个常见问题是缓存过期。只需在终端中输入以下命令,即可清除 npm 缓存:

npm cache clean

现在,让我们为钱包生成一个私钥,准备一些用于支付 gas 费的测试以太币,并部署一个以太坊节点;这些都是部署智能合约所必需的。

生成/检索私钥

我们需要一个以太坊钱包,以便支付智能合约的部署费用。

创建钱包并获取其私钥后,我们将在下一节中将其添加到 Hardhat 配置文件(例如 hardhat.config.js)中。

您可以按照 Quicknode 的指南,使用JavaScriptRubyPythonGoPHP 生成私钥和以太坊地址。

要从您的MetaMask钱包中获取私钥,请按照以下说明操作:


  • 点击浏览器上的 MetaMask 图标(一个风格化的狐狸头)。如果看不到该图标,请检查浏览器的“扩展程序”页面。
  • 点击图标,然后选择“账户详情”。
  • 然后,点击“显示私钥”,并按照提示操作。

MetaMask 私钥

复制并保存私钥;后续步骤中我们会用到它。

建议将私钥等敏感信息存储在.env文件中,并通过环境变量将其导入配置文件,或者专门为开发目的创建一个新的辅助 MetaMask 钱包。

获取测试网以太币

我们将把合约部署到 Sepolia 测试网。首先,我们需要在MetaMask钱包中准备一些测试用 ETH,这一点我们在上一步中已经提到过。

访问Quicknode 多链水龙头,连接您的钱包或粘贴钱包地址。您需要选择以太坊链和Sepolia网络,然后申请资金。

注意:您需要在以太坊主网账户中至少持有 0.001 ETH,才有资格使用该水龙头。

Quicknode 多链水龙头

配置 Quicknode 以太坊端点

要在以太坊的Sepolia区块链上部署我们的合约,我们需要访问一个以太坊Sepolia节点。为此,我们可以使用几乎任何以太坊客户端,例如Geth或OpenEthereum(原名Parity)。由于仅为部署一个合约而进行这些操作稍显繁琐,我们只需在此处创建一个免费的Quicknode账户,即可轻松生成一个以太坊端点。 创建免费的以太坊 Sepolia 端点后,请将 HTTP 提供商 URL 保存好,因为在下一节中会用到它。

Quicknode Sepolia 端点的屏幕截图

配置文件的设置

打开hardhat.config.js文件,并将以下内容粘贴进去:

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

const endpointUrl = "ADD_YOUR_QUICKNODE_URL_HERE";
const privateKey = "ADD_YOUR_PRIVATE_KEY_HERE";

module.exports = {
solidity: "0.8.21",
networks: {
sepolia: {
url: endpointUrl,
accounts: [privateKey],
},
},
};

ADD_YOUR_PRIVATE_KEY_HERE替换为上一步中获取的私钥,将ADD_YOUR_QUICKNODE_URL_HERE替换为上一步中获取的 HTTP 节点 URL,然后保存文件。

上述代码的说明:

  • 第 1 行:导入 hardhat-waffle 软件包。

  • 第 3-4 行:定义端点 URL 和私钥。

  • 第 6-14 行:提及 Solidity 版本并定义sepolia 网络。

创建合同

现在,针对我们的合约,创建一个名为 contracts的新目录,并在其中放入一个名为 HelloWorld.sol的新文件。

mkdir contracts && echo > contracts/HelloWorld.sol

将以下代码复制并粘贴到你的HelloWorld.solSolidity 文件中:

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

contract HelloWorld {

string saySomething;

constructor() {
saySomething = "Hello World!";
}

function speak() public view returns(string memory) {
return saySomething;
}
}

上述代码的说明:


  • 第 1 行:指定SPDX 许可类型,这是 Solidity ^0.6.8 之后的新增内容。 

每当智能合约的源代码向公众公开时,这些许可协议都有助于解决或避免版权问题。如果您不想指定任何许可类型,可以使用特殊许可“UNLICENSED”,或者直接跳过整个注释(这不会导致错误,只会触发警告)。

  • 第 2 行:声明 Solidity 版本。

  • 第4行:开始我们的名为 HelloWorld.

  • 第 6 行:创建变量 saySomething 类型为字符串。

  • 第 8-10 行:调用构造函数,并将字符串“Hello World!”存储在 saySomething 变量。

  • 第 12-14 行:创建一个名为 说话 类型为 public,它将返回存储在 saySomething 变量。

保存文件,并使用以下 Hardhat 命令编译合约。

npx hardhat compile

如果你的合约编译成功,输出结果将如下所示:

编译输出

部署“Hello World”智能合约

现在要部署我们的合约,让我们在名为scripts 的新目录中创建一个deploy.js文件。

mkdir scripts && echo > scripts/deploy.js

将以下内容复制并粘贴到你的 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 contract = await HelloWorld.deploy();

console.log("Contract deployed at:", contract.address);

const saySomething = await contract.speak();

console.log("saySomething value:", saySomething);
}

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

上述代码的说明。

  • 第 1 行:调用名为 主页.

  • 第3行:获取用于签署交易的以太坊地址,并将其存储在部署者地址中。 

  • 第 5-8 行:将以太坊地址与一个字符串一起输出到控制台。

  • 第 10 行:调用 ethers.js 方法 ContractFactory. 这将查找 HelloWorld.sol 文件,并返回一个我们可以使用的实例 ContractFactory 启用方法。

  • 第 11 行:调用 deploy 方法 ContractFactory 部署该合约。 

  • 第 13 行:将已部署合约的地址打印到控制台。

  • 第 15 行:调用函数 说话 已部署合同的。

  • 第 17 行:打印函数的返回值 说话 发送到控制台。

  • 第 20 行:调用函数 主页.

  • 第 21-24 行:检查是否存在错误,如有错误则输出错误信息,并退出进程。

保存文件,然后运行以下命令来部署合约。

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

合约部署成功后,您将看到一条输出信息,其中包含已部署合约的地址以及 speak 函数的返回值——即saySomething 的值

部署输出

我们可以通过将已部署合约的地址复制并粘贴到Sepolia Etherscan 的搜索栏中来验证部署情况。这样就会显示有关已部署合约的信息。

Etherscan 查询结果

结论

就是这样!现在你已经掌握了使用 Hardhat 创建、编译和部署智能合约的基础知识。但这还不是全部——Hardhat 还提供了用于测试和调试代码的工具。如需更深入地了解,请查阅Hardhat 的官方文档

订阅我们的新闻通讯,获取更多关于以太坊的文章和指南。如有任何疑问,欢迎通过Discord上的专属频道联系我们,或使用下方的表单提供反馈。关注我们的Twitter账号和Telegram 公告频道,随时掌握最新动态。

我们 ❤️ 您的反馈!

如果您有任何反馈或对新主题的建议,请告诉我们。我们非常期待您的来信。

分享本指南