Graph开发和部署学习教程 (二)

接上一篇 Graph开发和部署学习教程 (一)

项目结构

cd FriendtechGraph
tree -L 1

├── abis
├── generated
├── networks.json
├── node_modules
├── package.json
├── schema.graphql
├── src
├── subgraph.yaml
├── tests
├── tsconfig.json
└── yarn.lock

schema.graphql:定义Graph实体,可以理解为web2中的模型。
subgraph.yaml:子图清单,定义了子图索引的智能合约,这些合约中需要关注的事件,以及如何将事件数据映射到 Graph 节点存储并允许查询的实体。
generated目录:生成的 AssemblyScript 类型,可以理解为模型的curd函数。
src目录:业务逻辑代码。
schema.graphql
定义需要索引的数据实体,以及实体之间的关系;详细可参考: Graph模式

type OwnershipTransferred @entity(immutable: true) {
    
                                                                                                         
  id: Bytes!                                                                       
  previousOwner: Bytes! # address                                                  
  newOwner: Bytes! # address                                                    
  blockNumber: BigInt!                                                          
  blockTimestamp: BigInt!                                                       
  transactionHash: Bytes!                                                       
}                                                                               
                                                                                
type Trade @entity(immutable: true) {
    
                                               
  id: Bytes!                                                                    
  trader: Bytes! # address                                                      
  subject: Bytes! # address                                                     
  isBuy: Boolean! # bool                                                        
  shareAmount: BigInt! # uint256                                                
  ethAmount: BigInt! # uint256                                                  
  protocolEthAmount: BigInt! # uint256                                          
  subjectEthAmount: BigInt! # uint256                                           
  supply: BigInt! # uint256                                                     
  blockNumber: BigInt!                                                          
  blockTimestamp: BigInt!                                                       
  transactionHash: Bytes!                                                       
}

src/subgraph.yaml
从区块链事件中索引数据的具体逻辑, handleTrade 函数会在每次 Trade 事件触发时被调用,然后获取到链上数据存储到子图中。

import {
    
                                                                            
  OwnershipTransferred as OwnershipTransferredEvent,                            
  Trade as TradeEvent                                                           
} from "../generated/FriendtechSharesV1/FriendtechSharesV1"                     
import {
    
     OwnershipTransferred, Trade } from "../generated/schema"               
                                                                                
export function handleOwnershipTransferred(                                     
  event: OwnershipTransferredEvent                                              
): void {
    
                                                                           
  let entity = new OwnershipTransferred(                                        
    event.transaction.hash.concatI32(event.logIndex.toI32())                    
  )                                                                             
  entity.previousOwner = event.params.previousOwner                             
  entity.newOwner = event.params.newOwner                                       
                                                                                
  entity.blockNumber = event.block.number                                       
  entity.blockTimestamp = event.block.timestamp                                 
  entity.transactionHash = event.transaction.hash                               
                                                                                
  entity.save()                                                                 
}                                                                               
                                                                                
export function handleTrade(event: TradeEvent): void {
    
                              
  let entity = new Trade(                                                       
    event.transaction.hash.concatI32(event.logIndex.toI32())                    
  )                                                                             
  entity.trader = event.params.trader                                           
  entity.subject = event.params.subject                                         
  entity.isBuy = event.params.isBuy                                             
  entity.shareAmount = event.params.shareAmount                                 
  entity.ethAmount = event.params.ethAmount                                     
  entity.protocolEthAmount = event.params.protocolEthAmount                     
  entity.subjectEthAmount = event.params.subjectEthAmount                       
  entity.supply = event.params.supply                                           
                                                                                
  entity.blockNumber = event.block.number                                       
  entity.blockTimestamp = event.block.timestamp                                 
  entity.transactionHash = event.transaction.hash                               
                                                                                
  entity.save()                                                                 
}

猜你喜欢

转载自blog.csdn.net/Tesla_Zhou/article/details/135196182