本文介绍了如何为以太坊、Polygon等EVM兼容区块链构建索引器。
本指南将向你展示如何为与 EVM 兼容的区块链(如以太坊、Polygon Proof of Stake 等)构建你自己的索引器!
最后,你将拥有一个运行 Kafka 的 Docker 容器,该容器捕获你指定的所有区块链事件,以及有关如何在应用程序内部转换和使用此数据的参考!
让我们开始吧!
链索引器框架的架构可以分为三个部分:
区块生产者:扫描区块链并将原始区块数据发布到 Kafka 中。
转换器:将来自 Kafka 的原始数据转换成有意义的事件。
消费者:读取转换后的数据,用于各种用例,例如来自前端应用程序或 API 端点。
我们将首先在 Docker 容器内设置我们的 Kafka 实例,然后为这三个组件中的每一个运行一个用 TypeScript 编写的脚本。
生产者从指定的区块链读取数据,并将其发布到在 Docker 容器中运行的 Kafka 实例中。 同时,它还会在 Mongo DB 中保留最新的区块,以防 reorgs。
一旦存储在 Kafka 中,我们就能够将其转换为更有意义的数据,并使其可供任何消费者读取;例如应用程序。
在我们创建三个服务(生产者、转换器、消费者)中的每一个之前,我们需要设置连接到区块链和存储数据所需的基础设施。 在本节中,我们将设置以下服务:
用于连接到区块链的 RPC
一个运行 Kafka 以存储原始数据的 Docker 容器
用于存储最新区块的 Mongo 数据库。
首先,让我们创建一个新目录来包含我们将要做的所有工作:
复制
复制
## 创建我们的基本目录
mkdir chain-indexer-framework-guide
## 更改到这个新目录
cd chain-indexer-framework-guide
## 在 VS Code 中打开
code .
现在我们在这里,让我们通过创建一个 Docker Compose 文件来设置我们的 Docker 容器。
💡
你将需要安装 Docker 才能完成本指南的这一部分。 按照 Get Docker 页面上的说明进行操作,并通过在终端中运行“docker --version”来验证你的安装。
Docker Compose 文件允许我们定义应用程序的环境。 要创建一个,让我们在这个当前目录中创建一个 docker-compose.yml
文件。
💡
如果你使用的是 VS Code,建议安装 Docker Extension。
在 docker-compose.yml
中,设置以下 compose 文件:
复制
复制
---
version: "3"
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.0.0
hostname: zookeeper
container_name: zookeeper
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
broker:
image: confluentinc/cp-kafka:7.0.0
container_name: broker
ports:
- "9092:9092"
depends_on:
- zookeeper
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,PLAINTEXT_INTERNAL://broker:29092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
我们不会在本指南中介绍所有字段(了解有关 compose 文件的更多信息),但此文件将允许我们运行一个 Docker 容器,其中包含用于维护配置信息的 Apache ZooKeeper 和用于存储原始数据的 Apache Kafka。
现在我们已经定义了 compose 文件,让我们运行 Docker 容器。
使用 Docker Compose 的“up”命令,并使用 -d
标志在分离模式下运行容器。
复制
复制
docker-compose up -d
💡
第一次使用 Docker? 确保你已完成 Docker 安装。
运行 docker ps
命令以查看所有容器的状态:
你也可以运行 Docker Desktop 来查看正在运行的容器:
现在我们的 Kafka 实例已经启动并运行,我们准备好存储来自区块链的原始数据。 但是,要读取区块链数据,我们需要一种连接到链本身的方法;所以接下来让我们创建一个新的 RPC 节点。
有 许多解决方案提供商提供与区块链的 RPC 连接。 在本指南中,我们将使用流行的 RPC 提供商 Alchemy 作为我们的 RPC 提供商,因为它们提供了一个慷慨的免费层。
首先,转到你的 Alchemy 仪表板的 应用程序 页面,然后单击创建新应用:
选择你要从中读取数据的链和网络,然后单击创建应用:
稍后当我们编写生产者时,我们将返回此处获取我们的 RPC URL。
接下来,让我们设置一个数据库来执行 TODO。
在本指南中,我们将使用 Mongo DB,因为链索引器框架的 Producer 具有一个我们可以轻松将此数据库插入的 mongoUrl
属性。
如果你尚未这样做,请注册 Mongo DB,然后部署一个新数据库。
以下是我选择的选项;但你可以根据自己的喜好进行自定义:
配置好数据库后,完成设置过程。
首先,添加一种身份验证方法;在本指南中,我们使用一个简单的用户名和密码,该用户名和密码是为我们自动生成的。
其次,配置谁可以访问你的数据库。 在本指南中,我们只是添加我们当前机器的 IP 地址。 最后,单击完成并关闭。
最后,基础设施设置完成! 🎉
现在我们准备好设置链索引器框架的三个组件。
通过运行以下命令来设置一个简单的 TypeScript + Node.js 项目:
复制
复制
npm init -y
要添加 TypeScript,请创建一个包含以下内容的 tsconfig.json
文件:
复制
复制
{
"compilerOptions": {
"module": "NodeNext",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"target": "ES2020",
"sourceMap": true,
"strict": true,
"outDir": "dist",
"declaration": true
},
"include": ["src/**/*"]
}
将 package.json
文件设置为以下内容:
复制
复制
{
"name": "producer",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"scripts": {
"build": "tsc",
"start-producer": "npm run build && node --experimental-import-meta-resolve --trace-warnings dist/producer.js",
"start-transformer": "npm run build && node --experimental-import-meta-resolve --trace-warnings dist/transformer.js",
"start-consumer": "npm run build && node --experimental-import-meta-resolve --trace-warnings dist/consumer.js"
},
}
安装所需的 TypeScript 依赖项:
复制
复制
npm install -D typescript @types/node
在安装更多依赖项之前,你需要按照 node-gyp
的安装说明进行操作,作为安装 @maticnetwork/chain-indexer-framework
包的先决条件。 如果你使用的是 Windows,这包括在 Visual Studio 中安装当前版本的 Python 和 Visual C++ Build Environment。
接下来,通过运行以下命令安装 @maticnetwork/chain-indexer-framework
包:
复制
复制
npm install @maticnetwork/chain-indexer-framework
最后,创建一个 src
文件夹,其中包含三个文件:
producer.ts
transformer.ts
consumer.ts
现在我们准备开始了。 让我们从生产者开始。
在 producer.ts
文件中,我们将连接到你在 RPC 步骤中选择的区块链,并将原始数据写入 Kafka。
以下是在 Kafka 中开始存储原始数据的基本代码。 Mongo DB 用于在 Mongo DB 成为 Kafka 中的永久数据之前存储最新数量的区块(在 maxReOrgDepth
字段中指定)。
复制
复制
import { BlockPollerProducer } from "@maticnetwork/chain-indexer-framework/block_producers/block_polling_producer";
import { produce } from "@maticnetwork/chain-indexer-framework/kafka/producer/produce";
const producer = produce<BlockPollerProducer>({
startBlock: 50689834, // 选择你想要的任何起始区块
rpcWsEndpoints: ["<your-alchemy-rpc-url-here>",],
blockPollingTimeout: 20000,
topic: "polygon.1442.blocks",
maxReOrgDepth: 256, // Polygon 上的最大 reorg 深度为 256
maxRetries: 5,
mongoUrl: "mongodb+srv://<your-mongo-username>:<your-mongo-password>@chain-indexer.0ymaemb.mongodb.net/",
"bootstrap.servers": "localhost:9092",
"security.protocol": "plaintext",
type: "blocks:polling",
});
producer.on("blockProducer.fatalError", (error: any) => {
process.exit(1); //发生致命错误时退出进程。 进程管理器需要重新启动进程。
});
重要的是,你需要:
在 rpcsWsEndpoints
字段中添加你的 HTTPS Alchemy RPC URL。
将你的 Mongo URL 连接字符串添加为 mongoUrl
。
(可选)根据你的偏好配置其他属性。
准备好后,你可以运行以下命令来启动生产者:
复制
复制
npm run start-producer
如果一切正常,你应该开始在 Mongo DB 中看到一些数据,你可以在 Database > Collections 部分中找到:
链索引器框架还具有日志记录功能,可以查看幕后发生的事情。 要将其添加到你的生产者,请首先导入 Logger:
复制
复制
import { Logger } from "@maticnetwork/chain-indexer-framework/logger";
并且可以选择将日志添加到生产者发出的任何事件,例如:
复制
复制
producer.on("blockProducer.fatalError", (error: any) => {
Logger.error(`Block producer exited. ${error.message}`);
process.exit(1); //发生致命错误时退出进程。 进程管理器需要重新启动进程。
});
现在我们已经在 Kafka 实例中提供了原始数据! 你已准备好开始在应用程序中转换和使用数据。
尽管开始这些步骤需要大量的代码,但我们已经为所有内容奠定了基础,因此它应该相对简单!
与其转储所有代码供你复制和粘贴,不如我们提供了一些开源 示例,说明如何在下面链接的 GitHub 上设置不同类型的转换器和生产者。
- 原文链接: blog.jarrodwatts.com/cre...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!