#substrate #events #hybrid #indexer #index #block #chain

nightly hybrid-indexer

用于索引 Substrate 区块链事件的库

10 个版本 (4 个重大更改)

0.5.4 2024 年 3 月 20 日
0.5.3 2024 年 3 月 18 日
0.4.0 2023 年 12 月 5 日
0.3.0 2023 年 10 月 25 日
0.1.1 2023 年 8 月 9 日

#31 in #hybrid

Download history 1/week @ 2024-04-21 1/week @ 2024-04-28 4/week @ 2024-05-19 5/week @ 2024-06-02 6/week @ 2024-06-09 1/week @ 2024-06-16 92/week @ 2024-07-28

92 每月下载
2 个 crate 中使用 (通过 hybrid-api)

Apache-2.0

340KB
4K SLoC

Hybrid Indexer

Substrate 事件索引器。

该工具的开发得到了 Web3 基金会的资助

概述

Hybrid 采用独特的、部分去中心化的方法,解决了当前开源 Substrate 区块浏览器的主要两个问题:中心化和巨大的托管需求。

一个完全集中的区块浏览器通常会使用 SQL 数据库存储整个归档节点的内容,并存储其他数据以索引所有内容。可靠地运行此类数据库需要巨大的系统资源和费用。

查询区块信息或任何区块高度的链状态时,Hybrid dapp 将使用浏览器内的 Substrate Connect 轻客户端。或者,这些查询可以直接通过 WSS 发送到归档节点。

对于事件搜索功能,Hybrid 索引器有效地索引了所有区块中的事件,以便可以通过简单的 WSS 查询找到它们。例如,查找与特定 AccountId 相关的所有事件。

这种架构有三个主要优势

  • 状态查询是完全去中心化的 - 您不必信任 RPC 提供者不会对您撒谎
  • 100% 可用性 - 轻客户端不依赖于任何可能始终不可用的集中式服务
  • Hybrid 索引器具有显著降低的系统要求 - 它不需要存储所有链历史记录

最终,Hybrid 将使用这种集中式/去中心化方法作为 ink! 合约浏览器的基础。

由于 Substrate 是一个联邦平台,将能够从 Hybrid dapp 浏览多个链。

架构

Hybrid Architecture

Hybrid 索引器是用 Rust 编写的。它可以配置为连接到任何 Substrate 链。

它使用 subxt 读取所有区块中的事件,并使用 sled 库将这些事件索引到键值数据库中。这比在 SQL 数据库中存储索引要高效得多。

具有识别参数的事件将被索引。例如,在余额组件中,转账事件可以通过AccountId识别,包括fromtoAccountId

Hybrid为以下Substrate组件内置了索引宏:系统、预映像、索引、余额、交易支付、质押、会话、民主、集体、选举Phragmen、国库、托管、身份、代理、多重签名、快速解质押、多阶段选举提供者、小费、赏金、子赏金、包裹列表、提名池。

Hybrid目前支持以下事件参数的索引:AccountIdAccountIndexAuctionIndexBountyIndexCandidateHashEraIndexMessageIdParaIdPoolIdPreimageHashProposalHashRefIndexRegistrarIndexSessionIndexTipHash

此外,所有事件都按事件变体索引。这意味着,例如,可以获取所有账户的所有余额转账列表。

要索引一个区块,首先需要查询确定区块号的哈希值。然后查询元数据版本。最后下载区块本身。为了确保吞吐量尽可能高,同时索引多个区块以抵消往返延迟。

与每个Substrate链都是一个单独的Rust构建,使用Substrate组件类似,每个链都需要一个单独的Hybrid索引器构建,配置为索引正确的组件。

当链可能执行运行时升级时,该链的Hybrid索引器需要带有任何更新事件的新的发布版本。如果索引器实例在运行时升级之前没有更新,则可以在正确的区块号上重新启动新版本。

WSS查询通过高度可扩展的tokio_tungstenite Rust库处理。

消费者将能够订阅与查询匹配的新事件。

数据库键以这种方式构建,以便可以使用从特定区块号开始的迭代器找到事件。例如,对于AccountId键空间

AccountId/BlockNumber/EventIndex

数据库条目是键唯一的。不存储值。每个找到的事件只需要返回区块号和事件索引。这减少了索引数据库的大小,并增加了去中心化。前端可以以去中心化的方式查询链以检索事件。

依赖关系

~20–31MB
~476K SLoC