跳转到主要内容

适合初学者的 Hello World 智能合约

Solidity
Hardhat
Alchemy
智能合约
部署
初级
elanh
2021年3月31日
19 分钟阅读

如果你是区块链开发的新手并且不知道从何开始,或者你只是想了解如何部署智能合约并与之交互,那么本指南就是为你准备的。我们将逐步介绍如何使用虚拟钱包 梅塔马斯克 (opens in a new tab)Solidity (opens in a new tab)Hardhat (opens in a new tab)Alchemy (opens in a new tab) 在 Sepolia 测试网络上创建和部署一个简单的智能合约(如果你还不懂这些术语的意思,别担心,我们会进行解释)。

在本教程的第 2 部分中,我们将介绍在智能合约部署后如何与之交互,在第 3 部分中,我们将介绍如何将其发布到 Etherscan 上。

如果你在任何时候有疑问,请随时在 Alchemy Discord (opens in a new tab) 中提问!

第 1 步:连接到以太坊网络

向以太坊链发出请求的方法有很多。为了简单起见,我们将在 Alchemy 上使用一个免费账户。Alchemy 是一个区块链开发者平台和 API,允许我们与以太坊链进行通信,而无需运行我们自己的节点。该平台还具有用于监控和分析的开发者工具,我们将在本教程中利用这些工具来了解智能合约部署的内部运作原理。如果你还没有 Alchemy 账户,可以在这里免费注册 (opens in a new tab)

第 2 步:创建你的应用(和 API 密钥)

创建 Alchemy 账户后,你可以通过创建应用来生成 API 密钥。这将允许我们向 Sepolia 测试网络发出请求。如果你不熟悉测试网,请查看此页面

  1. 在导航栏中选择“Select an app”(选择应用),然后点击“Create new app”(创建新应用),导航到 Alchemy 仪表板中的“Create new app”页面。

Hello world create app

  1. 将你的应用命名为“Hello World”,提供简短描述,并选择一个用例,例如“Infra & Tooling”(基础设施和工具)。接下来,搜索“Ethereum”并选择该网络。

create app view hello world

  1. 点击“Next”(下一步)继续,然后点击“Create app”(创建应用),就这么简单!你的应用应该会出现在导航栏下拉菜单中,并提供可复制的 API 密钥。

第 3 步:创建以太坊账户(地址)

我们需要一个以太坊账户来发送和接收交易。在本教程中,我们将使用梅塔马斯克,这是一款浏览器中的虚拟钱包,用于管理你的以太坊账户地址。了解更多关于交易的信息。

你可以在这里 (opens in a new tab)免费下载梅塔马斯克并创建以太坊账户。在创建账户时,或者如果你已经有账户,请确保使用网络下拉菜单切换到“Sepolia”测试网络(这样我们就不会使用真金白银进行操作)。

如果你没有看到 Sepolia 选项,请进入菜单,然后选择“Advanced”(高级),向下滚动并开启“Show test networks”(显示测试网络)。在网络选择菜单中,选择“Custom”(自定义)选项卡以查找测试网列表,然后选择“Sepolia”。

metamask sepolia example

第 4 步:从水龙头添加以太币

为了将我们的智能合约部署到测试网络,我们需要一些测试用的 ETH。要获取 Sepolia ETH,你可以前往 Sepolia 网络详情查看各种水龙头的列表。如果一个不起作用,请尝试另一个,因为它们有时会枯竭。由于网络拥堵,接收测试用 ETH 可能需要一些时间。不久之后,你应该就能在你的梅塔马斯克账户中看到 ETH 了!

第 5 步:检查你的余额

为了再次确认我们的余额已到账,让我们使用 Alchemy 的 composer 工具 (opens in a new tab)发出一个 eth_getBalance 请求。这将返回我们钱包中的 ETH 数量。输入你的梅塔马斯克账户地址并点击“Send Request”(发送请求)后,你应该会看到类似如下的响应:

{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }

注意: 此结果的单位是 Wei 而不是 ETH。Wei 被用作以太币的最小面额。Wei 到 ETH 的换算关系为:1 ETH = 1018 Wei。因此,如果我们将 0x2B5E3AF16B1880000 转换为十进制,我们会得到 5*10¹⁸,即等于 5 ETH。

呼!我们的测试资金都在那里了

第 6 步:初始化我们的项目

首先,我们需要为我们的项目创建一个文件夹。导航到你的命令行并输入:

mkdir hello-world
cd hello-world

现在我们已经进入了项目文件夹,我们将使用 npm init 来初始化项目。如果你还没有安装 npm,请按照 Node.js 安装说明 (opens in a new tab)进行操作(本教程需要用到 Node.js 和 npm)。

npm init

你如何回答安装问题并不重要,以下是我们的操作方式,仅供参考:

批准 package.json,我们就可以开始了!

第 7 步:下载 Hardhat (opens in a new tab)

Hardhat 是一个用于编译、部署、测试和调试以太坊软件的开发环境。它可以帮助开发者在部署到实时链之前,在本地构建智能合约和去中心化应用 (dapp)。

在我们的 hello-world 项目中运行:

npm install --save-dev hardhat

查看此页面以获取有关安装说明 (opens in a new tab)的更多详细信息。

第 8 步:创建 Hardhat 项目

在我们的项目文件夹中运行:

npx hardhat

然后你应该会看到一条欢迎消息以及选择你要执行的操作的选项。选择“create an empty hardhat.config.js”:

这将为我们生成一个 hardhat.config.js 文件,我们将在其中指定项目的所有设置(在第 13 步中)。

第 9 步:添加项目文件夹

为了保持项目井然有序,我们将创建两个新文件夹。在命令行中导航到项目的根目录并输入:

mkdir contracts
mkdir scripts
  • contracts/ 是我们存放 hello world 智能合约代码文件的地方
  • scripts/ 是我们存放用于部署和与合约交互的脚本的地方

第 10 步:编写我们的合约

你可能会问自己,我们到底什么时候才开始写代码??好吧,我们这就开始,在第 10 步。

在你最喜欢的编辑器中打开 hello-world 项目(我们喜欢 VSCode (opens in a new tab))。智能合约是用一种叫做 Solidity 的语言编写的,我们将使用它来编写我们的 HelloWorld.sol 智能合约。‌

  1. 导航到“contracts”文件夹并创建一个名为 HelloWorld.sol 的新文件。
  2. 以下是以太坊基金会提供的一个 Hello World 智能合约示例,我们将在本教程中使用它。将以下内容复制并粘贴到你的 HelloWorld.sol 文件中,并务必阅读注释以了解此合约的作用:

这是一个超级简单的智能合约,它在创建时存储一条消息,并且可以通过调用 update 函数进行更新。

第 11 步:将梅塔马斯克和 Alchemy 连接到你的项目

我们已经创建了梅塔马斯克钱包、Alchemy 账户,并编写了我们的智能合约,现在是时候将这三者连接起来了。

从你的虚拟钱包发送的每笔交易都需要使用你唯一的私钥进行签名。为了向我们的程序提供此权限,我们可以安全地将我们的私钥(以及 Alchemy API 密钥)存储在环境文件中。

要了解有关发送交易的更多信息,请查看这篇关于使用 Web3 发送交易的教程

首先,在你的项目目录中安装 dotenv 包:

npm install dotenv --save

然后,在我们的项目根目录中创建一个 .env 文件,并将你的梅塔马斯克私钥和 HTTP Alchemy API URL 添加到其中。

get alchemy api key

复制 Alchemy API URL

你的 .env 应该如下所示:

API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY = "your-metamask-private-key"

为了将这些实际连接到我们的代码中,我们将在第 13 步的 hardhat.config.js 文件中引用这些变量。

不要提交 .env 文件!请确保永远不要与任何人共享或暴露你的 .env 文件,因为这样做会泄露你的机密信息。如果你正在使用版本控制,请将你的 .env 添加到 gitignore 文件中。

第 12 步:安装 Ethers.js

Ethers.js 是一个库,它通过将标准 JSON-RPC 方法包装成更用户友好的方法,使得与以太坊交互和发出请求变得更加容易。

Hardhat 使得集成插件 (opens in a new tab)以获得额外的工具和扩展功能变得超级简单。我们将利用 Ethers 插件 (opens in a new tab)进行合约部署(Ethers.js (opens in a new tab) 提供了一些非常简洁的合约部署方法)。

在你的项目目录中输入:

npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"

在下一步中,我们还需要在 hardhat.config.js 中引入 ethers。

第 13 步:更新 hardhat.config.js

到目前为止,我们已经添加了几个依赖项和插件,现在我们需要更新 hardhat.config.js,以便我们的项目能够识别它们。

将你的 hardhat.config.js 更新为如下所示:

第 14 步:编译我们的合约

为了确保到目前为止一切正常,让我们编译我们的合约。compile 任务是内置的 Hardhat 任务之一。

在命令行中运行:

npx hardhat compile

你可能会收到关于 SPDX license identifier not provided in source file 的警告,但无需担心——希望其他一切看起来都不错!如果遇到问题,你随时可以在 Alchemy Discord (opens in a new tab) 中留言。

第 15 步:编写我们的部署脚本

现在我们的合约已经写好,配置文件也准备就绪,是时候编写我们的合约部署脚本了。

导航到 scripts/ 文件夹并创建一个名为 deploy.js 的新文件,向其中添加以下内容:

Hardhat 在他们的合约教程 (opens in a new tab)中非常出色地解释了这些代码行的作用,我们在这里采用了他们的解释。

const HelloWorld = await ethers.getContractFactory("HelloWorld");

Ethers.js 中的 ContractFactory 是用于部署新智能合约的抽象,因此这里的 HelloWorld 是我们 hello world 合约实例的工厂。使用 hardhat-ethers 插件时,ContractFactoryContract 实例默认连接到第一个签名者。

const hello_world = await HelloWorld.deploy();

ContractFactory 上调用 deploy() 将开始部署,并返回一个解析为 ContractPromise。这个对象包含了我们智能合约中每个函数对应的方法。

第 16 步:部署我们的合约

我们终于准备好部署我们的智能合约了!导航到命令行并运行:

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

然后你应该会看到类似如下的内容:

Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570

如果我们前往 Sepolia Etherscan (opens in a new tab) 并搜索我们的合约地址,我们应该能够看到它已成功部署。该交易将如下所示:

etherscan contract

From 地址应与你的梅塔马斯克账户地址匹配,而 To(接收方)地址将显示“Contract Creation”(合约创建),但如果我们点击进入该交易,我们将在 To 字段中看到我们的合约地址:

etherscan transaction

恭喜!你刚刚向以太坊链部署了一个智能合约 🎉

为了了解其内部运作原理,让我们导航到 Alchemy 仪表板 (opens in a new tab)中的 Explorer(浏览器)选项卡。如果你有多个 Alchemy 应用,请确保按应用进行过滤并选择“Hello World”。 hello world explorer

在这里,你将看到当我们调用 .deploy() 函数时,Hardhat/Ethers 在后台为我们发出的一些 JSON-RPC 调用。这里需要指出的两个重要调用是 eth_sendRawTransaction (opens in a new tab)(这是将我们的合约实际写入 Sepolia 链的请求)和 eth_getTransactionByHash (opens in a new tab)(这是在给定哈希的情况下读取有关我们交易信息的请求,这是发送交易时的典型模式)。要了解有关发送交易的更多信息,请查看这篇关于使用 Web3 发送交易的教程。

本教程的第 1 部分到此结束,在第 2 部分中,我们将通过更新初始消息来实际与我们的智能合约进行交互,在第 3 部分中,我们将将我们的智能合约发布到 Etherscan,以便每个人都知道如何与之交互。

想了解更多关于 Alchemy 的信息吗?请访问我们的网站 (opens in a new tab)。不想错过任何更新?在这里 (opens in a new tab)订阅我们的时事通讯!也请务必加入我们的 Discord (opens in a new tab)