GTokenTool全网最好的代币发行工具平台
当前位置:首页 >> 加密百科 >> 如何使用 Ethers.js 监听智能合约事件

如何使用 Ethers.js 监听智能合约事件

admin 加密百科 60

什么是智能合约事件? 

当基于其代码的事件发生时,所有 Web3 合约都会发出所谓的“智能合约事件”。简而言之,这些事件是智能合约发出的一种信号,用于通知开发人员和软件系统发生了一些有意义的事情。此外,应用程序和其他平台使用这些信号进行通信。 

数字用户拿着笔,写着智能合约

让我们以 ERC-20 代币标准为例来进一步阐明这一点。所有实施此标准的智能合约都会在有人交易代币时自动发出“转移”事件。此外,除了通知之外,这些事件通常还包含有关交易的更多详细信息。 

您可能已经得出结论,在构建 Web3 项目时,能够实时监听此类事件至关重要。话虽如此,您需要一个无缝的工作流程来设置区块链监听器,当链上发生相关事件时,它可以向您和您的项目发出警报,这就是 ethers.js 发挥作用的地方! 

探索 Ethers.js 

Ethers.js 是一个区块链 JavaScript (JS) 库,于 2016 年推出。它是迄今为止最受欢迎的开源以太坊 JS 库之一,下载量达数百万次。与传统编程库一样,ethers.js 是一组预先编写的代码片段,开发人员可以使用和重复使用这些代码片段来执行常见功能。然而,与传统库相比,ethers.js 是基于 Web3 的。因此,开发人员可以使用此库更无缝地与以太坊网络进行通信和交互。 

ethers.js

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”文件,而是将注意力集中在脚本本身上。但是,在执行此操作之前,您必须安装几个依赖项。为此,请打开一个新终端并运行以下命令: 

npm i ethers dotenv

“index.js” 文件 

完成“abi.json”和“.env”文件的设置后,下一步是创建一个“index.js”文件,我们将向其中添加区块链监听器的代码。因此,有了新文件后,您要添加的第一件事就是在“index.js”顶部添加以下代码片段: 

const ethers = require ( "ethers" ) ;
const ABI =需要“。/abi.json”
需要“dotenv” config

上面的代码指定“index.js”使用 ethers.js,导入合约 ABI,并提供从“.env”文件访问密钥的权限。从那里,您将要创建一个名为“ getTransfers() ”的新异步函数: 

异步函数getTransfer ( ) {
   const usdcAddress = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" ; ///USDC 合约
   const provider = new ethers.providers.WebSocketProvider
       `wss://eth-mainnet.g.alchemy.com/v2/$ {process.env.ALCHEMY_KEY} `
   
   const contract = new ethers. Contract ( usdcAddress, ABI, provider ) ;
   contract.on ( "转移" , (来自, 到, 价值, 事件) => {
       transferEvent = {
           来自: 来自,
           至: 至,
           值: 值,
           事件数据:事件,
       }
       控制台.日志JSON. stringify transferEvent, null , 4
   }
}

上面的函数相对简单;但是,让我们从上到下分解一下。首先,函数花括号内的前两行创建了两个变量:“ usdcAddress ”和“ provider ”。 

对于前者,请指定要监控的合约地址。对于后者,请使用 ethers.js 的一个模块和“.env”文件中的密钥添加节点提供商。 

从这里,通过在调用“ ethers.Contract() ”函数时传递“ usdcAddress ”、“ ABI ”和“ provider ”变量作为参数来创建一个新的“ contract ”对象。然后,使用“ contract ”对象设置侦听器,指定您感兴趣的是转移事件。 

最后,确保结果返回到控制台。总而言之,您的“index.js”文件现在应如下所示:

const ethers = require ( "ethers" ) ;
const ABI =需要“。/abi.json”
需要“dotenv” config
异步函数getTransfer ( ) {
   const usdcAddress = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" ; ///USDC 合约
   const provider = new ethers.providers.WebSocketProvider
       `wss://eth-mainnet.g.alchemy.com/v2/$ {process.env.ALCHEMY_KEY} `
   
   const contract = new ethers. Contract ( usdcAddress, ABI, provider ) ;
   contract.on ( "转移" , (来自, 到, 价值, 事件) => {
       transferEvent = {
           来自: 来自,
           至: 至,
           值: 值,
           事件数据:事件,
       }
       控制台.日志JSON. stringify transferEvent, null , 4
   }
}
获取转账

运行脚本

现在您已经完成了使用 ethers.js 监听智能合约事件的整个脚本,剩下的最后一件事就是运行代码。因此,打开一个新终端,输入以下命令,然后按 Enter: 

节点索引.js

运行此命令将返回与 USDC 智能合约相关的新交易。为了让您了解它是什么样子,您将在下面找到一个示例的打印屏幕: 

使用 ethers.js 监听智能合约事件的结果

如您所见,“ getTransfers() ”函数返回一堆信息,例如“到”和“来自”地址、事件数据(如块编号、块哈希、交易索引)等等。 

就是这样!您现在知道如何使用 ethers.js 监听智能合约事件了!现在,虽然 ethers.js 是一个出色的开发工具,但许多开发人员发现还有一种替代方案更为有益。因此,在下一节中,我们将介绍一种 ethers.js 替代方案! 

Ethers.js 的替代品

尽管 ethers.js 是用于设置区块链监听器的绝佳库和工具,但始终值得研究其他突出的替代方案,而 Moralis 的Streams API就是一个很好的例子!使用此应用程序编程接口,您可以使用Moralis webhook轻松地将链上数据传输到区块链项目的后端! 

moralis 宣布推出 streams api 作为 ethers.js 的替代品

此外,借助 Moralis 的可访问性,您只需五个简单的步骤即可设置流或区块链监听器: 

  1. 提供地址 

  2. 应用过滤器来指定何时接收 webhook 

  3. 选择您有兴趣监控的连锁店

  4. 添加 Webhook URL

  5. 接收 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 相比如何?让我们仔细看看下面的图片:

表格比较了 ethers.js 和 moralis 监听智能合约事件的方式

在上表中,您可以看到它们之间的相似点和不同点的简要概述。快速浏览一下,您会立即注意到 Moralis 提供了 ethers.js 提供的一切以及更多。这包括 100% 的可靠性、过滤事件的选项、使用多个地址、获取解析数据等。因此,您可能需要考虑将 Moralis 作为监听智能合约事件的替代方案。 

但是,您不必相信我们的话!在以下小节中,我们将快速向您展示如何设置相同的区块链侦听器。但现在,我们将使用 Moralis,而不是使用 ethers.js。这样做突出了使用 Moralis 相对于 ethers.js 的优势!

使用 Moralis 监听智能合约事件

您可以在下面找到使用 Moralis 设置区块链监听器的完整代码:

const Moralis = require ( "moralis" ) 默认;
const Chains = require “@moralisweb3/common-evm-utils”
const EvmChain = 链。EvmChain
const ABI =需要“。/abi.json”
需要“dotenv” config
const选项 = {
 链:[ EvmChain. ETHEREUM ]
 描述:“USDC 转账 100k”
 标签:“usdcTransfers100k”
 包括合同日志:true
 abi: ABI,
 主题0:[ “转移(地址,地址,uint256)” ]
 webhookUrl: "https://22be-2001-2003-f58b-b400-f167-f427-d7a8-f84e.ngrok.io/webhook" ,
 高级选项:[
   {
       主题0:“转移(地址,地址,uint256)”
       筛选:{
           gt : [ "值" , "100000" + "" . padEnd ( 6 , “0” ) ]
       }
   }
]
}
道德。开始{
 apiKey:进程.环境.MORALIS_KEY
} ) .然后( async ( ) => {
 const stream = await Moralis.Streams.add ( options ) ;
 const { id } = 流.toJSON ( ) ;
 等待Moralis。Streams。addAddress {
     id: id,
     地址:[ “0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48” ]
 }
}

简单总结一下,在上面的代码中,我们创建了一个带有一些参数的“ 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 ”):

使用 ethers 与 moralis 结果响应监听智能合约事件

在上图中,我们包含了发送到 webhook 服务器的响应之一。这是众多交易之一,属于更广泛的数组。然而,如屏幕截图所示,流的响应包含解析的数据,包括交易哈希、合约地址、日志索引等。 

作者:GTokenTool一键发币平台

交流群:https://t.me/+Kz4u3xoDpFo3ZWY1

同类推荐