详细文档:https://thegraph.academy/developers/defining-a-subgraph/
如上链接是子图详细的开发流程,我自己在开发过程中,用了其中的部分步骤。
1. 安装Graph CLI
两种方式任选其一
# NPM
npm install -g @graphprotocol/graph-cli
# Yarn
yarn global add @graphprotocol/graph-cli
2. 创建subgraph项目
根据已有的合约,创建subgraph项目:
graph init \
--from-contract <CONTRACT_ADDRESS> \
[--network <ETHEREUM_NETWORK>] \
[--abi <FILE>] \
<SUBGRAPH_NAME> [<DIRECTORY>]
graph init --product subgraph-studio --from-contract 0x00000000 example-subgraph ./example-subgraph --abi /xx/xx.json
CONTRACT_ADDRESS:合约地址
ETHEREUM_NETWORK:网络
FILE:abi文件
SUBGRAPH_NAME:subgraph项目名称
DIRECTORY:subgraph项目路径
3. subgraph项目简介
- subgraph.yaml
项目的配置,会根据abi自动生成。下面介绍一些重要配置的含义:
dataSources.source.address: 定义subgraph监听的合约地址
dataSources.source.startBlock: 定义数据从哪个区块开始,建议设置为合约创建地址
dataSources.mapping.entities: 定义存储的数据实体
dataSources.mapping.abis: 合约abi文件的路径
dataSources.mapping.eventHandlers: 定义event监听
dataSources.mapping.callHandlers: 方法调用监听
dataSources.mapping.blockHandlers: 区块监听
- schema.graphql
定义数据如何存储和搜索,可以理解为表结构。
- AssemblyScript Mappings
将
event
数据转化为entity
的代码,可以理解为一段保存数据的代码。
4. 定义Entity
在schema.graphql
文件定义Entity结构,将数据保存为自己想要的结构。
type Gravatar @entity {
id: ID!
owner: Bytes!
displayName: String!
imageUrl: String!
}
修改后,可运行以下命令,自动生成相关代码。
yarn graph codegen
5. 实现AssemblyScript Mappings
在src目录下的文件,写自己期望的保存代码。
import { NewGravatar, UpdatedGravatar } from '../generated/Gravity/Gravity'
import { Gravatar } from '../generated/schema'
export function handleNewGravatar(event: NewGravatar): void {
let gravatar = new Gravatar(event.params.id.toHex())
gravatar.owner = event.params.owner
gravatar.displayName = event.params.displayName
gravatar.imageUrl = event.params.imageUrl
gravatar.save()
}
export function handleUpdatedGravatar(event: UpdatedGravatar): void {
let id = event.params.id.toHex()
let gravatar = Gravatar.load(id)
if (gravatar == null) {
gravatar = new Gravatar(id)
}
gravatar.owner = event.params.owner
gravatar.displayName = event.params.displayName
gravatar.imageUrl = event.params.imageUrl
gravatar.save()
}
6. 部署subgraph
检查代码是否编译通过:
yarn build
创建subgraph:
yarn create
部署subgraph:
yarn deploy