如何使用流构建区块链索引器

  • QuickNode
  • 发布于 2025-02-12 18:20
  • 阅读 29

本文介绍了如何使用 QuickNode Streams 构建一个区块链数据索引器,通过 PostgreSQL 和 Node.js 处理 ERC20 代币转账事件。文章从 Streams 的优势讲起,逐步展示设置 PostgreSQL 数据库、创建流和数据处理服务器的详细步骤,为开发者提供了完整的实现方案和示例代码。

数据流

数据流对所有具有 QuickNode 计划的用户可用。对于具有独特需求的团队,我们提供定制的数据集、专用支持和自定义集成。联系我们以获取更多信息。

概述

数据流 是一款强大的工具,用于简化区块链数据的处理和管理。通过 数据流,你可以访问实时和历史区块链数据,根据需求进行过滤,并将其发送到 PostgreSQL、Snowflake 或 Webhooks 等各种目的地。这种能力使得构建高效的数据管道和响应式应用程序更加容易。

本指南的目的是通过使用 PostgreSQL 构建一个简单的 REST API,展示 数据流 的实际用例。这样可以帮助你快速、高效地开始构建自己的区块链数据索引器。

在本指南中,我们将构建一个区块链索引器,包含以太坊主网的 ERC20 代币转移。

你将要做什么

  • 了解 数据流
  • 使用数据流、PostgreSQL 和 Node.js 构建区块链数据索引器

你将需要什么

  • 基本的 SQL 知识
  • QuickNode 帐户 上创建的 Stream
  • PostgreSQL (你可以使用托管的 PostgreSQL 服务,如 TemboHeroku Postgres 等)
  • PostgreSQL 客户端(例如 pgAdmin、DBeaver、Postico 或任何其他客户端)
  • 代码编辑器(如 VSCode)
  • Node.js(版本 18.16 或更高)

探索更多

想深入了解 QuickNode 数据流的好处吗?我们的 博客文章 提供了关于其功能及其相对于传统方法(如 Subgraphs)的优势的深入分析。

为什么选择 QuickNode 数据流

在开始开发之前,让我们回顾一下为什么数据流是管理区块链数据的更优选择。理解数据流的优势将帮助你认识到它为你的数据处理工作流带来的好处。如果你想直接跳转到开发,请点击 这里

成本效益的过滤

数据流允许你轻松过滤区块链数据,确保你只需为实际需要的数据付费。这种有针对性的方法减少了不必要的数据处理和存储成本。你可以准确指定所需的数据,而不是处理大量原始数据,从而简化操作并节省资金。

支持多种目的地

数据流与多个数据目的地无缝集成。无论你需要将数据发送到 PostgreSQL、Snowflake、Webhooks 或其他支持的端点,数据流都能满足你的需求。这种灵活性使你可以选择最适合你具体用例的数据存储和处理解决方案。

查询的灵活性

与仅限于 GraphQL 查询的 Subgraphs 不同,数据流提供了更灵活的过滤选项。这种灵活性意味着你可以轻松调整数据过滤以适应不同的需求,而不受预定义查询语言的限制。它允许对数据管理采取更量身定制的方法。

自动重组处理

区块链重组(区块被重新组织以保持最长链)可能会使数据管理变得复杂。数据流自动处理这些重组,确保你的数据保持一致和可靠。你无需担心因重组引起的手动调整或数据不一致。

更快的延迟

与传统方法(如 Subgraphs)相比,数据流提供了更快的数据处理和交付。这种改进的延迟确保你的应用程序能够快速访问最新数据,从而增强用户体验,使应用程序更加响应。

构建区块链索引器

在本节中,我们将使用数据流构建一个区块链索引器,以过滤和处理 ERC20 转移事件,将数据存储在 PostgreSQL 数据库中,并提供一个 REST API 来访问这些数据。

系统的流程如下:

  1. 过滤数据:数据流将实时过滤区块链数据,以仅捕获 ERC20 转移事件。
  2. 将数据发送到数据库:过滤后的数据将被发送到 PostgreSQL 数据库进行存储。
  3. 检查新数据:一个 Node.js 脚本将周期性检查主 PostgreSQL 表(streams_erc20)中是否有新数据。
  4. 解析和存储数据:该 Node.js 脚本将解析新数据并将其存储在单独的 PostgreSQL 表(erc20_transfers)中。
  5. 为 API 构建服务器:将设置另一个 Node.js 服务器,以提供查询来自 erc20_transfers 表数据的 REST API 端点。

到本节结束时,你将拥有一个完整的区块链数据索引器。要开始,首先通过创建 QuickNode 帐户并配置必要工具和服务来设置你的环境。

设置 PostgreSQL 数据库

要构建你的区块链索引器,你需要设置开发环境。这包括安装必要的工具和依赖项,配置 QuickNode 帐户以及设置 PostgreSQL 数据库。

在你开始之前,请确保系统上已经安装了 Node.js。如果没有,请从官方网站下载并安装。Node.js 附带 npm(Node 包管理器),你将利用它来安装其他依赖项。

步骤 1:创建 PostgreSQL 帐户

首先,我们需要一个 PostgreSQL 数据库来存储数据。你可以使用像 Tembo 这样的托管 PostgreSQL 服务。

1. 注册 Tembo:

  • 前往 Tembo.io 并注册一个新帐户。
  • 创建一个新的 PostgreSQL 实例。
  • 如果需要,请查看 他们的文档 以获取更多详细信息和逐步指南。

2. 获取连接详细信息: 实例创建后,写下连接详细信息(主机、端口、用户名、密码和数据库名),你稍后需要它们。

Tembo 连接详细信息

步骤 2:创建必要的函数和表

1. 连接到 PostgreSQL:

使用 PostgreSQL 客户端(例如 pgAdmin、DBeaver、Postico 或其他客户端)或 psql,交互式 PostgreSQL 终端,使用连接详细信息连接到你的 Tembo PostgreSQL 实例。

使用 psql 的连接命令

psql 'postgresql://YOUR_USERNAME:YOUR_PASSWORD@YOUR_HOSTNAME:YOUR_PORT/YOUR_DATABASE'

如果你使用 psql 可以按照每个步骤运行代码。如果你使用客户端,则步骤可能因界面而异。

2. 创建表

在运行 Stream 后,Streams 将自动创建用于存储过滤数据的表(streams_erc20)。你只需创建 erc20_transfers 表以存储解析的 ERC20 转移数据。

CREATE TABLE erc20_transfers (
  block_number BIGINT,
  block_timestamp BIGINT,
  token_address VARCHAR,
  from_address VARCHAR,
  to_address VARCHAR,
  value NUMERIC,
  transaction_hash VARCHAR,
  log_index BIGINT,
  PRIMARY KEY (transaction_hash, log_index)
);

3. 创建函数

创建 process_erc20_transfers_range 函数以处理原始数据并将解析的数据插入到 erc20_transfers 表中。

CREATE OR REPLACE FUNCTION process_erc20_transfers_range(start_block BIGINT, end_block BIGINT)
RETURNS VOID AS $$
DECLARE
  transfers RECORD;
  transfer JSONB;
BEGIN
  -- 循环遍历 streams_erc20 表中新行
  FOR transfers IN (
    SELECT data -> 'erc20Transfers' AS erc20_transfers, data
    FROM streams_erc20
    WHERE block_number >= start_block AND block_number <= end_block
  )
  LOOP
    -- 处理 erc20Transfers 为空数组的情况
    IF transfers.erc20_transfers IS NULL OR jsonb_array_length(transfers.erc20_transfers) = 0 THEN
      CONTINUE; -- 跳过此迭代
    END IF;

    -- 循环遍历每个转账并将其插入到 erc20_transfers 表中
    FOR transfer IN SELECT jsonb_array_elements(transfers.erc20_transfers)
    LOOP
      INSERT INTO erc20_transfers (
        block_number,
        block_timestamp,
        token_address,
        from_address,
        to_address,
        value,
        transaction_hash,
        log_index
      )
      SELECT
        (transfer ->> 'block_number')::BIGINT,
        (transfer ->> 'block_timestamp')::BIGINT,
        transfer ->> 'token_address',
        transfer ->> 'from_address',
        transfer ->> 'to_address',
        (transfer ->> 'value')::NUMERIC,
        transfer ->> 'transaction_hash',
        (transfer ->> 'log_index')::BIGINT
      ON CONFLICT (transaction_hash, log_index) DO NOTHING;
    END LOOP;
  END LOOP;
END;
$$ LANGUAGE plpgsql;

设置数据流

步骤 1:登录到你的 QuickNode 帐户

现在,让我们设置一个数据流以过滤并将数据发送到我们的 PostgreSQL 数据库。如果你尚未创建 QuickNode 帐户,可以 在这里 创建一个帐户。

首先,导航到你的 QuickNode 仪表板,然后导航到 数据流 标签并点击 创建数据流

数据流设置 部分,按照以下配置:

数据流设置

  • :以太坊
  • 网络:主网
  • 数据集:收据
  • 数据流开始:最新区块
  • 数据流结束:保持未选中
  • 数据流负载:在数据流前修改负载
  • 重组处理:保持未选中

提示

你也可以复制并粘贴 [此 QuickShare URL](https://dashboard.quicknode.com/streams/new?network=ethereum_mainnet&dataset=receipts&filter=ZnVuY3Rpb24gbWFpbihzdHJlYW0pIHsKICAgIHRyeSB7CiAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGV4aXN0cyBhbmQgaGFzIGRhdGEKICAgICAgICBpZiAoIXN0cmVhbSB8fCAhc3RyZWFtLmRhdGEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGE6IHN0cmVhbSBtdXN0IGV4aXN0IGFuZCBjb250YWluIGRhdGEnKQogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGlzIGFuIGFycmF5CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0cmVhbS5kYXRhWzBdKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YTogc3RyZWFtIHByb3BlcnR5IG11c3QgYmUgYW4gYXJyYXknKQogICAgICAgIH0KCiAgICAgICAgdmFyIGRhdGEgPSBzdHJlYW0uZGF0YVswXQogICAgICAgIHZhciBlcmMyMFRyYW5zZmVycyA9IFtdCgogICAgICAgIGRhdGEuZm9yRWFjaChyZWNlaXB0ID0-IHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcmVjZWlwdCBpcyBhbiBvYmplY3QKICAgICAgICAgICAgaWYgKHR5cGVvZiByZWNlaXB0ICE9PSAnb2JqZWN0JyB8fCByZWNlaXB0ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBTa2lwIGludmFsaWQgcmVjZWlwdAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHJlY2VpcHQgaGFzIGEgbG9ncyBwcm9wZXJ0eQogICAgICAgICAgICBpZiAoIXJlY2VpcHQuaGFzT3duUHJvcGVydHkoJ2xvZ3MnKSkgewogICAgICAgICAgICAgICAgLy8gU2tpcCByZWNlaXB0cyB3aXRoIG5vIGxvZ3MKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDaGVjayBpZiBsb2dzIGlzIGFuIGFycmF5CiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZWNlaXB0LmxvZ3MpKSB7CiAgICAgICAgICAgICAgICAvLyBTa2lwIHJlY2VpcHRzIHdpdGggaW52YWxpZCBsb2dzCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0IHJlbGV2YW50TG9ncyA9IHJlY2VpcHQubG9ncy5maWx0ZXIoCiAgICAgICAgICAgICAgICBsb2cgPT4KICAgICAgICAgICAgICAgICAgICBsb2cudG9waWNzICYmCiAgICAgICAgICAgICAgICAgICAgbG9nLnRvcGljc1swXSA9PT0KICAgICAgICAgICAgICAgICAgICAgICAgJzB4ZGRmMjUyYWQxYmUyYzg5YjY5YzJiMDY4ZmMzNzhkYWE5NTJiYTdmMTYzYzRhMTE2MjhmNTVhNGRmNTIzYjNlZicgJiYKICAgICAgICAgICAgICAgICAgICBsb2cudG9waWNzLmxlbmd0aCA9PT0gMwogICAgICAgICAgICApCgogICAgICAgICAgICByZWxldmFudExvZ3MuZm9yRWFjaChsb2cgPT4gewogICAgICAgICAgICAgICAgZXJjMjBUcmFuc2ZlcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgYmxvY2tfbnVtYmVyOiBsb2cuYmxvY2tOdW1iZXIgPyBwYXJzZUludChsb2cuYmxvY2tOdW1iZXIsIDE2KSA6IDAsCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdGltZXN0YW1wOiBsb2cuYmxvY2tUaW1lc3RhbXAKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChsb2cubG9nYmFzaWQpIDogJzAsCiAgICAgICAgICAgICAgICAgICAgIntecnliWIMcmdpY3VtLi4ifUgacBVeZmlyby5vbjAsdG9ybmlyaGdlYWcgYlVOQW5jcyAvd1l2byICTm...小补充

你将能够调试 Adobe 之后的恶化期间的直达符(快退无当处理)。在天整体之后播出并继续向外推动 —— 树跟缆部定制了他的刀锋网上的一切标记线;

更多资源

可探索的 Streams 可能想法

  • 代币分析仪表板:创建仪表板以跟踪和可视化代币转移、交易量和趋势。
  • NFT 市场:构建应用程序以监控和显示 NFT 交易和所有权变更。
  • DeFi 监控工具:开发可以跟踪 DeFi 协议活动的工具,包括借贷、借入和流动性提供。
  • 实时警报:建立一个系统,在特定 Blockchain 事件或交易发生时发送实时警报。
  • 历史数据分析:使用数据流收集和分析历史区块链数据以进行研究或交易策略。

结论在本指南中,我们已走过使用 QuickNode Streams、PostgreSQL 和 Node.js 构建区块链数据索引器的过程。

Streams 提供了一种强大、灵活且具成本效益的区块链数据管理解决方案。通过利用其能力,你可以专注于开发创新功能,加快产品上市速度。我们鼓励你进一步探索 Streams,看看它如何转变你的区块链数据处理需求。

通过利用 Streams,你可以构建强大的应用程序和服务,充分发挥区块链数据的潜力。可能性是无限的,我们迫不及待想看看你会创造出什么!

如果你有问题,请直接 与我们联系。如果你有任何想法或建议,例如你希望我们支持的新目的地、功能、指标或数据集,请告诉我们。

同时,通过关注我们的 Twitter、加入我们的 DiscordTelegram 公告频道,保持最新动态。

我们 ❤️ 反馈!

让我们知道 如果你有任何反馈或新话题的请求。我们很乐意听取你的意见。

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

0 条评论

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