SubQuery 由 OnFinality 团队构建,允许用户在整个链中运行索引器来构建可通过 GraphQL 查询的数据集。该工具套件包括一个命令行界面,该命令行界面使项目可以生成自己的 SubQuery 项目,从而定义索引器应如何遍历和聚合自己的网络。
SubQuery 节点程序包将为网络建立索引并支持 GraphQL 查询。借助这些工具,任何人都可以轻松创建和运行查询。其目标是成为 Substrate / Polkadot 生态系统的核心基础架构。
OneBlock+ 与 SubQuery 在2021的最后一个月共同推出了「SubQuery 入门——轻松学会区块链数据索引开发」课程,已于2022年1月10日开课。通过课程 6 大模块的讲解,让你熟悉掌握如何将你的区块链项目建立 SubQuery 数据源从而进行链上数据索引,包括开发复杂的 SubQuery 项目和将其部署到 SubQuery 项目托管中。
以下是第三课的课程回顾:
本节课程内容
-
-
介绍 polkadot-js 调取 event/extrinsic 方法,以及类型处理
-
映射(mapping)之 区块处理block handler
-
映射(mapping) 之 事件处理event handler
-
字典的使用
-
-
-
-
映射(mapping) 之 外部信息处理call handler
-
-
SubQuery 映射
定义爬取数据方式,可以对爬取的数据进行过滤
入口在:配置文件project.yaml中dataSources域,如下
1. 默认substrate/Runtime类型支持如下映射处理器和过滤器
映射处理器说明:
-
BlockHandler,mapping函数中使用入参限制接收区块类型,会为结果集中每一个区块触发调用一次,可以获取区块信息。
-
EventHandler,mapping函数中使用入参限制接收事件类型中,会为结果集中任何类型的事件触发一次调用,可以使用过滤器来过滤事件,缩短数据建立索引的时间和提升映射性能。
-
CallHandler,mapping函数中使用入参限制接收extrinsic,会为结果集中任何extrinsic触发一次调用,可以使用过滤来缩短数据建立索引的时间和提升映射性能,extrinsic可能包含批次处理或间接触发,导致相关mapping函数产生多层递归等比较复杂,如果能通过EventHandler解决尽量不要使用CallHandler。
过滤器说明:
-
module和method过滤器支持所有基于substrate的平行链。
-
success过滤器,根据extrinsic是否成功进行过滤。
-
specVersion过滤器,指定版本范围,specVersion:[23,24],表示23<=specVersion<24;specVersion:[23],表示23<=specVersion;可以同时支持多个 specVersion,比如:
2. 自定义链 Substrate/CustomDataSource
后面课程会有专门介绍
3. 通过转账的例子介绍 SubQuery
SubQuery 利用 Polkadot API 获取历史高度数据,封装后,使用简单了很多,且可以过滤处理数据。
3.1 使用 Polkadot API 手动获取数据(transfer)步骤如下:
3.1.1 启动 node,允许使用异步方法
-
node --experimental-repl-await
3.1.2 启动 polkadot api
1).const { ApiPromise, WsProvider } = require(`@polkadot/api`)
2).const provider = new WsProvider
3).api = await ApiPromise.create({ provider })
3.1.3 获取区块哈希
-
const blockHash = await api.rpc.chain.getBlockHash(8021952)
3.1.4 获取此高度 events
1). const apiAt = await api.at(blockHash) 代表这我们的api将返回此高度的数据
2). const events = await apiAt.query.system.events()
3). 查看所有events.toHuman(), 变成友好的可读的数据
3.1.5 查看 transfer event
1). const transferEvent = events[4]
2). transferEvent.event.toHuman() 检查的event 类型和数据。
3). transferEvent.event.meta.toHuman()
3.2. 使用 subquery 获取数据(transfer)
schema.graphql
执行 yarn codegen 在 models 中生成相对应的类
3.2.1. 使用 EventHandler
project.yaml
src/mappings/mappingHandlers.ts
3.2.2. 使用 Call Handler
需要覆盖所有业务 extrinsic
project.yaml
src/mappings/mappingHandlers.ts
4. EventHandler VS CallHandler
1). 只需关注特定的 event 类型,数据格式稳定
2). 需要覆盖触发 event 的所有 extrinsic,数据格式不统一,可能会跟 runtime 升级发生变化
3). 不能够保证 utility 模块中包括了 transfer 类型的extrinsics,间接触发和批次触发
4). 谨慎处理多层递归