跳转到主要内容

面向初学者的 Hello World 智能合约

Solidity
hardhat
Alchemy
智能合同
部署
初学者
elanh
2021年3月31日
18 分钟阅读

如果你是区块链开发的初学者,还不知道如何开始,或者你只是想了解怎样部署智能合约并与之进行交互,这篇教程就是为你准备的。 我们将逐步演示如何使用虚拟钱包 MetaMask (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 部分 (opens in a new tab)中,我们将介绍如何在部署智能合约后与其进行交互;在第 3 部分 (opens in a new tab)中,我们将介绍如何在 Etherscan 上发布它。

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

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

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

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

创建 Alchemy 帐户后,你可以通过创建应用程序来生成应用程序接口密钥。 这将使我们能够向 Sepolia 测试网络发出请求。 如果你不熟悉测试网,请查看此页面

  1. 在 Alchemy 仪表板中,通过在导航栏中选择“Select an app”,然后点击“Create new app”,导航到“Create new app”页面。

Hello world 创建应用程序

  1. 将你的应用程序命名为“Hello World”,提供简短描述,并选择一个用例,例如“Infra & Tooling”。 接下来,搜索“Ethereum”并选择网络。

创建应用程序视图 hello world

  1. 点击“Next”继续,然后点击“Create app”,就完成了! 你的应用程序应出现在导航栏下拉菜单中,并提供可供复制的 API 密钥。

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

我们需要一个以太坊帐户来发送和接收交易。 在本教程中,我们将使用 MetaMask,它是浏览器中的虚拟钱包,用来管理你的以太坊帐户地址。 更多关于交易的信息。

你可以在此处 (opens in a new tab)免费下载 MetaMask 并创建以太坊帐户。 创建帐户时,或者如果你已有帐户,请确保使用网络下拉菜单切换到“Sepolia”测试网(这样我们就不会处理真实货币)。

如果你没有看到 Sepolia 列出,请进入菜单,然后进入 Advanced,向下滚动以打开“Show test networks”。 在网络选择菜单中,选择“Custom”选项卡,找到测试网列表并选择“Sepolia”。

metamask sepolia 示例

第 4 步:从水龙头获取以太币

为了将我们的智能合约部署到测试网,我们需要一些假的 Eth。 要获取 Sepolia ETH,你可以访问 Sepolia 网络详情页面查看各种水龙头列表。 如果一个不能用,就试试另一个,因为它们有时会枯竭。 由于网络拥堵,收到你的假 ETH 可能需要一些时间。 之后不久,你应该就能在你的 Metamask 帐户中看到 ETH 了!

第 5 步:检查你的余额

为了再次检查我们的余额,让我们使用 Alchemy 的编辑器工具 (opens in a new tab) 发出 eth_getBalance 请求。 这将返回我们钱包中的以太币数量。 输入你的 MetaMask 帐户地址并点击“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,请遵循这些说明 (opens in a new tab)(我们还需要 Node.js,所以也请下载它!)。

npm init

如何回答安装问题并不重要,下面是我们的做法,仅供参考:

批准 package.json,我们就可以继续了!

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

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

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

npm install --save-dev hardhat

请查看此页面,详细了解安装说明 (opens in a new tab)

第 8 步:创建 Hardhat 项目

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

npx hardhat

然后应该能看到一条欢迎消息和选项,用于选择你想要做的事情。 选择“创建一个空的 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 步:将 MetaMask 和 Alchemy 连接到你的项目

我们已经创建了 MetaMask 钱包、Alchemy 帐户并编写了智能合约,现在是时候将这三者连接起来了。

从虚拟钱包发送的每笔交易都需要使用你独有的私钥签名。 为了给程序提供此项许可,我们可以安全地将私钥(和 Alchemy 应用程序接口密钥)存储在一个环境文件中。

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

首先,在项目目录中安装 dotenv 软件包:

npm install dotenv --save

然后,在项目根目录中创建一个 .env 文件,并将你的 MetaMask 私钥和 HTTP Alchemy API URL 添加进去。

获取 alchemy api 密钥

复制 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

你会看到类似以下所示的信息:

合约已部署到地址:0x6cd7d44516a20882cEa2DE9f205bF401c0d23570

如果我们访问 Sepolia etherscan (opens in a new tab) 并搜索我们的合约地址,我们应该能看到它已成功部署。 交易将类似以下:

etherscan 合约

From 地址应与你的 MetaMask 帐户地址匹配,而 To 地址将显示“Contract Creation”,但如果我们点击进入交易,我们将在 To 字段中看到我们的合约地址:

etherscan 交易

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

要了解其内部工作原理,我们导航至 Alchemy 仪表板 (opens in a new tab)中的“浏览器”选项卡。 如果你有多个 Alchemy 应用程序,请确保按应用程序筛选并选择“Hello World”。 hello world 浏览器

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

本教程的第 1 部分到此结束,在第 2 部分中,我们将通过更新初始消息来实际与我们的智能合约进行交互 (opens in a new tab);在第 3 部分中,我们将把我们的智能合约发布到 Etherscan (opens in a new tab),这样每个人都知道如何与它交互。

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

页面最后更新: 2026年3月3日

这篇教程对您有帮助吗?