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
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 install npm -g
apt install docker-compose
npm install -g @subql/cli
mkdir SubQl
cd SubQl
sudo subql init --starter HelloWorld
Git repository - не обязательно.
Description - По желанию краткое описание проекта (своими словами)
По итогу, Вы должны увидеть такую строку:
HelloWorld is ready
cd HelloWorld
Теперь, самая важная часть первого задания, многие выполнили ее не правильно.
Подключаем WinSCP и заходим в наш сервер. Для этого вам нужен будет:
IP вашего арендованного сервера
Пароль: Тот, что вы выбрали при установке 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, для этого идем по иерархии:
Поскольку мы удалили 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!
}С Редактированием файлов закончили
ВАЖНО! Убедитесь что Вы находитесь в директории вашего проекта, у меня это выглядит так:
Вы должны увидеть новую папку с двумя новыми файлами:
Если вы их видите, можно двигаться дальше:
Следующим шагом будет сборка проекта с помощью команды:
docker-compose pull && docker-compose up
Если вы выполняете данное задание на удаленном сервере, используйте IP вашего сервера.
В новой вкладке браузера вбиваем вашIP:3000
Пример, у меня это выглядит так:
в левой части экрана, Вам необходимо написать запрос, который должен выглядеть так:
{
query{
starterEntities(last:10, orderBy: ID_ASC){
nodes{
blockHeight
}
}
}
}После этого запустите Ваш запрос. В правой стороне экрана Вы должны увидеть что-то похожее как на скрине:
Возвращаемся в PuTTY и нажимаем Ctrl+C - тем самым останавливаем Docker.
Необходимо наш проект залить на GitHub.
В консоли на сервере пишем команды:
git config --global user.name "ИМЯ ИЗ ГИТХАБА"
git config --global user.email "свой email"
ssh-keygen -t rsa -b 4096 -C "my@emailaddress.com" -f ~/.ssh/id_rsa
где вместо my@emailaddress.com подставляем значение своего email адреса
После этого два раза жмем Enter.
Команда указанная выше позволит Вам получить ваш ключ SSH
Копируйте данный ключ от начала до конца.
Направляемся в github.com
В правом верхнем углу нажимаем на меню (круглый значок)
Переходим Settings -> SSH and GPG keys -> New SSH key
Вводим свой ключ, который мы копировали в консоли.
git init
git remote add origingit@github.com:<ИмяГитАккаунта>/<имя репозитория>.git
например, git remote add origin https://github.com/AlexKa/AlexKa2.git
git commit -m 'create project'
После этого вы должны ввести свой никнейм в гитхаб и пароль.
Но пароль не от гитхаба а "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
Вернемся в корневую папку, выполняем команду
sudo subql init --starter AccountBalances
Git repository - не обязательно.
Description - По желанию краткое описание проекта (своими словами)
По итогу, Вы должны увидеть такую строку:
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
}Поскольку мы фокусируемся только на 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Путь: 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-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 remote add origingit@github.com:<ИмяГитАккаунта>/<имя репозитория>.git
например git remote add origin https://github.com/AlexKa/AlexKa2.git
git commit -m 'create project'
Затем переходим на сайт https://project.subquery.network/
Снова нажимаем Create Project и заполняем все также, как мы делали для HelloWorld.
Поздравляю! Вы выполнили задание второго модуля!
Гайд подготовил Александр Черняк.
Discord: Alexander Chernyak#3490
Информация по инициализации проекта и настройке Гитхаба взята у @AlexKa и @Motiio