如何构建自己的索引器和用于合约部署详情的 API

  • QuickNode
  • 发布于 2025-01-30 20:27
  • 阅读 27

本文详细介绍了如何使用QuickNode的Streams和Key-Value Store构建一个索引器和API,以存储和检索智能合约部署的详细信息。通过实时监控区块更新,利用过滤器筛选合约部署事件,并使用REST API接口获取数据,提供了一种有效管理区块链数据的解决方案。

概述

检索智能合约部署的详细信息可能会耗费时间。在本指南中,我们将向你展示如何构建自己的索引器和 API,以使用 QuickNode 的 StreamsKey-Value Store 存储和检索智能合约部署的详细信息。

具体来说,我们将教你如何使用 Streams 和 Filters 来监控新块的合约部署。你将学习如何将这些部署详细信息存储在 Key-Value Store 中,然后通过 REST API 调用进行检索。

让我们开始吧!

你将做什么

  • 了解 Streams 和 Key-Value Store
  • 创建一个带有 Filter 的 Stream 以监控新的合约部署
  • 将合约部署的详细信息存储在 Key-Value Store 中
  • 通过 REST API 调用测试 Key-Value Store API

你需要准备什么

Streams

Streams 是一个强大的工具,允许你将实时和历史区块链数据检索到你选择的应用程序。Streams 提供了一种灵活的方式,从各种区块链网络中检索信息并将其传递到你指定的目的地,例如 Webhook、Postgres 数据库、S3 存储桶等。有关 Streams 的更多信息,请查看这里。另外,请确保查看我们长长的 Streams 教程

Filters

Streams 包含一个强大的特性,称为 Filters,允许你细化从 Stream 发送的区块链数据。使用 Filters,你可以精确指定希望获取的区块链数据,确保你仅处理和支付对你相关的数据。要了解如何有效地在你的 Streams 中使用 Filters,请查看我们全面的 Filters 文档

Key-Value Store

QuickNode 的 Key-Value Store 是一个快速、可扩展的数据库解决方案,特别适合存储与区块链相关的数据。在本指南中,我们将用它来存储合约部署的详细信息,然后稍后通过 REST API 调用从 Key-Value Store 检索这些数据。请在我们的 文档 中了解有关 Key-Value Store 的更多信息。

创建一个 Stream 以监控合约部署

现在,我们将引导你创建 Stream,以监控和检索以太坊区块链上的智能合约部署详细信息。具体而言,我们将向你展示如何:

  • 设置一个带有 Filter 的 Stream 以检测新的智能合约部署
  • 将部署详细信息存储在 Key-Value Store 中
  • 通过 REST 调用从 Key-Value Store 检索合约部署信息

导航到你的 QuickNode 控制面板,然后点击左侧边栏中的 Streams。接下来,点击 Create Stream 并使用以下配置:

  • Chain and Network: Ethereum Mainnet
  • Dataset: Receipts
  • Stream name: 这是一个随机名称,但如果你想,可以更新它
  • Region: 选择离你最近的区域
  • Batch size: 我们将保持为 1,以获取实时数据,但如果你进行回填,你可能想测试不同的批次数字以提高效率
  • Stream Start: Latest Block(如果需要,你也可以配置一个较早的开始块)
  • Stream End: Doesn't end(如果需要,你也可以配置一个结束块)

然后,在 Stream payload 部分,选择 Modify payload before streaming 选项,并包含以下代码。

function hexToDecimal(hex) {
  return parseInt(hex, 16);
}

function main(stream) {
  if (!stream || !stream.data[0]) {
    return {
      newContracts: [],
      kvApiResults: []
    };
  }

  const receipts = stream.data[0]

  var newContracts = receipts.filter(function(receipt) {
    return receipt.to === null;
  }).map(function(receipt) {
    return {
      txHash: receipt.transactionHash,
      from: receipt.from,
      contractAddress: receipt.contractAddress,
      blockNumber: hexToDecimal(receipt.blockNumber),
      network: stream.metadata.network
    };
  });

  const results = {
    newContracts: newContracts,
    kvApiResults: [],
  };

  const networkName = stream.metadata.network;
  for (const contract of newContracts) {
    const key = `${contract.contractAddress}:${networkName}`;
    const item = `deploymentHash:${contract.txHash}`;

    try {
      const upsertResult = qnUpsertList(key, {
        add_items: [item]
      });
      results.kvApiResults.push(upsertResult);
    } catch (error) {
      results.kvApiResults.push({ error: error.message });
    }
  }

  return results;
}

让我们回顾一下代码:

  • hexToDecimal 是一个辅助函数,用于将十六进制解码为十进制值,我们将用它来将块号从十六进制转换为十进制。
  • main 函数包含合约部署跟踪器的逻辑。对于从我们的 Stream 发送的每个新块,我们将检查收据,检查 to 字段是否为 null(这表示一个合约部署交易)。
    • 如果找到合约部署交易,我们将添加其详细信息( txHashfromcontractAddressblockNumbernetwork)到 newContracts 映射中。
    • 接下来,我们将循环遍历新合约的映射,并使用辅助命令 qnUpsertList 将它们添加到我们的 Key-Value Store 中。一个键和项的示例如下:0x891a369c87ea9804792494b39879372e8ec87bb59401ec721d3ee4b650a1b2aa:ethereum-mainnet (例如,contractAddress:networkName)。
    • 包含结果和错误处理,以通知我们对 Key-Value Store 的插入是否有效。

提示

在使用 Streams Filters 中的 Key-Value Store 时,你需要使用辅助函数(例如 qnUpsertList()qnGetList()qnGetAllLists() 等),而不是进行 REST API 调用。有关更多信息,请查看这里

我们可以通过指定 Test block 数字来测试 Filter 代码,然后点击 Run test。如果你在块 20921736 上测试,你应该会看到类似下面的结果。

{
  "kvApiResults": [\
    "OK",\
    "OK"\
  ],
  "newContracts": [\
    {\
      "blockNumber": 20921736,\
      "contractAddress": "0xf26ac92ff8617622bcf77c04317c009a8134dce2",\
      "from": "0xf400de71bf20c529565f27aefdd80c00e579e696",\
      "network": "ethereum-mainnet",\
      "txHash": "0x891a369c87ea9804792494b39879372e8ec87bb59401ec721d3ee4b650a1b2aa"\
    },\
    {\
      "blockNumber": 20921736,\
      "contractAddress": "0x6c55f346c20ca2b0c62e30790907f0a41c978ccc",\
      "from": "0xf400de71bf20c529565f27aefdd80c00e579e696",\
      "network": "ethereum-mainnet",\
      "txHash": "0x43973028c8d95a3a35edb2c685786c43ab56d8dd372b5fd4add690ec7a18a74f"\
    }\
  ]
}

在代码编辑器下方,你会看到 Reorg handling 部分。保持此设置不变,然后在右下角点击 Next 继续配置 Stream。

在下一部分中,我们将设置目的地。

设置目的地

由于我们需要的数据已经被过滤,因此我们不需要进行其他处理。因此,我们将简单地将更新发送到我们的 Webhook 目的地,如果你希望添加额外的功能,可以稍后进行修改。

点击 Webhook 作为目标,然后填写以下详细信息:

  • Destination URL: 这是你希望 Stream 数据发送到的 URL。出于演示目的,我们将使用 https://typedwebhook.tools/ 设置一个 Webhook
  • Payload compression: 无(保持默认)
  • Include metadata in: Header(根据需要可修改)。元数据详细信息包括 stream_idbatch_start_rangebatch_end_rangenetwork 等信息。 重要:目前,没有简单的方法在 Filters UI 中测试元数据(上面的示例是在更新前获取的)。因此,你在 Filters UI 测试时不会看到 Stream 元数据。我们正在努力更新此内容以改善元数据测试体验。
  • Timeout, Retry data fetch every, Pause stream after: 保持为默认值

填写完数据后,点击 Run Test 按钮,Stream 将会向该 URL 发送你 Stream 数据的示例。如果 you didn't change the previous Test block number, you will see the same test result sent to your Webhook; otherwise, if you're testing on a block with no new contract deployments, you will see an empty payload such as:

{
  "kvApiResults": [],
  "newContracts": []
}

这是正常的,因为并不是每个块都会有新的合约部署。最后,点击 Create a Stream 按钮以创建 Stream。在你的 Webhook 上保持关注;当检测到合约部署时,你将看到类似于此的结果:

typedwebhook tools result

在下一部分中,我们将向你展示如何通过 REST 调用 Key-Value Store 来检索这些智能合约的部署详细信息。

测试 Key-Value Store

确保你想要的合约地址是在你的 Stream 被启动后已部署的(否则 Key-Value Store 将是空的/未定义的)。

然后,要通过 REST 调用 Key-Value Store,我们可以调用 /kv/rest/v1/lists/{key} REST 方法并执行以下操作:

curl -X GET \
    "https://api.quicknode.com/kv/rest/v1/lists/{contractAddress:network}" \
 -H "accept: application/json" \
 -H "Content-Type: application/json" \
 -H "x-api-key: YOUR_API_KEY"

key 占位符替换为正确的键(即 contractAddress:network)。此外,在 YOUR_API_KEY 字段中包含你的 API 密钥。你可以通过点击你的个人资料图标,然后点击 API Keys 在 QuickNode 控制面板上检索此内容。

响应看起来如下:

{
    "code": 200,
    "msg": "",
    "data": {
        "items": [\
            "deploymentHash:0x3c63a1e63ad93b564db9740278bc0fb084505747c78f5981076001bdd5467b6f"\
        ]
    }
}

注意:获取未添加到 Key-Value Store 的合约地址将导致未定义的响应。

你现在可以轻松地使用该交易哈希查找有关该交易的更多信息,可以在如 Etherscan 的区块浏览器上查找,或者调用 eth_getTransactionReceipt RPC 方法以获取交易的回执(其中将包括 logs 等字段)。

干得好!你刚刚创建了一个 Stream,为智能合约部署构建自己的索引器和 API。如果你想继续在此逻辑基础上构建,请尝试以下想法:

  1. 回填历史区块链数据,以便最终拥有一个包含所有智能合约部署历史的数据库
  2. 为多个区块链创建 Streams。由于我们在 Key-Value Store 中设置了 key 以与不同网络一起使用,正是尝试利用它的好时机
  3. 使用 Functions 创建自定义 API 以访问 Key-Value Store 并丰富数据。例如,你可以获取与部署哈希相关的整个交易提供有关合约部署的更全面信息。

最后想法

做得好!本指南展示了如何建立一个监控新智能合约部署的索引器和 API,使用 QuickNode 的 Streams。

无论你正在构建什么,我们都想听到你的消息。在 DiscordTwitter 上留言,告诉我们你正在做什么!

我们 ❤️ 反馈!

告诉我们 如果你有任何反馈或新主题的请求。我们期待你的来信。

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

0 条评论

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