GraphQL是一种用于API的查询语言,Subgraph是一种使用GraphQL构建的分布式API的方式。在Subgraph中,我们可以定义数据模型和查询方法,并且Subgraph会自动处理数据的存储和访问。在本教程中,我们将学习如何使用Subgraph获取ERC20代币的持有人列表。

  1. 创建Subgraph项目

首先,我们需要创建一个Subgraph项目。我们可以使用Graph CLI工具来创建项目。

graph create <subgraph-name>

例如:

graph create demo-subgraph
  1. 定义数据模型

在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会自动处理这个字段的查询。

  1. 定义查询方法

在Subgraph中,我们可以定义查询方法来获取数据。查询方法的方式也是编写GraphQL schema。我们将定义一个getHodlers查询方法来获取ERC20代币的持有人列表。

在schema.graphql文件中添加以下查询方法:

type Query {
  getHodlers(token: String!, first: Int!, skip: Int!): [Address!]!
}

这个查询方法接受三个参数:token、first和skip。token参数是代币的符号,first参数是要查询的第一个结果的数量,skip参数是要跳过的结果数量。我们将使用这些参数来实现分页查询。

  1. 实现查询方法

现在我们需要实现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实体,这些实体是我们在数据模型中定义的。

  1. 部署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节点上。

  1. 使用查询方法

现在我们可以使用getHodlers查询方法来获取ERC20代币的持有人列表。

在Subgraph Explorer中打开我们刚刚部署的Subgraph项目。在左侧的菜单中选择GraphiQL选项卡,这将打开GraphiQL查询编辑器。

在编辑器中编写以下查询:

{
  getHodlers(token: "DAI", first: 10, skip: 0) {
    id
  }
}

这个查询将获取DAI代币的前10个持有人的地址。

点击运行按钮,你应该可以看到查询结果,其中包含10个持有人的地址。

这就是使用Subgraph获取ERC20代币的持有人列表的方法。Subgraph可以帮助我们快速构建分布式API,让我们专注于查询方法的实现,而无需处理数据存储和访问

graphql subgraph getHodlers 教程

原文地址: https://www.cveoy.top/t/topic/fq7v 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录