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

  • darren
  • 更新于 2022-05-30 17:44
  • 阅读 9667

如何使用 ethers.js 监听待处理交易(pending transaction)

概述

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

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

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

准备条件

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

什么是待处理交易

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

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

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

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

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

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

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

安装ethers.js

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

$ node -v

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

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

$ npm i ethers

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

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

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

$ npm cache clean

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

启动我们的以太坊节点

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

QuickNode 以太坊端点截图

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

处理待处理交易流

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

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 函数。

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

$ node pending

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

img

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

结论

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

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


本翻译由 Duet Protocol 赞助支持。

点赞 4
收藏 14
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

2 条评论

请先 登录 后评论
darren
darren
江湖只有他的大名,没有他的介绍。