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…)
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 索引器是用 Rust 编写的。它可以配置为连接到任何 Substrate 链。
它使用 subxt 读取所有区块中的事件,并使用 sled 库将这些事件索引到键值数据库中。这比将索引存储在 SQL 数据库中要高效得多。
具有识别参数的事件将被索引。例如,在 Balances 模块中,Transfer 事件可以通过 AccountId
来识别,包括 from
和 to
。
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 目前支持以下事件参数的索引:AccountId
、AccountIndex
、AuctionIndex
、BountyIndex
、CandidateHash
、EraIndex
、MessageId
、ParaId
、PoolId
、PreimageHash
、ProposalHash
、RefIndex
、RegistrarIndex
、SessionIndex
、TipHash
。
此外,所有事件都根据事件变体进行索引。这意味着,例如,可以获取所有账户的所有余额转账列表。
要索引一个区块,首先必须查询以确定区块号对应的哈希。然后进行第二个查询以获取元数据版本。最后下载区块本身。为了确保吞吐量尽可能高,同时索引多个区块以抵消往返延迟。
与每个 Substrate 链都是一个独立的 Rust 构建,使用 Substrate 包一样,每个链都需要一个独立的 Hybrid 索引器构建,配置为索引正确的模块。
当一条链可能执行运行时升级时,该链的 Hybrid 索引器需要一个包含任何更新事件的新的发布版本。如果索引器的实例在运行时升级发生之前没有更新,它可以在正确的区块号下用新版本重新启动。
WSS 查询通过高度可扩展的 tokio_tungstenite Rust 库处理。
消费者可以订阅与查询匹配的新事件。
数据库键以这种方式构造,使得可以使用迭代器从特定区块号开始查找事件。例如,对于 AccountId 键空间
AccountId/BlockNumber/EventIndex
数据库条目仅包含键。不存储值。每个找到的事件都需要返回区块号和事件索引。这减少了索引数据库的大小,并增加了去中心化。前端可以以去中心化的方式查询链以检索事件。
依赖关系
~20–31MB
~474K SLoC