Джерела динамічних даних

... 2022-8-15 Менше 1 хвилини

# Джерела динамічних даних

Існують випадки, коли ви не знаєте всіх параметрів для джерела даних під час запуску проекту. Приклад цього - контрагентний завод, який створить нові випадки контрактів у більш пізній даті. Неможливо знати, якими будуть контрактні адреси, протягом цього часу. Тут і виникають нові джерела даних, які динамічно надходять.

# Поле шаблонів

Для використання динамічних джерел даних вам необхідно мати версію специфікації принаймні 0.2.1. Якщо ви використовуєте 0.2.0 все, що вам потрібно - це змінити версію. Якщо у вас встановлена нижча версія, слід спочатку оновити 0.2.0 на початку subql migrate.

Версія Spec 0.2.1 представляє нове поле шаблонів. Шаблони є такими ж, як джерела даних з кількома відмінностями.

  • Їм потрібне ім'я для того, щоб визначити шаблон
  • стартовий блок більше не є необхідним. Це буде встановлено в блоці, з якого створено джерело даних
  • У разі джерела даних користувачем процесор. ptions поле також може бути частково заповнене варіантами, інші параметри будуть надані коли джерело даних встановлено.

# Приклади проектів

Найкращий спосіб показати, як використовувати динамічні джерела даних є приклад.

Наведеним прикладом є децентралізований обмін, у якому є заводський контракт, який розгортає новий контракт коли додаються торгівельні пари. Коли проект запущено, неможливо знати адреси всіх пов'язаних з ним пар контрактів, які були створені або будуть створені. Джерела даних можуть бути динамічно створені обробником даних з шаблону, щоб індексувати нещодавно створені торгові контракти.

# 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
        # we do not know the address at this point, it will be provided when instantiated
    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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

# mappingHandlers.ts

// This function is defined using `subql codegen` cli command
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;

  // Create a new datasource providing the address of the trading pair exchange contract
  await createTradingPairDatasource({ address: exchange });
}

async function handleLiquidityAdded(event: MoonbeamEvent): Promise<void> {
  /* mapping fuction implementation here */
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# Перевірка динамічних даних проектів

Динамічні джерела даних зберігаються в метаданих проекту. Якщо вам потрібно дізнатися, які деталі, ви можете подати запит нижче:

{
  _metadata {
    dynamicDatasources
  }
}
1
2
3
4
5

Результат

{
  "data": {
    "_metadata": {
      "dynamicDatasources": "[{\"templateName\":\"TradingPair\",\"args\":{\"address\":\"0x0000000000000000000000000000000000000000\"},\"startBlock\":1358833}]"
    }
  }
}
1
2
3
4
5
6
7
Останнє оновлення: August 15, 2022 23:43