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 "[email protected]" -f ~/.ssh/id_rsa
где вместо [email protected]
подставляем значение своего email адреса
После этого два раза жмем Enter.
Команда указанная выше позволит Вам получить ваш ключ SSH
Копируйте данный ключ от начала до конца.
Направляемся в github.com
В правом верхнем углу нажимаем на меню (круглый значок)
Переходим Settings -> SSH and GPG keys -> New SSH key
Вводим свой ключ, который мы копировали в консоли.
git init
git remote add origin[email protected]:<ИмяГитАккаунта>/<имя репозитория>.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 origin[email protected]:<ИмяГитАккаунта>/<имя репозитория>.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