本文介绍了如何使用 QuickNode Streams 构建一个区块链数据索引器,通过 PostgreSQL 和 Node.js 处理 ERC20 代币转账事件。文章从 Streams 的优势讲起,逐步展示设置 PostgreSQL 数据库、创建流和数据处理服务器的详细步骤,为开发者提供了完整的实现方案和示例代码。
数据流对所有具有 QuickNode 计划的用户可用。对于具有独特需求的团队,我们提供定制的数据集、专用支持和自定义集成。联系我们以获取更多信息。
数据流 是一款强大的工具,用于简化区块链数据的处理和管理。通过 数据流,你可以访问实时和历史区块链数据,根据需求进行过滤,并将其发送到 PostgreSQL、Snowflake 或 Webhooks 等各种目的地。这种能力使得构建高效的数据管道和响应式应用程序更加容易。
本指南的目的是通过使用 PostgreSQL 构建一个简单的 REST API,展示 数据流 的实际用例。这样可以帮助你快速、高效地开始构建自己的区块链数据索引器。
在本指南中,我们将构建一个区块链索引器,包含以太坊主网的 ERC20 代币转移。
探索更多
想深入了解 QuickNode 数据流的好处吗?我们的 博客文章 提供了关于其功能及其相对于传统方法(如 Subgraphs)的优势的深入分析。
在开始开发之前,让我们回顾一下为什么数据流是管理区块链数据的更优选择。理解数据流的优势将帮助你认识到它为你的数据处理工作流带来的好处。如果你想直接跳转到开发,请点击 这里。
数据流允许你轻松过滤区块链数据,确保你只需为实际需要的数据付费。这种有针对性的方法减少了不必要的数据处理和存储成本。你可以准确指定所需的数据,而不是处理大量原始数据,从而简化操作并节省资金。
数据流与多个数据目的地无缝集成。无论你需要将数据发送到 PostgreSQL、Snowflake、Webhooks 或其他支持的端点,数据流都能满足你的需求。这种灵活性使你可以选择最适合你具体用例的数据存储和处理解决方案。
与仅限于 GraphQL 查询的 Subgraphs 不同,数据流提供了更灵活的过滤选项。这种灵活性意味着你可以轻松调整数据过滤以适应不同的需求,而不受预定义查询语言的限制。它允许对数据管理采取更量身定制的方法。
区块链重组(区块被重新组织以保持最长链)可能会使数据管理变得复杂。数据流自动处理这些重组,确保你的数据保持一致和可靠。你无需担心因重组引起的手动调整或数据不一致。
与传统方法(如 Subgraphs)相比,数据流提供了更快的数据处理和交付。这种改进的延迟确保你的应用程序能够快速访问最新数据,从而增强用户体验,使应用程序更加响应。
在本节中,我们将使用数据流构建一个区块链索引器,以过滤和处理 ERC20 转移事件,将数据存储在 PostgreSQL 数据库中,并提供一个 REST API 来访问这些数据。
系统的流程如下:
streams_erc20
)中是否有新数据。erc20_transfers
)中。erc20_transfers
表数据的 REST API 端点。到本节结束时,你将拥有一个完整的区块链数据索引器。要开始,首先通过创建 QuickNode 帐户并配置必要工具和服务来设置你的环境。
要构建你的区块链索引器,你需要设置开发环境。这包括安装必要的工具和依赖项,配置 QuickNode 帐户以及设置 PostgreSQL 数据库。
在你开始之前,请确保系统上已经安装了 Node.js。如果没有,请从官方网站下载并安装。Node.js 附带 npm(Node 包管理器),你将利用它来安装其他依赖项。
首先,我们需要一个 PostgreSQL 数据库来存储数据。你可以使用像 Tembo 这样的托管 PostgreSQL 服务。
1. 注册 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;
现在,让我们设置一个数据流以过滤并将数据发送到我们的 PostgreSQL 数据库。如果你尚未创建 QuickNode 帐户,可以 在这里 创建一个帐户。
首先,导航到你的 QuickNode 仪表板,然后导航到 数据流 标签并点击 创建数据流。
在 数据流设置 部分,按照以下配置:
数据流设置
提示
你将能够调试 Adobe 之后的恶化期间的直达符(快退无当处理)。在天整体之后播出并继续向外推动 —— 树跟缆部定制了他的刀锋网上的一切标记线;
Streams 提供了一种强大、灵活且具成本效益的区块链数据管理解决方案。通过利用其能力,你可以专注于开发创新功能,加快产品上市速度。我们鼓励你进一步探索 Streams,看看它如何转变你的区块链数据处理需求。
通过利用 Streams,你可以构建强大的应用程序和服务,充分发挥区块链数据的潜力。可能性是无限的,我们迫不及待想看看你会创造出什么!
如果你有问题,请直接 与我们联系。如果你有任何想法或建议,例如你希望我们支持的新目的地、功能、指标或数据集,请告诉我们。
同时,通过关注我们的 Twitter、加入我们的 Discord 和 Telegram 公告频道,保持最新动态。
让我们知道 如果你有任何反馈或新话题的请求。我们很乐意听取你的意见。
- 原文链接: quicknode.com/guides/qui...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!