如何访问以太坊内存池

  • QuickNode
  • 发布于 2024-04-02 10:42
  • 阅读 32

本文介绍了如何在以太坊上查询Mempool(交易池),包括使用QuickNode节点的原生Ethereum JSON-RPC和Web3.js进行查询的步骤和方法。

概述

在以太坊上,当一笔交易被发送后,在被打包进区块之前,它会存放在一个称为 Mempool 的地方。要获取这笔交易的信息,必须查询 Mempool。本指南将演示如何使用 QuickNode 的以太坊节点来查询节点的 Mempool。

注意:本指南展示了如何使用原生的以太坊 JSON-RPC 和 Web3.js 访问以太坊 Mempool。查看此 QuickNode 指南了解更多:如何使用 Ethers.js 流式处理待处理交易

什么是以太坊 Mempool?

在区块链术语中,Mempool 是一个等待区域,用于存放尚未被打包进区块且仍未确认的交易。这是区块链节点处理尚未被包含在区块中的交易的方式。

当以太坊节点接收到一笔交易时,它会将交易传播给对等节点,直到矿工批准该交易并将其添加到新区块中。在被打包进下一个区块之前,交易会停留在一个称为 Mempool 或 txpool 的暂存/等待区域。有些人也将其称为“待处理交易”。

之所以需要这个等待区域或缓冲区的功能,是因为交易并不会立即被添加到区块链中。节点还会对这些交易进行一系列有效性检查。这些检查包括确保资金仍然可用、输出不超过输入、签名有效等。如果交易未能通过其中任何一项检查,它将被拒绝。需要注意的是,Mempool 不能被视作所有节点共享的通用主参考。每个节点都会为其 Mempool 配置自己的规则。此外,一个节点可能是第一个接收到交易的节点,但可能尚未将该交易传播到网络的其他部分。

例如,Geth 和 OpenEthereum 的默认插槽和内存设置决定了它们处理 Mempool 交易的行为。当一笔新的待处理交易被允许进入 Mempool,但所有节点空间都已满时,gas 费用最低的交易将被从池中移除。不同节点接受和丢弃交易的规则各不相同,并取决于它们的设置。

甚至术语本身也因客户端而异:

然而,“Mempool” 是一个广泛使用并被接受的术语。

以太坊 Mempool 的用途是什么?

如上所述,交易在被确认并被矿工打包之前需要被存储。通常,gas 价格较低的交易会在 Mempool 中停留更长时间。此类交易可能会被替换交易覆盖(通常称为“取消并加速交易”)。Mempool 最突出的用途之一是获取待处理交易。以下是你可能希望这样做的原因:

  • 在交易中,获取去中心化交易所(如 Uniswap、Balancer 等)的交易价格。

  • 分析 gas 价格并调整交易价格,以避免被丢弃。

  • 分析和模拟待处理交易,这有助于降低拒绝率。

让我们开始吧!

设置你的 QuickNode 以太坊端点

为了本指南的目的,可以使用任何以太坊客户端,例如 Geth 或 OpenEthereum(前身为 Parity)。要启动一个新的以太坊节点,首先选择一个客户端并进行配置。请注意,同步和维护一个以太坊节点是一项具有挑战性的任务,可能需要数天时间。

为了简化操作,我们将从 QuickNode 获取一个节点,这更容易设置。在 QuikNode 以太坊节点启动后,复制你的 HTTP Provider 端点:

本指南使用 OpenEthereum(Parity)节点和 Geth 节点来说明它们 Mempool 方法的差异。但是,我们几乎可以使用 QuikNode API 计划中的任何节点来访问 TX-QUEUETX-POOL 内容。

以太坊端点截图

复制并保存你的 HTTP Provider 端点。

如何使用 QuickNode 访问和查询以太坊 Mempool?

首先,查询 OpenEthereum 节点的 Mempool。OpenEthereum 将其 Mempool 称为 Transaction Queue 或 TX-QUEUE。OpenEthereum 客户端监听网络中的交易,以将其包含在区块中(如果正在挖矿/验证)或用于交易广播。这些交易(本地或外部发出)会被验证并排序到交易队列中。

向你的节点的交易队列/Mempool 发出 cURL 请求:

$ curl --data '{"method":"parity_pendingTransactions","params":[],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST ADD_YOUR_ETHEREUM_NODE_URL

**ADD_YOUR_ETHEREUM_NODE_URL** 替换为你之前保存的 HTTP Provider。

上述命令是向你的节点的交易队列/Mempool 发出 cURL JSON-RPC 请求。

**parity_pendingTransactions** 方法返回待处理交易。在 params 部分,可以使用 limit 参数设置返回的交易数量。交易还可以根据 tofrom 地址、gas、gasPrice、value 和 nonce 进行过滤。

成功的输出应如下所示(高亮显示了一笔交易):

输出包含按优先级排列的交易流。每笔交易包括哈希、nonce、区块哈希、区块编号、value、gas 价格、gas、原始交易数据、tofrom 地址、公钥、链 ID 等。

其他 txqueue 方法包括 **parity_localTransactions**,它返回 25 笔本地交易,这些交易可能已被挖矿、待处理或被丢弃,以及 **parity_allTransactions**,它返回未来将处理的交易以及被丢弃的交易。

要查询 Geth 节点的 Mempool 或 TX-POOL 或 Transaction Pool

向你的节点的交易池/Mempool 发出 cURL 请求:

$ curl --data '{"method":"txpool_content","id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST ADD_YOUR_ETHEREUM_NODE_URL

**ADD_YOUR_ETHEREUM_NODE_URL** 替换为你之前保存的 HTTP Provider。

这将通过使用 txpool_content 方法向你的 Geth 节点的交易池/Mempool 发出 cURL JSON-RPC 请求,该方法将返回待处理交易和排队等待未来执行的交易。输出流将有两个字段:pending 和 queued。

成功的输出应如下所示(高亮显示了一笔交易):

此输出包含与上一个示例相同的元素。

其他 txpool 方法包括 **txpool_inspect**,它以文本形式返回待处理交易的列表摘要,以便快速查看,以及 **txpool_status**,它返回当前待处理和排队交易的数量。

使用 Web3 进行查询

让我们看看如何使用 Web3.js 订阅 Mempool 中的待处理交易。

先决条件

  • 系统中已安装 NodeJS。

  • 文本编辑器

  • CLI

查看我们的指南 '如何使用 Web3.js 连接到以太坊网络',了解如何安装和使用 Web3.js 库。

步骤 1.

通过执行以下命令安装 web3.js:

$ npm install web3

步骤 2.

现在,创建一个文本脚本文件并将其命名为 index.js

var Web3 = require("web3");
var url = "ADD_YOUR_ETHEREUM_NODE_WSS_URL";

var options = {
  timeout: 30000,
  clientConfig: {
    maxReceivedFrameSize: 100000000,
    maxReceivedMessageSize: 100000000,
  },
  reconnect: {
    auto: true,
    delay: 5000,
    maxAttempts: 15,
    onTimeout: false,
  },
};

var web3 = new Web3(new Web3.providers.WebsocketProvider(url, options));
const subscription = web3.eth.subscribe("pendingTransactions", (err, res) => {
  if (err) console.error(err);
});

var init = function () {
  subscription.on("data", (txHash) => {
    setTimeout(async () => {
      try {
        let tx = await web3.eth.getTransaction(txHash);
        console.log(tx)
      } catch (err) {
        console.error(err);
      }
    });
  });
};

init();

解释上述代码:

第 1-2 行:导入 web3 库,并将 QuickNode 的 wss URL 添加到变量 **url

第 4-16 行:添加重连逻辑,以便在连接因某种原因断开时,脚本将重新尝试建立连接。

第 18-21 行:实例化 WebSocketProvider 实例,并将其分配给 **web3 变量,订阅待处理交易。

第 23-34 行:通过哈希获取交易主体,并打印交易。

步骤 3.

当我们运行此文件时,它应该输出当前在 Mempool 中的待处理交易流。

$ node index

这对于 Mempool 跟踪、跟踪特定交易、交易机器人等非常有用。

结论

本简短指南向你展示了如何以 QuikNode 为例轻松查询以太坊节点的 Mempool。了解待处理(进行中)交易可以为你(和其他人)的交易提供有价值的见解,以便你可以做出有价值的调整。

进一步阅读:如何使用 ethers.js 流式处理待处理交易

订阅我们的 新闻通讯 以获取更多关于以太坊的文章和指南。如果你有任何反馈,请随时通过 Twitter 联系我们,如果你有任何问题,可以通过我们的 Discord 社区服务器与我们聊天;谢谢 :)

  • 原文链接: quicknode.com/guides/eth...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

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