November 4, 2021

SubQuery Module 1 & Module 2

Задачи по модулям можно решить несколькими способами, в данном гайде будет описан тот способ, который помог мне прийти к результату.
Начальная часть гайда будет взята с источника https://medium.com/@AlexKaa/%D0%B0%D0%BA%D0%B0%D0%B4%D0%B5%D0%BC%D0%B8%D1%8F-subquery-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C-1-%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%BE-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-aac4e1ef5c41 Спасибо большое ребятам @AlexKa и @Motiio
Ах, да, чуть не забыл, это мой первый в жизни гайд, поэтому не судите строго :)

Инструменты, которые понадобятся для работы:

  • Сервер. Так как я запускаю ноды - у меня был сервер, который я арендую здесь: https://www.digitalocean.com/products/droplets/. Можете взять сервер там в аренду, самый простой стоит 5 у.е. в месяц. Я не буду в данном гайде расписывать инструкцию как правильно купить сервер и войти в него, но если у вас будут вопросы, как это сделать - обращайтесь ко мне в дискорде: Alexander Chernyak#3490
  • PuTTY. Инструмент, с помощью которого мы будем связываться с сервером и выполнять там команды: https://www.putty.org/
  • WinSCP. С помощью данного инструмента мы будем заходить в директории наших проектов, редактировать, удалять, копировать файлы и т.д. https://winscp.net/eng/download.php
  • GitHub. Репозиторий в котором мы будем хранить наш проект. Необходимо зарегистрироваться https://github.com

МОДУЛЬ № 1

Подключаемся к серверу через PuTTY.

Обновляем список пакетов с помощью команды:

sudo apt update

Установим Node.js

apt install nodejs
apt install npm

Поменяем версию на 14.18.0 (так как на более новой не работает)

sudo npm install -g n
n install 14.18.0
n

нажимаем Enter (тем самым выбираем версию 14.18.0)

Обновляем npm:

npm install npm -g

Устанавливаем Docker:

apt install docker-compose

Устанавливаем subql/cli:

npm install -g @subql/cli

Cоздаем директорию:

mkdir SubQl

Входим в директорию:

cd SubQl

Cоздаем проект:

sudo subql init --starter HelloWorld

Далее, Вас попросят ввести:

Git repository - не обязательно.

RPC endpoint - жмем Enter

Authors - Ваше имя

Description - По желанию краткое описание проекта (своими словами)

Version - жмем Enter

License - жмем Enter

По итогу, Вы должны увидеть такую строку:

HelloWorld is ready

Переходим в проект:

cd HelloWorld


Теперь, самая важная часть первого задания, многие выполнили ее не правильно.

Подключаем WinSCP и заходим в наш сервер. Для этого вам нужен будет:

IP вашего арендованного сервера

логин: root

Пароль: Тот, что вы выбрали при установке Droplets на DigitalOcean

Заходим в папку HelloWorld -> src -> mappings -> mappingHandlers.ts

Нам необходимо отредактировать данный файл. Кликаем по нему два раза, он откроется через блокнот либо другую программу редактирования, которая имеется у Вас на компьютере.

Изначально вы увидите образец файла с 3 функциями.
handleBlock, handleEvent и handleCall. Мы сосредоточимся на первой.
Функция называется handleBlock, поэтому удалите оставшиеся функции.

Файл mappingHandler.ts должен выглядеть так:

import {SubstrateExtrinsic,SubstrateEvent,SubstrateBlock} from "@subql/types";
import {StarterEntity} from "../types";
import {Balance} from "@polkadot/types/interfaces";


export async function handleBlock(block: SubstrateBlock): Promise<void> {
    let record = new StarterEntity(block.block.header.hash.toString());
    record.blockHeight = block.block.header.number.toNumber();
    await record.save();
}

После того, как вы отредактируете данный файл, сохраните его, и закройте.

Далее, переходим к следующему файлу project.yaml, для этого идем по иерархии:

HelloWorld -> project.yaml


Поскольку мы удалили handleEvent и handleCall из файла mappingHandler.ts, мы должны удалить их также из файла project.yaml


Файл project.yaml должен выглядеть так:

specVersion: 0.0.1
description: ''
repository: ''
schema: ./schema.graphql
network:
  endpoint: wss://polkadot.api.onfinality.io/public-ws
  dictionary: https://api.subquery.network/sq/subquery/dictionary-polkadot
dataSources:
  - name: main
    kind: substrate/Runtime
    startBlock: 1
    mapping:
      handlers:
        - handler: handleBlock
          kind: substrate/BlockHandler

Точно также, сохраняем, закрываем, переходим дальше.

Необходимо изменить файл schema.graphql

(его иерархия: HelloWorld -> schema.graphql)

Файл schema.graphql по умолчанию будет содержать 5 полей. Мы можем удалить поля со 2 по 5, и изменим "field1" на "blockHeight".

Файл в итоге должен выглядеть так:

type StarterEntity @entity {

  id: ID! #id is a required field

  blockHeight: Int!

}

С Редактированием файлов закончили

Снова заходим в PuTTY

ВАЖНО! Убедитесь что Вы находитесь в директории вашего проекта, у меня это выглядит так:

Устанавливаем зависимости:

npm install

npm run-script codegen

Вы должны увидеть новую папку с двумя новыми файлами:

  • index.ts
  • StarterEntity.ts

Если вы их видите, можно двигаться дальше:

Следующим шагом будет сборка проекта с помощью команды:

npm run-script build

Запускаем команду Docker:

docker-compose pull && docker-compose up

Если вы выполняете данное задание на удаленном сервере, используйте IP вашего сервера.

В новой вкладке браузера вбиваем вашIP:3000

Пример, у меня это выглядит так:

в левой части экрана, Вам необходимо написать запрос, который должен выглядеть так:

{
   query{
      starterEntities(last:10, orderBy: ID_ASC){
         nodes{
            blockHeight
         }
      }
   }
}

После этого запустите Ваш запрос. В правой стороне экрана Вы должны увидеть что-то похожее как на скрине:

Возвращаемся в PuTTY и нажимаем Ctrl+C - тем самым останавливаем Docker.

Необходимо наш проект залить на GitHub.

В консоли на сервере пишем команды:

sudo apt install git

git config --global user.name "ИМЯ ИЗ ГИТХАБА"

git config --global user.email "свой email"

eval ssh-agent -s

Далее выполняем команду:

ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/id_rsa

где вместо [email protected] подставляем значение своего email адреса

После этого два раза жмем Enter.

cat ~/.ssh/id_rsa.pub

Команда указанная выше позволит Вам получить ваш ключ SSH

Копируйте данный ключ от начала до конца.

Направляемся в github.com

Создаем репозиторий

В правом верхнем углу нажимаем на меню (круглый значок)

Переходим Settings -> SSH and GPG keys -> New SSH key

Вводим свой ключ, который мы копировали в консоли.

Возвращаемся в PuTTY и пишем:

git init

git remote add origin[email protected]:<ИмяГитАккаунта>/<имя репозитория>.git

например, git remote add origin https://github.com/AlexKa/AlexKa2.git

Далее:

git add .

git commit -m 'create project'

git push origin master

После этого вы должны ввести свой никнейм в гитхаб и пароль.

Но пароль не от гитхаба а "Personal access token" создать который мы можем перейдя по шагам:

GitHub -> Menu (Круг справа вверху экрана) -> Settings -> Developer Settings -> Personal Access Token -> Generate new token -> Вводим пароль от Гитхаб, и затем сгенерированный код вставляем в PuTTY в поле Password.

Переходим на сайт https://project.subquery.network/ и входим через него в свой GitHub.

Нажимаем Create Project и заполняем:

Cнова нажимаем Create Project -> Deploy -> Deploy. Update

Поздравляю! Первый модуль завершен!

Модуль № 2

Входим в PuTTY

Вернемся в корневую папку, выполняем команду

cd

Заходим в папку SubQl

cd SubQl

Создаем новый проект:

sudo subql init --starter AccountBalances

Далее, Вас попросят ввести:

Git repository - не обязательно.

RPC endpoint - жмем Enter

Authors - Ваше имя

Description - По желанию краткое описание проекта (своими словами)

Version - жмем Enter

License - жмем Enter

По итогу, Вы должны увидеть такую строку:

AccountBalances is ready

Переходим в проект:

cd AccountBalances

Переходим в WinSCP и начинаем редактировать файлы:

Начинаем с файла schema.graphql.

Файл schema.graphql по умолчанию содержит 5 полей. Переименуйте field2 в account и field3 в balance. Переименуйте entity в Account. Остальные поля можно удалить.

Файл schema.graphql после изменений должен выглядеть так:

type Account @entity {

  id: ID! #id is a required field

  account: String #This is a Polkadot address

  balance: BigInt #This is the amount of DOT

}

Исправляем project.yaml

Поскольку мы фокусируемся только на Events, давайте удалим handleBlock и handleCall из mappings файл. Файл project.yaml должен выглядеть так:

specVersion: 0.0.1
description: AccountBalances
repository: ''
schema: ./schema.graphql
network:
  endpoint: wss://polkadot.api.onfinality.io/public-ws
  dictionary: https://api.subquery.network/sq/subquery/dictionary-polkadot
dataSources:
  - name: main
    kind: substrate/Runtime
    startBlock: 1
    mapping:
      handlers:
        - handler: handleEvent
          kind: substrate/EventHandler
          filter:
            module: balances
            method: Deposit

Корректируем mappings файлы

Путь: AccountBalances -> src -> mappings -> mappingHandlers.ts

Опять же, поскольку мы фокусируемся только на handleEvent,
удалим оставшиеся функции:

import {SubstrateExtrinsic,SubstrateEvent,SubstrateBlock} from "@subql/types";
import {Account} from "../types";
import {Balance} from "@polkadot/types/interfaces";

export async function handleEvent(event: SubstrateEvent): Promise<void> {
    const {event: {data: [account, balance]}} = event;
    //Create a new Account entity with ID using block hash
	let record = new
    Account(event.extrinsic.block.block.header.hash.toString());
    //Assign the Polkadot address to the account field
    record.account = account.toString();
    //Assigh the balance to the balance field "type cast as Balance"
    record.balance = (balance as Balance).toBigInt();
    await record.save();
}

Закончили с редакцией файлов, возвращаемся в PuTTY и пишем команды:

npm install
npm run-script codegen
npm run-script build

Запускаем команду Docker:

docker-compose pull && docker-compose up

Если вы выполняете данное задание на удаленном сервере, используйте IP вашего сервера.

В новой вкладке браузера вбиваем вашIP:3000

Пример, у меня это выглядит так:

в левой части экрана, Вам необходимо написать запрос, который должен выглядеть так:

query {
   accounts(first:10 orderBy:BALANCE_DESC){
      nodes{
         account
         balance
      }
   }
}

После этого запустите Ваш запрос. В правой стороне экрана Вы должны увидеть что-то похожее как на скрине:

Возвращаемся в PuTTY и нажимаем Ctrl+C - тем самым останавливаем Docker.

Необходимо наш проект залить на GitHub.

Переходим в GitHub и создаем новый репозиторий, точно также, как мы это делали для HelloWorld.

Затем переходим в консоль и пишем:

git init

git remote add origin[email protected]:<ИмяГитАккаунта>/<имя репозитория>.git

например git remote add origin https://github.com/AlexKa/AlexKa2.git

далее

git add .

git commit -m 'create project'

git push origin master

Затем переходим на сайт https://project.subquery.network/

Снова нажимаем Create Project и заполняем все также, как мы делали для HelloWorld.

ГОТОВО!

Поздравляю! Вы выполнили задание второго модуля!

Гайд подготовил Александр Черняк.

Discord: Alexander Chernyak#3490

Информация по инициализации проекта и настройке Гитхаба взята у @AlexKa и @Motiio