subgraph 是什么
subgraph 索引协议作为 Dapp 领域最重要的基建之一(如 uniswap、wave 等都在使用),主要用来做链上数据索引,即在链下对链上事件进行捕捉(扫链、计算、存储),然后可对存储下来的数据进行相关读操作,其关键总结为三点:
- 通过链下监听事件,逻辑处理,然后存储到数据库中,供前端调用;
- 常用于统计历史信息及变化,仅做展示相关,可以节约链上存储成本,且响应更快;
- 请求 subgraph 时使用专门的 graphql 语言,而非 sql;
原理
- 用户从合约侧发起交易;
- 合约发送事件;
- 由 subgraph 监听到该事件,并在内部执行逻辑(根据实际业务需求自定义),处理后入库;
- 用户(前端)从 subgraph 的数据库中读取数据,完成展示;
使用方式
- the graph 官方提供的去中心化网络:subgraph studio(需要 token 支持,请自行尝试)
- 也可搭建本地 graph node,先下载其环境到本地:
git clone https://github.com/graphprotocol/graph-node/
这里对 graph node 与 subgraph 关系进行说明,在 graph node 上可以部署多个 subgraph,每个 subgraph 可以服务多个不同的项目。
创建 subgraph
// 安装 subgraph
npm install -g @graphprotocol/graph-cli
// 初始化
graph init
具体选项跟随引导程序填写,选择:网络 -> 名称 -> 合约地址 -> 合约名字,引导程序会自动在网络上拉取 ABI(前提是我们 verify 了,否则需要自己填写)
subgraph 项目结构
配置修改
增加扫块起点 startBlock 为当前合约所部署的块,如果不增加,则从最初块开始扫,效率低