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

  • QuickNode
  • 发布于 2024-08-02 18:24
  • 阅读 187

本文介绍了如何使用 Hardhat 开发环境创建、编译和部署一个简单的 Hello World 智能合约到 Sepolia 测试网络。内容包括安装 Hardhat、设置配置文件、编写智能合约代码、部署合约并验证部署结果。

概述

诸如 Hardhat 之类的以太坊开发环境使得与智能合约和以太坊节点的协作变得更加容易。它们提供了一套工具,可以无缝地编写、测试和部署智能合约。在本指南中,我们将创建一个 Hello World 智能合约,并使用 Hardhat 和 QuickNode 将其部署在 Sepolia 测试网上。

先决条件

什么是 Hardhat?

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

安装 Hardhat 和其他依赖项

我们将使用 npm 安装 Hardhat,它随 node.js 一起提供。

首先,创建一个新的项目目录并导航到其中。你可以使用自己的名称:

mkdir HardhatTutorial
cd HardhatTutorial

在项目目录中打开终端/cmd 并输入以下命令。

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

现在我们已经安装了 Hardhat,让我们启动一个新的 Hardhat 项目。我们将使用 npx 来完成。Npx 帮助处理 node.js 可执行文件。

npx hardhat init

你会看到一个 CLI Hardhat 界面。选择“创建一个空的 hardhat.config.js”,然后按回车。

Hardhat 初始化

现在,让我们安装与 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

现在,让我们为我们的钱包获取一个私钥、一些测试 ETH 用于 gas 费用以及一个以太坊节点;所有这些我们都需要来部署我们的智能合约。

创建/获取私钥

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

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

你可以按照 QuickNode 指南在 JavaScriptRubyPythonGoPHP 中生成私钥和以太坊地址。

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

  • 点击浏览器上的 MetaMask 图标,一个风格化的狐狸头。如果看不到,请检查浏览器的 扩展 页面。
  • 点击 符号,然后点击 账户详情
  • 然后,点击 显示私钥 并按照说明操作。

MetaMask 私钥

复制并保存私钥;我们将在后续步骤中需要它。

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

获取测试网 ETH

我们将在 Sepolia 测试网上部署我们的合约。要开始,我们需要一些测试 ETH 在我们的 MetaMask 钱包中,我们在上一步中看到了。

导航到 QuickNode 多链水龙头 并连接你的钱包或粘贴你的钱包地址。你需要选择 以太坊 链和 Sepolia 网络,然后请求资金。

注意:你需要至少 0.001 ETH 的以太坊主网余额才能有资格使用水龙头。

QuickNode 多链水龙头

设置 QuickNode 以太坊端点

要在以太坊的 Sepolia 区块链上部署我们的合约,我们需要访问一个以太坊 Sepolia 节点。为此,我们可以使用几乎任何以太坊客户端,例如 Geth 或 OpenEthereum(前身为 Parity)。由于这对于部署单个合约来说有点复杂,我们将只需创建一个免费的 QuickNode 账户 此处 并轻松生成一个以太坊端点。在你创建了免费的以太坊 Sepolia 端点后,请妥善保存你的 HTTP Provider 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.sol Solidity 文件中:

// 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 行:创建一个名为 speak 的公共函数,它将返回存储在 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 行:启动一个名为 main 的异步函数。

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

  • 第 5-8 行:将以太坊地址和字符串打印到控制台。

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

  • 第 11 行:在 ContractFactory 上调用 deploy 以部署合约。

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

  • 第 15 行:调用已部署合约的 speak 函数。

  • 第 17 行:将 speak 函数的返回值打印到控制台。

  • 第 20 行:调用 main 函数。

  • 第 21-24 行:检查错误,如果有错误则打印并退出进程。

保存文件并运行以下命令以部署合约。

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

在合约成功部署后,你将看到一个输出,其中包含部署合约的地址和 speak 函数的返回值,saySomething 的值

部署输出

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

Etherscan 结果

结论

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

订阅我们的 新闻通讯 以获取更多关于以太坊的文章和指南。如果你有任何问题,请随时使用我们专用的 Discord 频道或使用下面的表格提供反馈。通过关注我们的 TwitterTelegram 公告频道 保持最新信息。

我们 ❤️ 反馈!

让我们知道 如果你有任何反馈或新主题的请求。我们很乐意听取你的意见。

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

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。