如何在以太坊上进行批量请求

  • QuickNode
  • 发布于 2025-01-31 15:41
  • 阅读 22

本文介绍了如何在以太坊中使用批量请求(Batch Requests),详细解释了批量请求的原理、优点和实现方式,包括如何使用 Node.js 编写脚本来发送批量请求。文章还提供了最佳实践和相关资源链接,是希望提高以太坊 dApp 性能开发者的有用指南。

危险

本指南仅适用于本地或远程服务器上运行自己以太坊节点的用户。不建议使用 QuickNode 以太坊端点实现批量请求,因为这实际上可能会降低 dApp 的性能。 更多信息请点击这里

因此,QuickNode EVM 端点不遵循以太坊 JSON-RPC 标准的 WebSocket (WSS) 批量请求。

我们建议你查看此指南,以获取与 QuickNode 端点的请求最佳实践。有关如何运行自己的以太坊节点的信息,请参见此指南:如何安装和运行 Geth 节点

概述

批量请求是以太坊 JSON-RPC API 的一个特性,允许在单个 HTTP POST 请求中发送多个请求。批量请求可以通过减少需要发送和处理的 HTTP 请求数量来减少网络延迟并提高应用程序性能。

你将要做什么

  • 了解批量请求
  • 创建一个 Node.js 脚本以进行批量请求

你需要的东西

什么是批量请求?

批量请求是一个包含单独 JSON-RPC 请求数组的 JSON-RPC 2.0 请求。每个单独的请求用 JSON 对象表示,包含与常规 JSON-RPC 请求相同的字段。批量请求中的请求可以是不同的类型,并且可以具有不同的参数。

当以太坊 JSON-RPC API 接收到批量请求时,它会按数组中出现的顺序处理每个请求,并返回一个响应数组。如果在处理过程中发生错误,该请求的响应将包含一个错误对象,而不是结果对象。

另外,开发人员也可以在链上执行批量请求。然而,本指南将仅集中于执行链外批量请求。敬请期待即将发布的链上批量请求指南!

批量请求的优点

批量请求相较于发送多个单独请求,可以提供若干优点:

  • 减少网络延迟:通过在单个 HTTP 请求中发送多个请求,可以减少每个单独请求的延迟。
  • 改善性能:通过减少需要发送和处理的 HTTP 请求数量,批量请求可以提升应用程序的整体性能。
  • 原子性:如果需要将多个请求作为单个事务一起执行,批量请求可以确保所有请求原子性处理,要么全部成功,要么全部失败。

进行批量请求

发送批量请求的过程将基于填充了请求对象的数组。让我们开始。

在你的终端中,使用以下命令创建一个名为 off-chain-requests 的空 npm 项目:

mkdir off-chain-requests && cd off-chain-requests && npm init -y

接下来,让我们安装所需依赖,并创建一个空的 index.js 文件:

echo > index.js

现在,让我们创建一个 index.js 文件,并输入以下代码:

const endpoint = 'YOUR_LOCAL_ETHEREUM_NODE'; //例如:http://127.0.0.1:8545
const from = parseInt(''); //在此输入有效的块号
const to = parseInt(''); //在此输入有效的块号

async function main() {

  // 创建要发送的请求数组
  const requests = [];
  for (let i = from; i < to; i++) {
    requests.push({
      method: 'eth_getBlockByNumber',
      params: [`0x${i.toString(16)}`, false],
      // 根据数组中的位置为每个请求设置唯一 ID
      id: i - from,
      jsonrpc: '2.0'
    });
  }

  // 向端点发送批量请求并等待响应
  const response = await fetch(endpoint, {
    method: 'POST',
    body: JSON.stringify(requests),
    headers: { 'Content-Type': 'application/json' }
  });

  // 将响应解析为 JSON
  const data = await response.json();

  console.log(data)
}

// 调用主函数并处理任何发生的错误
main().catch(err => console.log(err));

花一点时间来查看代码,并记得用实际值替换顶部的常量变量。如果你想知道最新的块号,可以查看 Etherscan

当你准备好执行脚本时,保存文件并在 off-chain-requests 根目录运行命令。

node index.js

你会看到类似于以下 JSON 的输出:

[\
    {\
        "jsonrpc": "2.0",\
        "id": 0,\
        "result": {\
            "baseFeePerGas": "0x83373a3a5",\
            "difficulty": "0x0",\
            "extraData": "0x6665622d6275696c646f72",\
            "gasLimit": "0x1c9c380",\
            "gasUsed": "0xd7652d",\
            "hash": "0x135c16c831af901708c90e1d436d0921a7285b8af9236ebd0dc5ed8fefc5801b",\
            "logsBloom": "0x00ed02011524d064009118c0a500108101144c90a8014832202140948251021008a700800200c2102010000c2144048561c10500064d60668a005a080c68a608086440289c40011c4a800009001c52ef10040c5200c0600082c2e184800002034014120212805493c0a052a710101a210d80486480404ccfa1fc90308008a10813c320e42004241e942a48003288000040008421a8148208240503404062014002600800440012101000108a2016028106021a00208222640180058281a00902a244502213060d0e5f2010614587450642881000022824b24092204269822100f8120c2600400840a03081688005104ea0410010031020c11162080212044c10",\
            "miner": "0x4e0100d71ad71940c95710888e1d2501f72c823e",\
            "mixHash": "0x178c155fff0dab89f2fb26cbdd610b547c421dc00a928c783d4a9f73a11f49ee",\
            "nonce": "0x0000000000000000",\
            "number": "0x83b06c",\
            "parentHash": "0x5f802a0633279ecefc131d76d418b3f1143bc90191556413a1b222a3043b8aae",\
            "receiptsRoot": "0xe02bd262504d75d86d7e44252d7ccc30916cbafef27b6866a5496c476953c5c3",\
            "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",\
            "size": "0x2a8bd",\
            "stateRoot": "0x345bcd154ea03886bde7b703898f70bdd64d8148fb1d36c1430e52d9241e4084",\
            "timestamp": "0x640b219c",\
            "totalDifficulty": "0xa4a470",\
            "transactions": [\
                "0x8c2e9224961ce00bf07a6bd0a6c0e5e282b58300ab677c1c07c98e52c5ad3b77",\
                "0x8001a35aa69ebf39b76073b276e8b7da1a1e6f93b1f002fc24d59d633d616867",\
                "0x1466ec0e7fe0dce9fdc6a591aa03191208ecdd064514d242a4beaabb89b14190",\
                "0x89844ea968b995c53753157930d2fc34c173a970c3b447130a008b2701025a24",\
                "0xc3ba403de892b94d35f6dc5a44652ae6f79030f29d6556c97a1868eebe7f53cb",\
                "0x38cfa6e0302348110cae70b8ac52ae221001f27440f5f287ff7484ff00a7c904",\
                "0xd545f05ba4a0a05a12762d6ebdfc82f15707af512d743c1ef2493d1b807112a8",\
                "0xa35480c0df21b03d9027e28f9f90b308c9c375bcf9dbc96f167ab1dd73f1f806",\
                "0xf324ec86c1cb4b9af2755114c257bb56546c5d7b1b1f23ec6837077c24637b53",\
                "0x5b7069d4fd36537dc46030ef8b7d3f5c194443db5b1dedce140089f105fb5ae8",\
                "0x7370966f3147c3bfc87a57e769170c0dbae3a5a499cca24987d75b9f7cecef82",\
                "0x59bad3992eb2d37c3e850dd34e074625234e3f645edf408d03c4db7df93468b3",\
                "0x9210c04f7e92b0ee7d41d32e58b96db6a31ce45462e78a36e075304e1944c734",\
                ...\
            ],\
            "transactionsRoot": "0x473861895c077c801efab8da4b8576846c371386b1282de2dffa33b246a1a190",\
            "uncles": []\
        }\
    },\
    ...\
\

\

如果你收到有关“ReferenceError: fetch is not defined”的错误,请确保你的 Node.js 版本为 18>=\ \ 上面的响应是一个对象数组,因此这个过程可以减少网络延迟,并在检索大量独立数据项时提供明显的速度提升。\ \ 上述示例没有请求之间的依赖关系。然而,在某些情况下,从单个请求中检索数据可能需要后续请求。例如,在使用 JSON-RPC API 的 eth_getTransactionReceipt 方法获取块范围内的所有收据时,用户必须先获取块的交易列表,然后对每个交易调用 eth_getTransactionReceipt。\ \ 为了方便这一过程,用户可以进行两个批量请求:第一个是检索我们目标范围内所有块的交易哈希列表,第二个是检索所有交易哈希的收据对象。你还可以查看 QuickNode 市场 上的 单飞 RPC 附加组件,以自动化此过程。此外,有关此类请求的其他参考材料可以在 Geth 文档中找到。\ \

最后的想法

\ 你已经到达本指南的末尾,所以给自己一个鼓励吧!你现在更好地理解如何在以太坊上进行批量请求!如果你不想管理自己的节点基础设施,并且希望响应时间提高 8 倍,可以将繁重的工作留给我们。在 这里 注册一个免费的账户。\ \ 如果你有问题、疑问,或者想讨论你正在构建的内容,请在 DiscordTwitter 上给我们留言!\ \

我们 ❤️ 反馈!

\ 如果你对本指南有任何反馈,请 告诉我们。我们很想听到你的声音!

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

0 条评论

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