使用 ethers.js 等工具监听链上事件的能力是 Web3 开发的重要组成部分,我们将在本文中进一步探讨!具体来说,我们将说明如何使用 ethers.js 监听区块链;但是,请注意,开发人员在处理链上事件时可以使用一种更有效、更高效的方法—— Moralis 的Streams API。此外,由于 Moralis 的 Streams API,您不需要使用 ethers.js 监听区块链。即便如此,我们将研究下面的两个选项,以便您可以决定哪种替代方案最适合您的项目需求!
接下来,我们将重点介绍以太坊上的一个示例区块链地址。首先,我们将使用 ethers.js 监听区块链。然后,我们将处理相同的链上事件,但改用 Moralis Streams API。因此,您将通过实现一些简单的代码片段来了解如何使用这个出色的工具。此外,我们还将向您展示如何通过简洁的 UI 使用 ethers.js 和 Streams API 监听区块链。
最终,本文将帮助您开始有效地利用链上事件。此外,它将扩展您的区块链开发视野并让您熟悉 Moralis。因此,您将准备好开始创建各种 dapp,进而加入 Web3 革命。因此,只需创建您的免费 Moralis 帐户并跟随我们的脚步!
什么是 Ethers.js?
那么,ethers.js 是什么?正如“JS”所暗示的,ethers.js 是一个 JavaScript (JS) 库。它旨在为希望与以太坊链交互的开发人员提供完整而紧凑的解决方案。这个 JS 库还支持其他与 EVM 兼容的可编程区块链。此外,除了 JavaScript 支持外,该库还包括 TypeScript (TS) 中的实用函数。
最终,ethers.js 库旨在通过提供许多有用的功能来实现其目标。它的一项功能使您可以使用 JSON-RPC、Etherscan、MetaMask、Infura、Alchemy 或 Cloudflare 连接到以太坊节点。此外,当您想使用 ethers.js 监听区块链时,与节点的连接至关重要。
此外,该 JS 库还提供许多其他功能:
将您的私钥安全地保存在您的客户端中。
导入和导出 JSON 钱包(例如 Geth 和 Parity)。
使用元类从任何合约 ABI(包括 ABIv2 和 ethers 的人可读 ABI)创建 JavaScript 对象。
导入和导出多种语言的 BIP 39 助记词(十二字备份短语)和 HD 钱包。
使用 ENS 名称作为一等公民(它们可以在任何可以使用以太坊地址的地方使用)。
最小尺寸。
为您提供满足所有以太坊需求的完整功能。
附有大量文档。
包括大量维护的测试用例。
Ethers.js 完全支持 TypeScript – 它包括定义文件和完整的 TS 源。
附带包含所有依赖项的开源 MIT 许可证。
为什么要关注区块链?
目前,所有技术专家都同意区块链是未来。它将继续存在,并将彻底改变世界的运作方式。毕竟,无论如何,它都会成为大多数领先行业的重要组成部分。话虽如此,目前,以下四个原因仍然是开发人员应该监听链上事件的主要动机:
创建鲸鱼警报——可以设置自动触发器,当特定加密货币的大量移动时执行。
构建自动化机器人——开发人员可以使用链上事件来触发机器人(例如 Discord 机器人)并发布与实时链上变化相关的消息。
监控 NFT 收藏– 非同质化代币 (NFT) 仍然是最受欢迎的区块链用例之一。
Web3 游戏通知——Web3 游戏才刚刚起步,链上事件将在玩家所有的游戏未来中发挥重要作用。
因此,无论使用 ethers.js 或其他工具监听区块链的主要目的是什么,您的目标都是在发生特定链上事件时自动执行操作。因此,您用来监听区块链的工具必须有效且高效。理想情况下,它还应提供高级选项,例如过滤。因此,您应该确保并确定 ethers.js 是否适合您。
使用 Ethers.js 监听区块链 – 示例
下面,您可以看到示例“index.js”脚本的完整代码,该脚本使我们能够使用 ethers.js 监听区块链。我们使用顶行来确保此 NodeJS 文件使用 ethers.js。接下来,我们导入应用程序二进制接口 (ABI)。也就是说,“ getTransfer ”异步函数主要负责监听区块链。后者专注于 USDC 合约地址。在函数内部,我们使用 ethers.js 库的“ WebSocketProvider ”端点。此端点使我们能够定义将使用哪个节点提供程序。当然,我们需要获取该提供程序密钥才能实际使用它。此外,正如您在下面看到的,我们在此示例中使用了 Alchemy。我们还将 Alchemy 密钥存储在“ ALCHEMY_KEY ”变量下的“.env”文件中。
注意:如果您决定使用 Ethers.js 监听区块链,请确保选择支持您想要关注的链的节点提供商。
在“ getTransfer ”函数中,我们还定义了要使用的合约、ABI 和提供商。最后,我们设置了监听传输事件的监听器。监听器还将控制台记录传输的详细信息。后者包括“ from ”、“ to ”、“ value ”和“ eventData ”。不幸的是,ethers.js 没有解析数据的能力。
我们的示例脚本及其结果
以下是我们的示例脚本,您可以使用 ethers.js 来监听区块链:
我们使用“ node index.js ”命令运行上述脚本。然后,我们可以在终端中看到结果,如下所示:
如果你查看上面的数据,你会发现它包含了很多信息。然而,虽然上面的数据是一个很好的开始,但数据并没有被解析。因此,你需要投入相当多的时间和精力来正确处理它。幸运的是,有一个可靠的替代方案可以让你监听链上事件的任务变得简单得多。
用于监听链上事件的 Ethers.js 替代方案
在上一节中,您已经了解了 ethers.js 的实际应用。使用 ethers.js 监听区块链时,您会获得实时事件,并且它还使您能够覆盖多个链。因此,可以肯定地说,这个库是监听区块链的不错的开源解决方案。但是,ethers.js 有几个限制,这会阻碍您创建 dapp。
首先,它不能为您提供 100% 的可靠性,因为您需要提供单独的节点提供商。这些节点提供商可能仅支持您想要关注的一些链。此外,您需要确保这些节点保持活动状态。Ethers.js 也不允许您过滤事件,也不允许您使用多个地址。相反,您必须为所有合约创建单独的侦听器。此外,ethers.js 不提供侦听钱包地址的选项。最后,如上所述,使用 ethers.js 侦听区块链时收到的数据不会被解析。
话虽如此,你必须承认,如果有一个替代方案涵盖所有这些附加选项,那就太好了。毕竟,它会让监听链上事件变得更加用户友好。
幸运的是,Moralis 的 Streams API 弥补了 ethers.js 给您留下的所有空白。因此,除了跨多条链的实时事件外,Moralis 还确保了 100% 的可靠性,因为您无需担心节点提供商。此外,Moralis 还允许您过滤事件、将多个地址汇集到单个流中以及监听钱包地址。Moralis 甚至会为您解析数据。因此,您无需处理额外的数据。
使用 Moralis 的 Streams API 聆听区块链 – 示例
在本节中,我们将重点关注与上述相同的事件——以太坊上的任何 USDC 转移。但是,我们不使用 ether.js,而是使用 Moralis 的 Streams API。因此,我们创建另一个导入 Moralis 及其实用程序的“index.js”文件:
上述脚本使用相同的 ABI。此外,您可以看到 Streams API 提供的选项。首先,它允许您选择一个或多个受支持的区块链。毕竟,Moralis 专注于跨链互操作性并支持所有领先的区块链。
但是,如您所见,对于此示例,我们专注于以太坊。除了“链”选项之外,我们还需要定义描述、标签、是否要包含合约日志、ABI、主题和 webhook URL。关于后者,您可以在开发时使用 ngrok 为本地主机创建隧道。
继续执行示例脚本,我们需要启动 Moralis。这是我们需要使用 Moralis Web3 API 密钥的地方。我们通过创建一个免费的 Moralis 帐户来访问我们的管理区域来获取此密钥。从那里,我们可以分两步复制我们的 Web3 API,如下图所示:
我们将 Moralis Web3 API 密钥粘贴到“ .env”文件中的“ MORALIS_KEY ”变量旁边。然后,我们使用上述选项创建流。尽管如此,我们只需使用“ addAddress ”端点添加我们想要监听的所有地址即可。在我们的示例脚本中,我们仅关注 USDC 合约地址。但是,我们也可以添加其他地址(同时监听 USDC 和 USDT 转账):
最后,为了查看结果,我们运行“ node index.js ”命令。
探索道德流
运行上述脚本后,我们可以在 Moralis 仪表板中看到“ usdcTransfers ”流:
这也是我们可以暂停编辑流的地方。尽管如此,如上图中的“新流”按钮所示,我们也可以使用管理 UI 创建流。现在,让我们在控制台中探索流的结果:
查看上面的截图,您可以看到我们已经解析了数据。此外,除了交易哈希和“发件人”和“收件人”地址之外,我们的结果还为我们提供了转账的价值。