#substrate #events #index #indexer #block #chain #indexing

nightly acuity-index-substrate

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

3 个版本

0.6.2 2024 年 5 月 18 日
0.6.1 2024 年 5 月 15 日
0.6.0 2024 年 5 月 2 日

#45 in #indexer

每月 30 次下载
用于 2 个 crate (通过 acuity-index-substrate-ap…)

Apache-2.0

340KB
4K SLoC

Acuity Index Substrate

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 数据库中要高效得多。

具有识别参数的事件将被索引。例如,在 Balances 模块中,Transfer 事件可以通过 AccountId 来识别,包括 fromto

Hybrid 内置了对以下 Substrate 模块的索引宏:System、Preimage、Indices、Balances、Transaction Payment、Staking、Session、Democracy、Collective、Elections Phragmen、Treasury、Vesting、Identity、Proxy、Multisig、Fast Unstake、Election Provider Multi-phase、Tips、Bounties、Child Bounties、Bags List、Nomination Pools。

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

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

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

与每个 Substrate 链都是一个独立的 Rust 构建,使用 Substrate 包一样,每个链都需要一个独立的 Hybrid 索引器构建,配置为索引正确的模块。

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

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

消费者可以订阅与查询匹配的新事件。

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

AccountId/BlockNumber/EventIndex

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

依赖关系

~20–31MB
~474K SLoC