与智能合约交互
作者:Alchemy Team
在开始本教程之前,你应该已经完成了第一部分——Hello World 智能合约(创建并部署一个智能合约)。在第三部分中,我们会介绍如何将合约提交到 Etherscan,这样任何人都能了解如何与它交互!
第二部分:与你的智能合约交互
既然我们已经成功将智能合约部署到了 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 深度解析中了解更多关于合约 ABI 的内容。Hardhat(以及 Truffle)会自动为我们生成 ABI,并保存在 HelloWorld.json 文件中。
为了使用它,我们需要在 contract-interact.js 文件中添加以下代码来解析出其中的内容:
如果你想看看 ABI 的内容,可以把它打印到控制台:
要运行 interact.js 并在控制台看到打印出的 ABI,请到终端中运行
Hardhat:
Truffle:
步骤 4:创建合约实例
为了与合约交互,我们需要在代码中创建它的一个实例。使用 Ethers.js 来做这件事时,我们需要用到三个概念:
- Provider——这是一个节点 provider,为你提供对区块链的读写访问权限。
- Signer——代表一个有能力对交易进行签名的 Ethereum 账户。
- Contract——这是一个 Ethers.js 对象,代表链上部署的某个具体合约。
我们会使用上一步中的合约 ABI 来创建合约实例:
你可以在 Alchemy 的 Ethers.js 讲解文档中阅读更多关于 Providers、Signers 和 Contracts 的内容。
步骤 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!🎉
完成本教程后,欢迎在 Twitter 上 @Alchemy,告诉我们你的体验如何,或者提出任何反馈意见!
Alchemy 新闻通讯
第一时间获取发布信息
订阅我们的新闻通讯
获取 Alchemy 的最新产品更新和资源
填写您的电子邮箱地址即表示您同意接收我们的营销通讯和产品更新。您确认 Alchemy 按照我们的隐私声明处理我们收到的信息。您可以随时取消订阅。


