2个版本

0.1.1 2023年2月23日
0.1.0 2023年2月23日

#36 in #query-engine

MIT/Apache

515KB
12K SLoC

Rust 9K SLoC // 0.0% comments TypeScript 2K SLoC // 0.1% comments GraphQL 531 SLoC // 0.4% comments

chaindexer

build status tests status chat

区块链数据的开源索引器和查询引擎。

安装

构建/安装需要Cargo(rustup是安装它的简单方法)。然后从本仓库的根目录运行

cargo install --path .

快速入门

查询引擎支持直接从RPC节点进行查询(即无需预先索引整个链)。要启动一个SQL REPL并开始从您的RPC查询数据,您只需运行

ETH_RPC_API=<your rpc url> chaindexer sql

查询

运行查询和构建索引都需要一个可以连接的RPC API。但即使没有预先构建索引,也可以查询链数据。只要查询运行得非常选择性(即访问的区块号),就可以这样做。换句话说:因为链上数据是按区块号范围划分的,所以查询必须只访问特定范围的区块号--否则整个链状态就必须进行索引(下一节将说明如何进行索引。)

例如,一个有效的查询可能如下所示

select * from eth.logs l
join eth.blocks b
on b.hash = l.block_hash
where b.number >= (eth_current_block() - 10) -- 10 most recent blocks

可以在区块号上评估的谓词将始终被推送到表扫描。只要查询有这种谓词,可以将其推送到只需要检索少量区块号的子集,您就应该能够通过RPC API直接查询数据(即无需完整索引)。

您还可以指定查询引擎自动过滤掉除最后n个最近区块之外的所有区块。运行

chaindexer sql --last-n-blocks 10

select * from eth.logs l
join eth.blocks b
on b.hash = l.block_hash;

与前面显示的查询等效。在没有预先索引的情况下进行交互式查询时,建议使用last-n-blocks选项。

注意:其他SQL接口

即将推出兼容JDBC的服务器(这将允许您在PyCharm或其他接受JDBC的数据库客户端中使用此工具)。

可用的架构/表

可以通过SQL显示架构、表以及每个表的列。

SHOW TABLES; -- shows available tables, what tables are available will depend on your config
DESCRIBE eth.blocks; -- describe a single table

有关CLI命令的更多信息,请运行:chaindexer help

索引

要查询完整链,必须构建并保存该链的索引,可以是磁盘上的,也可以是对象存储(目前是IPFS和S3)。索引本质上只是一个包含表和区块范围到包含该表/区块范围原始数据的文件位置的映射的文件。每个索引都由一个存储配置支持,该配置指定了索引文件的位置以及实际数据分区应放置的位置。

配置

在构建索引之前,您可能需要一个配置文件来指定您的存储层。

chaindexer config

这将创建一个您可以编辑的 TOML 文件。例如,要使用 S3(其他配置示例可以在源代码中的 src/storage/conf.rs 查看,数据类型名为 StorageConf)作为存储层,您可以打开 ~/.chaindexer/config.toml 配置文件并更改 stores.eth 部分(S3 凭证从环境中读取)。

[stores.eth]
type="s3"
bucket="<your s3 bucket>"
# s3 key prefix for where all partition files will be placed
prefix="/prefix"
# the root index will be stored here. the index file contains mappings to the partition
# files which will be loaded into prefix.
# this file will also be under prefix, so if your prefix is `/prefix`, the full s3 key
# of the root index file would be `/prefix/eth.db`
filename="eth.db"

每个链都有自己的存储配置,这就是为什么在 stores.eth 下指定了 eth 的存储层。如果您更愿意将数据存储在磁盘上,默认生成的配置文件中的存储层应该足够。

构建索引

现在指定了 eth 存储层,我们可以运行 index 命令来开始构建以太坊索引。目前运行的 index 只索引原始链数据(我们正在积极工作,将一些自定义数据处理管道迁移到这个开源项目中)。

chaindexer index --chain eth

现在可以运行非选择性查询(如果分区索引尚未完全构建,它将仅将已构建的块视为存在的唯一块)。

索引时间

我们认识到,仅为了运行查询而索引整个链对于大多数用户来说是不现实的。我们目前正在努力将预索引的以太坊放到 IPFS 上,这样其他用户就可以使用查询引擎,而无需索引整个链。

技术概述

链数据在 Apache Parquet 的各种存储层上进行索引和持久化。查询引擎利用 DataFusion,这是一个高度灵活和可扩展的内存查询引擎,它使用 Apache Arrow 作为其内存中的列式数据格式。

每个索引都是一个 SQLite 数据库,它向查询引擎描述在每个表扫描期间如何访问原始数据。例如,一个以太坊索引将在 SQLite db 中有一行,将块表映射到 S3(或其他存储层,包括您的磁盘)上的 parquet 文件(对于块范围 0 - 1,000,000)。该 parquet 文件将有 1,000,000 行,代表该范围内的所有块。

依赖关系

~97MB
~2M SLoC