2个版本
0.1.1 | 2023年2月23日 |
---|---|
0.1.0 | 2023年2月23日 |
#36 in #query-engine
515KB
12K SLoC
chaindexer
区块链数据的开源索引器和查询引擎。
安装
构建/安装需要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