如何使用 ethers.js 监听待处理交易

2022-11-07 09:50:32 浏览数 (1)

译文出自:登链翻译计划[1] 译者:darren[2] 校对:Tiny 熊[3]

概述

如果你喜欢观看而不是阅读,这里有一个视频指南:https://www.youtube.com/embed/YjQj6uk9M98

在以太坊上,在形成一个区块中之前,交易会保留在待处理交易队列、交易池或内存池中——它们的意义相同。然后,矿工从这个队列中选择待处理交易池的子集进行出块——对于交易者、想要节省 gas 费用的人等能够访问和分析这些信息将会得到很多好处。

在这份指南中,我们将学会如何在以太坊和相似链使用 ethers.js[4] 处理待处理交易流

准备条件

  • 在你的电脑上安装 Nodejs
  • 一个文本编辑器
  • 命令行终端
  • 一个以太坊节点

什么是待处理交易

要在以太坊网络编写或者更新任何内容,需要有人创建,签署和发送交易。交易是外部世界与以太坊网络通信的方式。当发送到以太坊网络时,交易会停留在称为“mempool”的队列中,交易等待旷工被处理----- 处于这种等待交易称为待处理交易。发送交易所需要的少量费用称为 gas;交易被旷工包含在一个区块中,并且根据它们包含的给旷工的 gas 价格来确定优先级 。

查看这里[5], 将得到关于内存池和待处理交易的更多信息。

我为什么需要查看未处理的交易呢?

通过检查待处理的交易,可以执行以下操作:

  • 估计 gas:理论上我们可以查看待处理的交易来预测下一个区块的最优 gas 价格。
  • 用于交易分析:我们可以分析去中心化交易所中的待处理交易,以便预测市场趋势。
  • 交易抢跑:在 DeFi 中,你可以预览即将到来的与价格(预言机)相关的交易,并可能对 MKR、COMP 和其他协议的保险库发出清算。

处理待处理交易流可能有很多案例——我们不会在这里全部介绍。

我们将使用 ethers.js[6], - (中文文档[7]) 通过 WebSockets 处理这些待处理的交易流。在编写代码之前, 看看如何安装 ethers.js。

安装 ethers.js

我们的第一步是检查系统上是否安装了 node.js。为此,请将以下内容复制粘贴到你的终端

代码语言:javascript复制
$ node -v

如果没有安装,可以从 官网[8]下载 LTS 版本的 NodeJS。

现在我们已经安装了 node.js,让我们使用 node.js 附带的 npm(节点包管理器)安装 ethers.js 库。

代码语言:javascript复制
$ npm i ethers

此步骤中最常见的问题是 node-gyp 的内部故障。你可以按照 node-gyp 安装说明在这里[9]

注意:如果遇到 node-gyp 问题,你需要让你的 python 版本与上述说明中列出的兼容版本之一匹配。

另一个常见问题是缓存过时。只需在终端中键入以下内容即可清除 npm 缓存:

代码语言:javascript复制
$ npm cache clean

如果一切是正常的,ethers.js 将安装到了你的操作系统。

启动我们的以太坊节点

对于我们今天的目的,我们几乎可以使用任何以太坊客户端,例如 Geth 或 OpenEthereum (之前称为 Parity)。由于要处理传入的新待处理的交易流,节点连接必须稳定可靠;维护一个节点是一项具有挑战性的任务,我们只需 从 QuickNode 获取一个免费的端点[10] 来简化这项工作。创建免费的以太坊端点后,复制你的 WSS (WebSocket) Provider 端点。

你以后会需要它的,因此这会复制并且保存它。

处理待处理交易流

创建一个脚本文件 pending.js,它将对传入的待处理交易进行交易过滤。将以下内容复制粘贴到文件中:

代码语言:javascript复制
var ethers = require("ethers");
var url = "ADD_YOUR_ETHEREUM_NODE_WSS_URL";

var init = function () {
  var customWsProvider = new ethers.providers.WebSocketProvider(url);

  customWsProvider.on("pending", (tx) => {
    customWsProvider.getTransaction(tx).then(function (transaction) {
      console.log(transaction);
    });
  });

  customWsProvider._websocket.on("error", async () => {
    console.log(`Unable to connect to ${ep.subdomain} retrying in 3s...`);
    setTimeout(init, 3000);
  });
  customWsProvider._websocket.on("close", async (code) => {
    console.log(
      `Connection lost with code ${code}! Attempting reconnect in 3s...`
    );
    customWsProvider._websocket.terminate();
    setTimeout(init, 3000);
  });
};

init();

所以继续用上面部分中的 WSS (WebSocket) Provider 替换 ADD_YOUR_ETHEREUM_NODE_WSS_URL

以上代码解释如下:

第 1 行:导入 ethers 库。

第 2 行:设置我们的以太坊节点 URL。

第 4 行:创建 init 函数。

第 5 行:实例化一个 ethers WebSocketProvider 实例。

第 7 行:为待处理的交易创建一个事件侦听器,每次从节点发送新的交易哈希时都会运行该事件侦听器。

第 8-10 行:使用从上一步获得的交易哈希获取整个交易,并在控制台中打印交易。

第 13-16 行:如果连接遇到错误,则重新启动 WebSocket 连接的函数。

第 17-21 行:如果连接终止,则重新启动 WebSocket 连接的函数。

第 24 行:调用 init 函数。

现在 ,让我一起运行这段脚本:

代码语言:javascript复制
$ node pending

如果一切执行得顺利, 你会看到传入的待处理交易,像这样:

使用 Ctrl c 来停止这段脚本的运行。

结论

在这里,我们看到了如何使用 ethers.sjs 从以太坊网络获取待处理的交易,这里有相应的文档[11]

订阅我们的 newsletter[12] 以获取有关以太坊的更多文章和指南。如果你有任何反馈,请随时通过 Twitter[13] 与我们联系。你可以随时在我们的 Discord[14] 社区服务器上与我们聊天,其中包含你将遇到的一些最酷的开发人员 :)


本翻译由 Duet Protocol[15] 赞助支持。

原文:https://www.quicknode.com/guides/defi/how-to-stream-pending-transactions-with-ethers-js

参考资料

[1]

登链翻译计划: https://github.com/lbc-team/Pioneer

[2]

darren: https://learnblockchain.cn/people/4859

[3]

Tiny 熊: https://learnblockchain.cn/people/15

[4]

ethers.js: https://docs.ethers.io/v5/

[5]

这里: https://www.quicknode.com/guides/defi/how-to-access-ethereum-mempool

[6]

ethers.js: https://docs.ethers.io/v5/

[7]

中文文档: https://learnblockchain.cn/docs/ethers.js/

[8]

官网: https://nodejs.org/en/

[9]

node-gyp 安装说明在这里: https://github.com/nodejs/node-gyp#installation

[10]

从 QuickNode 获取一个免费的端点: https://www.quicknode.com/?utm_source=internal&utm_campaign=guides

[11]

文档: https://docs.ethers.io/v5/single-page/#/v5/api/providers/provider/-#-Provider--events

[12]

newsletter: https://www.getrevue.co/profile/quiknode

[13]

Twitter: https://twitter.com/QuickNode

[14]

Discord: https://discord.gg/ahckhyA

[15]

Duet Protocol: https://duet.finance/?utm_souce=learnblockchain

0 人点赞