什么是智能合约事件?
当基于其代码的事件发生时,所有 Web3 合约都会发出所谓的“智能合约事件”。简而言之,这些事件是智能合约发出的一种信号,用于通知开发人员和软件系统发生了一些有意义的事情。此外,应用程序和其他平台使用这些信号进行通信。
让我们以 ERC-20 代币标准为例来进一步阐明这一点。所有实施此标准的智能合约都会在有人交易代币时自动发出“转移”事件。此外,除了通知之外,这些事件通常还包含有关交易的更多详细信息。
您可能已经得出结论,在构建 Web3 项目时,能够实时监听此类事件至关重要。话虽如此,您需要一个无缝的工作流程来设置区块链监听器,当链上发生相关事件时,它可以向您和您的项目发出警报,这就是 ethers.js 发挥作用的地方!
探索 Ethers.js
Ethers.js 是一个区块链 JavaScript (JS) 库,于 2016 年推出。它是迄今为止最受欢迎的开源以太坊 JS 库之一,下载量达数百万次。与传统编程库一样,ethers.js 是一组预先编写的代码片段,开发人员可以使用和重复使用这些代码片段来执行常见功能。然而,与传统库相比,ethers.js 是基于 Web3 的。因此,开发人员可以使用此库更无缝地与以太坊网络进行通信和交互。
Ethers.js 具有四个核心模块:“ ethers.contract ”、“ ethers.utils ”、“ ethers.wallets ”和“ ethers.provider ”。这四个模块是该库应用程序编程接口 (API) 的核心。但是,有关它们和该库的更多详细信息,请查看我们的文章,其中回答了“什么是 ethers.js? ”这个问题。
现在,通过对 ethers.js 复杂之处的简要概述,让我们在下面的小节中探索该库的一些最突出的优势!
Ethers.js 的好处
为了更好地理解 ethers.js 的实用性以及为什么您可能想要使用该库,让我们来探讨一下它的一些最突出的优点:
安全性——使用 ethers.js 时,您可以保证私钥的安全。
大小——Ethers.js 是一个小型库,压缩后仅有 88 KB,解压后仅有 284 KB。
MIT 许可证– Ethers.js 是完全开源的,包括所有依赖项。
ENS – 该库支持以太坊名称服务 (ENS)。因此,ENS 名称被视为一等公民。
测试用例- Ethers.js 提供了大量积极维护和更新的测试用例集合。
上面的要点只是五个示例;还有更多内容等待您去发现!不过,随着对 ethers.js、库的优势和智能合约事件的更深入了解,我们将看看本教程的核心部分,即如何使用 ethers.js 监听智能合约事件!
使用 Ethers.js 监听智能合约事件
在本节中,我们将向您展示如何使用 ethers.js 监听智能合约事件。更具体地说,我们将快速向您展示如何设置区块链监听器来监控 USD 币 (USDC) 智能合约的转账事件。然而,在深入研究中心脚本之前,您需要处理一些先决条件!
首先,您需要设置一个新的 NodeJS 项目并创建两个文件:“abi.json”和“.env”。在“abi.json”文件中,添加 USDC 智能合约应用程序二进制接口 (ABI)。然后,您需要将有效节点提供商的密钥添加到“.env”文件中。在本例中,我们将向您展示如何使用 ethers.js 和 Alchemy 监听智能合约事件。因此,向文件中添加一个名为“ ALCHEMY_KEY ”的新环境变量并包含您的密钥。
由于本文的核心重点是如何使用 ethers.js 监听智能合约事件,因此我们不会深入介绍如何设置“abi.json”和“.env”文件,而是将注意力集中在脚本本身上。但是,在执行此操作之前,您必须安装几个依赖项。为此,请打开一个新终端并运行以下命令:
“index.js” 文件
完成“abi.json”和“.env”文件的设置后,下一步是创建一个“index.js”文件,我们将向其中添加区块链监听器的代码。因此,有了新文件后,您要添加的第一件事就是在“index.js”顶部添加以下代码片段:
上面的代码指定“index.js”使用 ethers.js,导入合约 ABI,并提供从“.env”文件访问密钥的权限。从那里,您将要创建一个名为“ getTransfers() ”的新异步函数:
上面的函数相对简单;但是,让我们从上到下分解一下。首先,函数花括号内的前两行创建了两个变量:“ usdcAddress ”和“ provider ”。
对于前者,请指定要监控的合约地址。对于后者,请使用 ethers.js 的一个模块和“.env”文件中的密钥添加节点提供商。
从这里,通过在调用“ ethers.Contract() ”函数时传递“ usdcAddress ”、“ ABI ”和“ provider ”变量作为参数来创建一个新的“ contract ”对象。然后,使用“ contract ”对象设置侦听器,指定您感兴趣的是转移事件。
最后,确保结果返回到控制台。总而言之,您的“index.js”文件现在应如下所示:
运行脚本
现在您已经完成了使用 ethers.js 监听智能合约事件的整个脚本,剩下的最后一件事就是运行代码。因此,打开一个新终端,输入以下命令,然后按 Enter:
运行此命令将返回与 USDC 智能合约相关的新交易。为了让您了解它是什么样子,您将在下面找到一个示例的打印屏幕:
如您所见,“ getTransfers() ”函数返回一堆信息,例如“到”和“来自”地址、事件数据(如块编号、块哈希、交易索引)等等。
就是这样!您现在知道如何使用 ethers.js 监听智能合约事件了!现在,虽然 ethers.js 是一个出色的开发工具,但许多开发人员发现还有一种替代方案更为有益。因此,在下一节中,我们将介绍一种 ethers.js 替代方案!
Ethers.js 的替代品
尽管 ethers.js 是用于设置区块链监听器的绝佳库和工具,但始终值得研究其他突出的替代方案,而 Moralis 的Streams API就是一个很好的例子!使用此应用程序编程接口,您可以使用Moralis webhook轻松地将链上数据传输到区块链项目的后端!
此外,借助 Moralis 的可访问性,您只需五个简单的步骤即可设置流或区块链监听器:
提供地址
应用过滤器来指定何时接收 webhook
选择您有兴趣监控的连锁店
添加 Webhook URL
接收 webhook
它不必比这更复杂!不过,让我们仔细研究一下使用 Moralis 的 Web3 Streams API 的一些主要优势!
Moralis Streams API 的优势
Moralis 的 Streams API 具有许多突出的优点,您可以在下面找到五个示例:
100% 可靠性– 使用 Moralis 的 Streams API 时,您无需担心不可靠的节点提供商。相反,通过使用 Moralis,您可以获得 100% 的可靠性。
多重合约——使用 Moralis 的 Streams API,您可以为多个不同的智能合约地址创建一个区块链监听器。
过滤器——Moralis 的 Streams API 非常灵活,允许您设置流以仅在满足特定条件时接收 Web3 webhook。
没有不必要的抽象——Moralis 消除了构建抽象等冗余过程。
节省时间——您不必浪费时间构建复杂的数据管道,这使得您在监听区块链网络时节省时间。
这涵盖了使用 Moralis 的一些优势示例。有了对智能合约事件、ethers.js 和 Moralis 的更深刻理解,是时候进入一个充满刺激的部分了。在这样做的同时,我们可以坐在擂台边观看 ethers.js 与 Moralis Streams 的对决!
Ethers.js 与 Moralis Streams 在监听智能合约事件时的对比
使用 ethers.js 监听智能合约事件是一个不错的开始。但是,正如您在“ Moralis Streams API 的优势”部分中了解到的,Moralis Streams API 提供了许多好处。那么,ethers.js 和 Moralis Streams 相比如何?让我们仔细看看下面的图片:
在上表中,您可以看到它们之间的相似点和不同点的简要概述。快速浏览一下,您会立即注意到 Moralis 提供了 ethers.js 提供的一切以及更多。这包括 100% 的可靠性、过滤事件的选项、使用多个地址、获取解析数据等。因此,您可能需要考虑将 Moralis 作为监听智能合约事件的替代方案。
但是,您不必相信我们的话!在以下小节中,我们将快速向您展示如何设置相同的区块链侦听器。但现在,我们将使用 Moralis,而不是使用 ethers.js。这样做突出了使用 Moralis 相对于 ethers.js 的优势!
使用 Moralis 监听智能合约事件
您可以在下面找到使用 Moralis 设置区块链监听器的完整代码:
简单总结一下,在上面的代码中,我们创建了一个带有一些参数的“ options ”对象。此外,它在调用“ Moralis.Streams.add ()”函数时作为参数传递。那么,这两个选项之间的主要区别是什么?
ethers.js 和 Moralis Streams 选项之间的一个显著区别是“ Moralis.Streams.AddAddress() ”函数。从上面的代码中可以看到,我们传递了一个“ address ”数组作为参数。在这个例子中,我们只包含 USDC 合约地址。但是,您可以根据需要包含任意数量的地址。因此,您可以将同一个区块链监听器用于 Moralis 的多个合约。不幸的是,在使用 ethers.js 时这是不可能的,因为它需要您为不同的地址设置新的监听器。另一个突出的例子是,您可以在“ options ”对象中添加“ advancedOptions ”参数来创建过滤器!
最后,让我们看一下运行基于流的脚本的响应(在执行代码之前,除了之前安装的“ ethers ”和“ dotenv ”之外,还要安装所需的 Moralis 依赖项,方法是在新终端中运行“ npm i moralis @moralisweb3/common-evm-utils ”):
在上图中,我们包含了发送到 webhook 服务器的响应之一。这是众多交易之一,属于更广泛的数组。然而,如屏幕截图所示,流的响应包含解析的数据,包括交易哈希、合约地址、日志索引等。