Sumber Data Dinamis

SubQuery Team약 1 분

Sumber Data Dinamis

Ada kasus di mana Anda tidak mengetahui semua parameter untuk sumber data saat proyek dimulai. Contohnya adalah factory kontrak yang akan membuat instance kontrak baru di kemudian hari. Tidak mungkin untuk mengetahui apa alamat kontrak untuk ini sebelumnya. Di sinilah kemampuan untuk membuat sumber data baru secara dinamis masuk.

Templates dasar

Untuk menggunakan sumber data dinamis, Anda harus memiliki versi spesifikasi setidaknya 0.2.1. Jika Anda menggunakan 0.2.0 yang perlu Anda lakukan hanyalah mengubah specVersion. Jika Anda menggunakan versi yang lebih rendah maka Anda harus memperbarui ke 0.2.0 terlebih dahulu dengan subql migration.

Versi spesifikasi 0.2.1 memperkenalkan bidang templat baru. Template sama dengan sumber data dengan beberapa perbedaan.

  • Mereka membutuhkan name untuk mengidentifikasi template
  • startBlock tidak lagi diperlukan. Ini akan disetel ke blok sumber data dibuat
  • Dalam hal sumber data khusus, bidang processor.options juga dapat diisi sebagian, opsi lainnya akan diberikan saat sumber data dibuat.

Contoh Projek

Cara terbaik untuk menunjukkan cara menggunakan sumber data dinamis adalah dengan sebuah contoh.

Contoh di bawah ini adalah untuk pertukaran terdesentralisasi yang memiliki kontrak pabrik yang menerapkan kontrak baru ketika pasangan perdagangan ditambahkan. Ketika proyek dijalankan, tidak mungkin untuk mengetahui alamat semua kontrak pasangan perdagangan yang telah atau akan dibuat. Sumber data dapat dibuat secara dinamis oleh pengendali pemetaan dari template untuk mengindeks kontrak pasangan perdagangan yang baru dibuat.

project.yaml

specVersion: 0.2.1
name: example-project
version: 1.0.0
description: ''
repository: ''
schema:
  file: ./schema.graphql
network:
  genesisHash: '0x91bc6e169807aaa54802737e1c504b2577d4fafedd5a02c10293b1cd60e39527'
  chaintypes:
    file: "./types.yaml"
dataSources:
  - kind: substrate/Moonbeam
    startBlock: 1358833
    processor:
      file: './node_modules/@subql/contract-processors/dist/moonbeam.js'
      options:
        abi: exchangeFactory
        address: '0x0000000000000000000000000000000000000000'
    assets:
      exchangeFactory:
        file: ./src/exchangeFactory.abi.json
    mapping:
      file: ./dist/index.js
      handlers:
        - handler: handleNewTradingPair
          kind: substrate/MoonbeamEvent
          filter:
            topics:
              - newTradingPair(address exchange, address token1, address token2)

templates:
  - name: TradingPair
    kind: substrate/Moonbeam
    processor:
      file: './node_modules/@subql/contract-processors/dist/moonbeam.js'
      options:
        abi: tradingPair
        # kami tidak tahu alamatnya saat ini, itu akan diberikan saat dipakai
    assets:
      tradingPair:
        file: ./src/tradingPair.abi.json
    mapping:
      file: ./dist/index.js
      handlers:
        - handler: handleLiquidityAdded
          kind: substrate/MoonbeamEvent
          filter:
            topics:
              - liquidityAdded(address provider, uint256 amount1, uint256 amount2)

mappingHandlers.ts

// Fungsi ini didefinisikan menggunakan perintah `subql codegen` cli
import { createTradingPairDatasource } from '../types';
import {MoonbeamEvent} from '@subql/contract-processors/dist/moonbeam';

async function handleNewTradingPair(event: MoonbeamEvent): Promise<void> {
  const { exchange, token1, token2 } = event.args;

  // Buat sumber data baru yang menyediakan alamat kontrak pertukaran pasangan perdagangan
  await createTradingPairDatasource({ address: exchange });
}

async function handleLiquidityAdded(event: MoonbeamEvent): Promise<void> {
  /* mapping fuction implementation here */
}

Melihat Projek Sumber Data Dinamis

Sumber data dinamis disimpan dalam metadata proyek. Jika Anda perlu melihat detail apa yang dapat Anda tanyakan seperti di bawah ini:

{
  _metadata {
    dynamicDatasources
  }
}

Hasil

{
  "data": {
    "_metadata": {
      "dynamicDatasources": "[{\"templateName\":\"TradingPair\",\"args\":{\"address\":\"0x0000000000000000000000000000000000000000\"},\"startBlock\":1358833}]"
    }
  }
}