子流 > Substreams-powered Subgraphs
4 分钟
教程:在Solana上设置基于Substreams的子图
已成功为Solana SPL代币设置基于触发器的Substreams驱动子图。
开始
有关视频教程,请查看如何使用Substreams驱动的子图对Solana进行索引
先决条件
开始之前,请确保:
- 完成入门指南使用Dev容器设置开发环境。
- 熟悉The Graph和基本的区块链概念,如交易和Protobuf。
步骤1:初始化您的项目
-
打开Dev容器并运行以下命令以初始化项目:
1substreams init
-
选择“最小”项目选项。
-
将生成的
substreams.yaml
文件的内容替换为以下配置,该配置过滤SPL代币程序ID上Orca帐户的交易:
1specVersion: v0.1.02package:3 name: my_project_sol4 version: v0.1.056imports: # Pass your spkg of interest7 solana: https://github.com/streamingfast/substreams-solana-spl-token/raw/master/tokens/solana-spl-token-v0.1.0.spkg89modules:10 - name: map_spl_transfers11 use: solana:map_block # Select corresponding modules available within your spkg12 initialBlock: 2600000821314 - name: map_transactions_by_programid15 use: solana:solana:transactions_by_programid_without_votes1617network: solana-mainnet-beta1819params: # Modify the param fields to meet your needs20 # For program_id: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA21 map_spl_transfers: token_contract:orcaEKTdK7LKz57vaAYr9QeNsVEPfiu6QeMU1kektZE
步骤2:生成子图清单
项目初始化后,通过在Dev容器中运行以下命令生成子图清单:
1substreams codegen subgraph
您将生成asubgraph.yaml
清单,该清单将Substreams包作为数据源导入:
1---2dataSources:3 - kind: substreams4 name: my_project_sol5 network: solana-mainnet-beta6 source:7 package:8 moduleName: map_spl_transfers # Module defined in the substreams.yaml9 file: ./my-project-sol-v0.1.0.spkg10 mapping:11 apiVersion: 0.0.912 kind: substreams/graph-entities13 file: ./src/mappings.ts14 handler: handleTriggers
步骤3:在schema.graphql
中定义实体
通过更新schema.graphql
文件来定义要保存在子图实体中的字段。
以下是一个示例:
1type MyTransfer @entity {2 id: ID!3 amount: String!4 source: String!5 designation: String!6 signers: [String!]!7}
此模式定义了一个名为MyTransfer
的实体,其字段包括 id
, amount
, source
, designation
, 和signers
。
步骤4:在mappings.ts
中处理Substreams数据
生成Protobuf对象后,您现在可以在./src
目录里找到的mappings.ts
文件中处理解码的Substreams数据。
下面的示例演示了如何将与Orca帐户id关联的非派生传输提取到子图实体中:
1import { Protobuf } from 'as-proto/assembly'2import { Events as protoEvents } from './pb/sf/solana/spl/token/v1/Events'3import { MyTransfer } from '../generated/schema'45export function handleTriggers(bytes: Uint8Array): void {6 const input: protoEvents = Protobuf.decode<protoEvents>(bytes, protoEvents.decode)78 for (let i = 0; i < input.data.length; i++) {9 const event = input.data[i]1011 if (event.transfer != null) {12 let entity_id: string = `${event.txnId}-${i}`13 const entity = new MyTransfer(entity_id)14 entity.amount = event.transfer!.instruction!.amount.toString()15 entity.source = event.transfer!.accounts!.source16 entity.designation = event.transfer!.accounts!.destination1718 if (event.transfer!.accounts!.signer!.single != null) {19 entity.signers = [event.transfer!.accounts!.signer!.single!.signer]20 } else if (event.transfer!.accounts!.signer!.multisig != null) {21 entity.signers = event.transfer!.accounts!.signer!.multisig!.signers22 }23 entity.save()24 }25 }26}
步骤5:生成Protobuf文件
要在AssemblyScript中生成Protobuf对象,请运行以下命令:
1npm run protogen
此命令将Protobuf定义转换为AssemblyScript,允许您在子图的处理程序中使用它们。
结论
恭喜!您已成功为Solana SPL代币设置了基于触发器的Substreams驱动子图。现在,您可以进一步定制您的模式、映射和模块,以适应您的特定用例。
视频教程
其他资源
如需更高级的定制和优化,请查看官方Substreams文档。