January 26, 2022

Руководство по 6 Модулю SubQuery Hero (перевод)

Оглавление

Содержание:
Блокировать v События v Звонки
Использование словаря
События и внешние имена
Документация Polkadot
Проводник в горошек
API интерфейса командной строки Polkadot
Подключение к API
Получение блока
Получение внешних элементов внутри блока
Получение событий на определенной высоте блока
Введите безопасные свойства
Логирование
Отладка
Изменение размера пакетного блока
Смена стартового блока

Введение

В этих упражнениях мы узнаем, что такое SubQuery Project, как развернуть проект в SubQuery Project и узнаем о SubQuery Explorer.

Блокировать v События v Звонки

Чтобы проект SubQuery обрабатывал и индексировал данные как можно быстрее и эффективнее, необходимо понимать, как все работает внутри. SubQuery имеет три обработчика для обработки данных блокчейна. Они есть обработчики блоков , обработчики событий , и обработчики вызовов.

Обработчики блоков очень неэффективны. Они проверяют каждый блок, чтобы получить данные для индексации.
Это означает, что с более чем семью миллионами блоков, если каждый блок можно проиндексировать за 10 мс, для полной индексации блокчейна потребуется более восьми (8) дней. Поэтому рекомендуется по возможности избегать использования обработчиков блоков.

Обработчики событий и вызовов являются рекомендуемыми обработчиками для использования, конечно, в сочетании с фильтрами сопоставления, поскольку производительность намного выше. Фильтр сопоставления позволяет проекту
индексировать только те блоки, которые удовлетворяют критериям фильтра. Например, ниже показан фильтр, индексирующий staking модуль и Rewarded метод.

- handler: myCustomHandle
kind: substrate/EventHandler
filter:
  module: staking
  method: Rewarded

Для еще большего повышения производительности также настоятельно рекомендуется использовать словарь.

Использование словаря

Концепция словаря была представлена в предыдущих модулях (например, в модуле 5 «Переопределение конечных точек»), но снова упоминается здесь из-за ее важности.
Понимание того, как работает словарь

События и внешние имена

Популярный вопрос при создании проектов SubQuery: как мне узнать, какие данные я могу извлечь из блокчейна Polkadot? Есть несколько вариантов:
1. Полкадот-документация
2. Обозреватель блокчейна Polkadot
3. Прямое взаимодействие с API Polkadot.

Примечание. Эти параметры также могут применяться к другим блокчейнам.

Документация Полкадот

Документацию Polkadot можно найти по адресу: https://polkadot.js.org/docs/

Более конкретно:
● События: https://polkadot.js.org/docs/substrate/events/
● Внешние элементы: https://polkadot.js.org/docs/substrate/extrinsics/

Проводник Polkadot

Обозреватель блокчейна Polkadot также является отличным местом для ознакомления с доступной для извлечения информацией. Есть несколько вариантов на выбор:
https://polkadot.js.org/apps/#explorer
https://polkadot.subscan.io/
https://polkascan.io/polkadot
https://dotscanner.com/polkadot/search
https://polkastats.io/

Обратите внимание, что не все обозреватели одинаковы, и некоторые из них могут быть проще в использовании, а некоторые представляют нужные вам данные более четким образом. Со временем у вас появится несколько фаворитов.

Polkadot API

Предыдущие два метода понимания того, какие данные блокчейна доступны, а также тип (что не менее важно) — это здорово, но научиться напрямую подключаться к Polkadot API через командную строку дает несколько преимуществ.

Во-первых, он обеспечивает доступ к самым последним спецификациям API, поскольку документация может быть немного устаревшей. Во-вторых, это позволяет разработчикам понимать точные аргументы и их типы. Это особенно важно, когда есть проблемы и требуется отладка. И, наконец, это очень полезно при интеграции с пользовательскими цепочками, где иногда недоступна документация.

Подключение к API
Чтобы подключиться к API, выполните следующее:

npm install --save @polkadot/api

node --experimental-repl-await
const { ApiPromise, WsProvider } = require(`@polkadot/api`)
const provider = new
WsProvider(`wss://polkadot.api.onfinality.io/public-ws`);

Если требуются пользовательские типы цепей:

const types={}


Если нужны типы:

api = await ApiPromise.create({ provider, types});


Без типов:

api = await ApiPromise.create({ provider });


Получение блока
Чтобы получить хэш блока на высоте `h` , мы можем получить run const blockHash = await api.rpc.chain.getBlockHash(h)

const blockHash = await api.rpc.chain.getBlockHash(1234567)

Потом:

const block = await api.rpc.chain.getBlock(blockHash)


Получение внешних элементов внутри блока
Чтобы получить все внешние данные:

const extrinsics = block.block.extrinsics;


Для определенного внешнего элемента: (измените 1 на желаемый внешний номер)

const myExtrinsic = extrinsic[1];


Чтобы проверить типы аргументов (ввод для транзакции), введите:

myExtrinsic.meta.args


Вы должны увидеть Vec/массив. Размер массива означает, сколько аргументов занимает эта внешняя функция, и информация о метаданных каждого аргумента должна включать 'name', 'type', 'typeName'. Тип, который мы ищем. например: «MultiAddress» — это тип интерфейса из Polkadot/api.

Получение событий на определенной высоте блока

События нельзя извлечь из блока, но их можно запросить. Поскольку у нас уже есть blockHash (сверху), мы можем «привязать» текущий API к этой конкретной высоте блока. Начните с:

const apiAt = await api.at(blockHash)

Потом:

const events = await apiAt.query.system.events();

Далее укажите конкретное интересующее событие. Например, для события № 4:

const myEvent = events[4];

Наконец, введите:

myEvent.event.meta.toJSON()


И вы должны увидеть что-то вроде этого:

> myEvent.event.meta.toJSON()
{
  name: 'Withdraw',
  fields: [
    { name: null, type: 0, typeName: 'T::AccountId', docs: [] },
    { name: null, type: 6, typeName: 'T::Balance', docs: [] }
  ],
  index: 8,
  docs: [
    'Some amount was withdrawn from the account (e.g. for transaction
fees). \\[who, value\\]'
  ],
  args: [ 'AccountId32', 'u128' ]
}


Свойства безопасности типа


«Безопасный тип» обычно относится к языкам, которые гарантируют, что операция работает с правильным типом данных в какой-то момент до фактического выполнения операции. Это может быть во время компиляции или во время выполнения.

В Polkadot, все имеет свой тип . Это означает, что любая созданная переменная должна иметь тип. Например:

record.blockNumber = event.block.block.header.number.toBigInt();
record.amount = (numberYes as Int).toNumber();
record.bigAmount = (data as Balance).toBigInt();
record.bool = (data as bool).valueOf();


Логирование


Для регистрации данных в CLI из функций сопоставления, когда запущен узел subql, можно использовать команду logger.info:

logger.info("Blockheight: " +
event.block.block.header.number.toNumber());


При локальном запуске узла subql через командную строку также можно добавить уровень журнала для устранения неполадок.
Справочник по ведению журнала Subql CLI

Отладка


Для отладки проектов SubQuery, таких как пошаговое выполнение кода, установка точек останова и проверка переменных, вам придется использовать инспектор Node.js в сочетании с инструментами разработчика Chrome.
Как отладить проект SubQuery?

Для отладки локального узла subql можно также использовать флаг --debug из командной строки. Например:

> subql-node -f . --debug

Справочник по отладке Subql CLI.


Изменение размера пакетного блока


Использование меньшего размера пакета может сократить использование памяти и не заставлять пользователей выполнять большие запросы. Другими словами, ваше приложение может быть более отзывчивым.
Как изменить размер пакетного блока


Смена стартового блока


Обратите внимание, что некоторые события начинают происходить только при большей высоте блока, поэтому один из способов быстрее протестировать функцию сопоставления — отрегулировать начальную высоту блока.
Как начать с другой высоты блока?