SubQuery 入门开发 | 第三课:SubQuery 映射之事件和外部信息处理

IP归属:

SubQuery 由 OnFinality 团队构建,允许用户在整个链中运行索引器来构建可通过 GraphQL 查询的数据集。该工具套件包括一个命令行界面,该命令行界面使项目可以生成自己的 SubQuery 项目,从而定义索引器应如何遍历和聚合自己的网络。

SubQuery 节点程序包将为网络建立索引并支持 GraphQL 查询。借助这些工具,任何人都可以轻松创建和运行查询。其目标是成为 Substrate / Polkadot 生态系统的核心基础架构。

OneBlock+ 与 SubQuery 在2021的最后一个月共同推出了「SubQuery 入门——轻松学会区块链数据索引开发」课程,已于2022年1月10日开课。通过课程 6 大模块的讲解,让你熟悉掌握如何将你的区块链项目建立 SubQuery 数据源从而进行链上数据索引,包括开发复杂的 SubQuery 项目和将其部署到 SubQuery 项目托管中。

以下是第三课的课程回顾:

本节课程内容

    1. 介绍 polkadot-js 调取 event/extrinsic 方法,以及类型处理

    2. 映射(mapping)之 区块处理block handler

    3. 映射(mapping) 之 事件处理event handler

    4. 字典的使用

      • 映射(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). 谨慎处理多层递归

本文来源:陀螺科技 文章作者:SubQuery中文站
收藏
举报
SubQuery中文站
累计发布内容11篇 累计总热度10万+

陀螺科技现已开放专栏入驻,详情请见入驻指南: https://www.tuoluo.cn/article/detail-27547.html

SubQuery中文站专栏: https://www.tuoluo.cn/columns/author1831815/

本文网址: https://www.tuoluo.cn/article/detail-10094801.html

免责声明:
1、本文版权归原作者所有,仅代表作者本人观点,不代表陀螺科技观点或立场。
2、如发现文章、图片等侵权行为,侵权责任将由作者本人承担。

相关文章