yaml 定義

subgraph.yaml 上面定義了 subgraph index 最基礎的架構,包含要索引的網路名稱、開始索引的區塊高度、schema 檔案路徑、索引的合約地址、索引的事件名稱與對應的處理邏輯檔案位置等等。

執行 npx graph deploy 後他首先去找到 subgraph.yaml 檔案,才開始執行索引相關邏輯。

一個範例的 subgraph.yaml 應該放置在項目根路徑下,如下範例結構:

specVersion: 0.0.4
description: test
repository: https://github.com/graphprotocol/example-subgraph
schema:
  file: ./schema.graphql
dataSources:
  - kind: ethereum/contract
    name: Apple
    network: mainnet
    source:
      address: '0x2E6454222354BB4F5c8a05B3b30A929361cf77eC'
      abi: Apple
      startBlock: 222
    mapping:
      kind: ethereum/events
      apiVersion: 0.0.6
      language: wasm/assemblyscript
      entities:
        - Apple
      abis:
        - name: Apple
          file: ./abis/Apple.json
      eventHandlers:
        - event: NewApple(uint256,address,string,string)
          handler: handleNewApple
        - event: UpdatedApple(uint256,address,string,string)
          handler: handleUpdatedApple
      callHandlers:
        - function: createApple(string,string)
          handler: handleCreateApple
      blockHandlers:
        - handler: handleBlock
        - handler: handleBlockWithCall
          filter:
            kind: call
      file: ./src/mapping.ts

我們主要需要修改的欄位有 address, startBlock, entities, abis, eventHandlers, file。

  • address: 索引合約地址,可以不填入,例如 ERC721 合約(要索引多個合約從 -kind 整個欄位繼續往下增加即可)

  • startBlock: 開始索引的區塊高度

  • entities: 的話於 schema 章節會詳細講到

  • abis: 索引合約的 abi

  • eventHandlers: 使用 event 來索引

  • file: 對應的 mapping 邏輯檔案位置

而一般都會使用 eventHandlers 來處理索引,任何有 emit 事件的 solidity function 都可以使用此種方式索引,而 callHandlers 需要節點支持 trace_route api 才能(例如 parity client),而 blockHandlers 會對每個新區塊進行索引,所能拿到的資料主要只有 block id 而已。

ERC721 subgraph: https://github.com/wighawag/eip721-subgraph/blob/master/subgraph.yaml

https://thegraph.com/docs/en/developer/create-subgraph-hosted/#block-handlers

Last updated