Джерела динамічних даних
# Джерела динамічних даних
Існують випадки, коли ви не знаєте всіх параметрів для джерела даних під час запуску проекту. Приклад цього - контрагентний завод, який створить нові випадки контрактів у більш пізній даті. Неможливо знати, якими будуть контрактні адреси, протягом цього часу. Тут і виникають нові джерела даних, які динамічно надходять.
# Поле шаблонів
Для використання динамічних джерел даних вам необхідно мати версію специфікації принаймні 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)
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 */
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# Перевірка динамічних даних проектів
Динамічні джерела даних зберігаються в метаданих проекту. Якщо вам потрібно дізнатися, які деталі, ви можете подати запит нижче:
{
_metadata {
dynamicDatasources
}
}
2
3
4
5
Результат
{
"data": {
"_metadata": {
"dynamicDatasources": "[{\"templateName\":\"TradingPair\",\"args\":{\"address\":\"0x0000000000000000000000000000000000000000\"},\"startBlock\":1358833}]"
}
}
}
2
3
4
5
6
7