graphql subgraph getHodlers 教程
GraphQL是一种用于API的查询语言,Subgraph是一种使用GraphQL构建的分布式API的方式。在Subgraph中,我们可以定义数据模型和查询方法,并且Subgraph会自动处理数据的存储和访问。在本教程中,我们将学习如何使用Subgraph获取ERC20代币的持有人列表。
- 创建Subgraph项目
首先,我们需要创建一个Subgraph项目。我们可以使用Graph CLI工具来创建项目。
graph create <subgraph-name>
例如:
graph create demo-subgraph
- 定义数据模型
在Subgraph中,我们需要定义数据模型。我们将使用ERC20代币的标准数据模型,其中包含代币的符号、名称、总供应量和持有人地址。
定义数据模型的方式是编写GraphQL schema。在Subgraph项目中,我们可以在schema.graphql文件中定义数据模型。以下是ERC20代币的数据模型:
type Token @entity {
id: ID!
symbol: String!
name: String!
totalSupply: BigInt!
holders: [Address!]! @derivedFrom(field: "token")
}
type Address @entity {
id: ID!
holdings: [TokenHolding!]!
}
type TokenHolding @entity {
id: ID!
token: Token!
address: Address!
balance: BigInt!
}
在这个数据模型中,我们定义了三个实体类型:Token、Address和TokenHolding。Token实体表示代币本身,Address实体表示代币的持有人地址,TokenHolding实体表示持有人的代币余额。我们使用@entity指令告诉Subgraph,这些类型是实体类型,需要进行数据存储和查询。
我们在Token类型中定义了一个holders字段,这个字段是一个Address类型的数组,表示持有该代币的地址列表。我们使用@derivedFrom指令告诉Subgraph,这个字段是从TokenHolding实体中派生出来的,Subgraph会自动处理这个字段的查询。
- 定义查询方法
在Subgraph中,我们可以定义查询方法来获取数据。查询方法的方式也是编写GraphQL schema。我们将定义一个getHodlers查询方法来获取ERC20代币的持有人列表。
在schema.graphql文件中添加以下查询方法:
type Query {
getHodlers(token: String!, first: Int!, skip: Int!): [Address!]!
}
这个查询方法接受三个参数:token、first和skip。token参数是代币的符号,first参数是要查询的第一个结果的数量,skip参数是要跳过的结果数量。我们将使用这些参数来实现分页查询。
- 实现查询方法
现在我们需要实现getHodlers查询方法。在Subgraph中,我们可以使用AssemblyScript编写查询方法的实现。AssemblyScript是一种与TypeScript类似的语言,可以编译为WebAssembly代码,可以在Subgraph中运行。
在Subgraph项目中创建一个src目录,并在其中创建一个assembly文件夹。在assembly文件夹中创建一个文件getHodlers.ts,这个文件将包含getHodlers查询方法的实现。
在getHodlers.ts文件中添加以下代码:
import { Address, BigInt } from "@graphprotocol/graph-ts";
import { Token, TokenHolding } from "../generated/schema";
export function getHodlers(token: String, first: i32, skip: i32): Address[] {
let tokenEntity = Token.load(token); // 获取代币实体
let holdings = TokenHolding.query()
.filter("token", token)
.orderBy("balance", "desc")
.skip(skip)
.take(first)
.find(); // 查询代币持有人列表
let hodlers: Address[] = [];
for (let i = 0; i < holdings.length; i++) {
let holding = holdings[i];
let address = Address.fromString(holding.address);
hodlers.push(address);
}
return hodlers;
}
这个查询方法首先获取代币实体,然后查询代币持有人列表,并返回持有人地址的数组。我们使用了@graphprotocol/graph-ts模块中的Address和BigInt类型,这些类型是用于Subgraph项目中的类型。我们还使用了Token和TokenHolding实体,这些实体是我们在数据模型中定义的。
- 部署Subgraph项目
现在我们需要将Subgraph项目部署到Subgraph节点上。我们可以使用Graph CLI工具来部署项目。
在Subgraph项目目录中运行以下命令:
graph deploy --node https://api.thegraph.com/deploy/ --ipfs https://api.thegraph.com/ipfs/ <subgraph-name>
例如:
graph deploy --node https://api.thegraph.com/deploy/ --ipfs https://api.thegraph.com/ipfs/ demo-subgraph
这个命令将会编译Subgraph项目,并将Subgraph部署到Subgraph节点上。
- 使用查询方法
现在我们可以使用getHodlers查询方法来获取ERC20代币的持有人列表。
在Subgraph Explorer中打开我们刚刚部署的Subgraph项目。在左侧的菜单中选择GraphiQL选项卡,这将打开GraphiQL查询编辑器。
在编辑器中编写以下查询:
{
getHodlers(token: "DAI", first: 10, skip: 0) {
id
}
}
这个查询将获取DAI代币的前10个持有人的地址。
点击运行按钮,你应该可以看到查询结果,其中包含10个持有人的地址。
这就是使用Subgraph获取ERC20代币的持有人列表的方法。Subgraph可以帮助我们快速构建分布式API,让我们专注于查询方法的实现,而无需处理数据存储和访问
原文地址: https://www.cveoy.top/t/topic/fq7v 著作权归作者所有。请勿转载和采集!