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

SubQuery中文站
个人专栏
热度: 30291

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

br

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域,如下

br

详情可以参考

  • https://doc.subquery.network/zh/create/manifest/#%E6%98%A0%E5%B0%84%E5%A4%84%E7%90%86%E5%99%A8%E5%92%8C%E8%BF%87%E6%BB%A4%E5%99%A8
  • https://doc.subquery.network/zh/create/mapping/#



1. 默认substrate/Runtime类型支持如下映射处理器和过滤器



br

映射处理器说明:


  • 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,比如:

br

   



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(`wss://polkadot.api.onfinality.io/public-ws`)

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


br

执行 yarn codegen 在 models 中生成相对应的类


3.2.1. 使用 EventHandler


project.yaml


br

src/mappings/mappingHandlers.ts



br


yarn build编译项目

subql-node -f . 启动项目

在project.yaml使用network->dictionary: ‘https://api.subquery.network/sq/subquery/dictionary-polkadot’加快索引速度。


3.2.2. 使用 Call Handler


需要覆盖所有业务 extrinsic

project.yaml


br



src/mappings/mappingHandlers.ts

br




4. EventHandler VS CallHandler


1). 只需关注特定的 event 类型,数据格式稳定

2). 需要覆盖触发 event 的所有 extrinsic,数据格式不统一,可能会跟 runtime 升级发生变化

3). 不能够保证 utility 模块中包括了 transfer 类型的extrinsics,间接触发和批次触发

4). 谨慎处理多层递归




相关资料



  • 第三课课程视频 
  • https://jhp.h5.xeknow.com/s/J4H11
  • 第三课课程作业 
  • https://wj.qq.com/s2/9438994/7822
  • [SubQuery清单文件] https://doc.subquery.network/create/manifest/
  • [映射处理器和过滤器]
  • https://doc.subquery.network/zh/create/manifest/#%E6%98%A0%E5%B0%84%E5%A4%84%E7%90%86%E5%99%A8%E5%92%8C%E8%BF%87%E6%BB%A4%E5%99%A8
  • https://doc.subquery.network/zh/create/mapping/#


声明:本文为入驻“MarsBit 专栏”作者作品,不代表MarsBit官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
免责声明:本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况,及遵守所在国家和地区的相关法律法规。