---
title: "与智能合约交互"
description: "分步指南：通过更新智能合约变量与已部署的 Ethereum 智能合约交互。"
---

# 与智能合约交互

在开始本教程之前，你应该已经完成了第一部分——[Hello World 智能合约](https://www.alchemy.com/docs/how-to-deploy-a-smart-contract-to-the-sepolia-testnet)（创建并部署一个智能合约）。在第三部分中，我们会介绍如何[将合约提交到 Etherscan](https://www.alchemy.com/docs/best-practices-for-deploying-a-smart-contract-on-evm-mainnets-1)，这样任何人都能了解如何与它交互！

<ExternalVideo
  url="https://www.youtube.com/watch?v=sQJ-XQBzEuc&embeds_referring_euri=https%3A%2F%2Fcdn.iframe.ly%2F&source_ve_path=OTY3MTQ&feature=emb_imp_woyt&ab_channel=Alchemy"
  provider="youtube"
  providerUid="sQJ-XQBzEuc"
/>

## 第二部分：与你的智能合约交互

既然我们已经成功将智能合约部署到了 ropsten 网络，接下来让我们测试一下 web3 技能，与它交互吧！

### 步骤 1：创建 interact.js 文件

这是我们编写交互脚本的文件。我们将使用你在第一部分中安装过的 Ethers.js 库。

在 hardhat 教程中的 `scripts/` 文件夹内（如果是 Truffle 教程，则在你的主目录中），创建一个名为 `interacts.js` 的新文件，添加以下代码：

### 步骤 2：更新你的 .env 文件

我们将使用一些新的环境变量，因此需要在 `.env` 文件中定义它们，并确保 `dotenv` 模块正在加载这些变量。

我们需要添加 Alchemy `API\_KEY` 的定义，以及你部署智能合约所在的 `CONTRACT\_ADDRESS`。

你的 `.env` 文件应该看起来像这样：

### 步骤 3：获取你的合约 ABI

我们的合约 ABI（应用二进制接口）是与智能合约交互的接口。你可以在我们的 [eth_getLogs 深度解析](https://www.alchemy.com/docs/deep-dive-into-eth_getlogs)中了解更多关于合约 ABI 的内容。Hardhat（以及 Truffle）会自动为我们生成 ABI，并保存在 HelloWorld.json 文件中。

为了使用它，我们需要在 `contract-interact.js` 文件中添加以下代码来解析出其中的内容：

如果你想看看 ABI 的内容，可以把它打印到控制台：

要运行 `interact.js` 并在控制台看到打印出的 ABI，请到终端中运行

#### Hardhat：

#### Truffle：

### 步骤 4：创建合约实例

为了与合约交互，我们需要在代码中创建它的一个实例。使用 Ethers.js 来做这件事时，我们需要用到三个概念：

1. Provider——这是一个节点 provider，为你提供对区块链的读写访问权限。
1. Signer——代表一个有能力对交易进行签名的 Ethereum 账户。
1. Contract——这是一个 Ethers.js 对象，代表链上部署的某个具体合约。

我们会使用上一步中的合约 ABI 来创建合约实例：

你可以在 Alchemy 的 Ethers.js 讲解文档中阅读更多关于 [Providers](https://www.alchemy.com/docs)、[Signers](https://www.alchemy.com/docs) 和 [Contracts](https://www.alchemy.com/docs) 的内容。

### 步骤 5：读取初始消息

还记得我们用 `theinitMessage = "Hello world!"` 部署合约时的情形吗？现在我们要读取存储在智能合约中的那条消息，并把它打印到控制台。

在 JavaScript 中，我们使用异步函数与网络交互。

使用下面的代码调用智能合约中的`message`函数，读取初始消息：

在终端中使用 `npx hardhat run scripts/interact.js` 运行该文件后，我们应该会看到如下响应：

恭喜！你刚刚成功从 Ethereum 区块链上读取了智能合约数据，干得漂亮！

### 步骤 6：更新消息

现在，除了读取消息，我们还可以使用 `update` 函数来更新保存在智能合约中的消息！是不是很酷？

为此，我们可以直接在已实例化的 Contract 对象上调用 `update` 函数，像这样：

注意，我们对返回的交易对象调用了 `.wait\(\)`。这能确保我们的脚本在继续往下执行之前，等待该交易在区块链上被挖出。如果省略这一行，你的脚本可能无法看到合约中更新后的 `message` 值。

### 步骤 7：读取新消息

你应该可以重复步骤 5 来读取更新后的 `message` 值。不妨花点时间，看看自己能否做出必要的修改来打印出这个新值！

如果需要提示，这时你的 `interact.js` 文件应该是这样的：

现在只需运行脚本，你应该就能在终端看到旧消息、更新状态以及新消息被依次打印出来！

`npx hardhat run scripts/interact.js --network ropsten`

在运行这个脚本的过程中，你可能会注意到 `Updating the message... `步骤要过一会儿才能加载出来，之后新消息才会被设置。这是因为挖矿过程需要时间！如果你想了解在交易被挖出的过程中如何跟踪它，可以访问 Alchemy 的 mempool，查看你的交易状态（是待处理、已被挖出，还是被网络丢弃）。如果你的交易被丢弃了，去 Ropsten Etherscan 搜索你的交易哈希也会有所帮助。

到这里就完成了！你现在已经部署并且与一个 Ethereum 智能合约进行了交互。如果你想把合约发布到 Etherscan，好让任何人都知道如何与它交互，请查看第三部分：[将你的智能合约提交到 etherscan](https://www.alchemy.com/docs/best-practices-for-deploying-a-smart-contract-on-evm-mainnets-1)！🎉

完成本教程后，欢迎在 Twitter 上 @Alchemy，告诉我们你的体验如何，或者提出任何反馈意见！
