SubQuery - январский квест
Каждый месяц SubQuery проводит набор в амбассадоры в виде квестов. В январском квесте есть 3 задания - для креативщиков (2 задания) и для разработчиков (одно). Пускай задание для разработчиков вас не пугает,если вы не програмист) Я подготовил подробный гайд, который поможет выполнить модуль без особых проблем, но предупреждаю, надо будет чуть попотеть) Безусловно, можно выполнить только креативные задание, но выполнение модуля существенно повысит ваш шанс стать спартанцем!
С чего начать?
Запускаем скрипт
wget -q -O subquery.sh https://raw.githubusercontent.com/Kallen-c/utils/main/subquery.sh && chmod +x subquery.sh && sudo /bin/bash subquery.sh && git clone https://github.com/MikkiKill/tutorials-simple-aggregation_v2_m4-1 && cd tutorials-simple-aggregation_v2_m4-1 && yarn install && yarn codegen && yarn build && docker-compose pull && docker-compose up
Ждём пару минут пока появится что-то подобное
В поисковой строке Google нужно ввести
Должно появится окно
Вставляем команду в левое окно и нажимаем на кнопку "play"
query{ stakingRewards(first: 3 orderBy:BLOCK_HEIGHT_ASC){ nodes{ blockHeight account date balance } } }
Что-то похожее вы должны увидеть у себя
Заходим в терминал
нажимаем ctrl+c
Cтопаем докер
docker-compose stop
Очищаем данные в файле .data
rm -r .data
Очищаем данные в файле schema.graphql
rm -r schema.graphql
Заходим в файл schema.graphql
nano schema.graphql
Появится такое окно, не бойтесь)
Вставляем данные
type StakingReward @entity{ id: ID! #blockHeight-eventIdx account: String! balance: BigInt! date: Date! blockHeight: Int! } type SumReward @entity{ id: ID! # AccountId totalReward: BigInt! blockheight: Int! }
Attention!
После того, как вставили данные, нажимаем ctrl+o , потом Enter, затем ctrl+x , мы вернемся в обычную для нас среду терминала
Это сочитание понадобиться нам ещё не один раз: ctrl+o - Enter - ctrl+x
Очищаем данные
rm -r project.yaml
Заходим в папку
nano project.yaml
Вставляем данные
specVersion: 0.2.0 name: tonystake version: 1.0.0 description: '' repository: '' schema: file: ./schema.graphql network: genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3' endpoint: wss://polkadot.api.onfinality.io/public-ws dataSources: - kind: substrate/Runtime startBlock: 7000000 mapping: file: ./dist/index.js handlers: - handler: handleSumRewarded kind: substrate/EventHandler filter: module: staking method: Rewarded - handler: handleStakingRewarded kind: substrate/EventHandler filter: module: staking method: Rewarded
После ввода данных нажимаем ctrl+o, Enter и затем ctrl+x
Вводим команду
cd src/mappings
Вводим команду
rm -r mappingHandlers.ts
Вводим команду
nano mappingHandlers.ts
Вставляем данные
import {SubstrateEvent} from "@subql/types"; import {StakingReward, SumReward} from "../types"; import {Balance} from "@polkadot/types/interfaces"; export async function handleStakingRewarded(event: SubstrateEvent): Promise<void> { const {event: {data: [account, newReward]}} = event; const entity = new StakingReward(`${event.block.block.header.number}-${event.idx.toString() }`); entity.account = account.toString(); entity.balance = (newReward as Balance).toBigInt(); entity.date = event.block.timestamp; entity.blockHeight = event.block.block.header.number.toNumber(); await entity.save(); } function createSumReward(accountId: string): SumReward { const entity = new SumReward(accountId); entity.totalReward = BigInt(0); return entity; } export async function handleSumRewarded(event: SubstrateEvent): Promise<void> { const {event: {data: [account, newReward]}} = event; let entity = await SumReward.get(account.toString()); if (entity === undefined){ entity = createSumReward(account.toString()); } entity.totalReward = entity.totalReward + (newReward as Balance).toBigInt(); entity.blockheight = event.block.block.header.number.toNumber(); await entity.save(); }
После ввода данных нажимаем ctrl+o, Enter и затем ctrl+x
Вводим команду
cd ..
Повторно вводим команду
cd ..
Выглядеть это будет следующим образом
Вводим команду
yarn codegen
Вводим команду, нужно пару секунд подождать
yarn build
Вводим команду
docker-compose pull
Вводим команду
docker-compose up
Заходим в Google и обновляем страницу
Предыдущую команду поменяйте на эту, чтобы рядок в рядок всё было одинаково
query{ sumRewards(first:3 orderBy:BLOCKHEIGHT_ASC){ nodes{ blockheight id totalReward } } }
Cправа должен быть похожий вывод
Возвращаемся в терминал
Нажимаем ctrl+c
Вводим команду
docker-compose stop
Вводим команду
rm -r .data
Вводим команду
rm -r schema.graphql
Вводим команду
nano schema.graphql
Вставляем данные
type StakingReward @entity{ id: ID! #blockHeight-eventIdx account: SumReward! balance: BigInt! date: Date! blockheight: Int } type SumReward @entity{ id: ID! # AccountId totalReward: BigInt! blockheight: Int! }
После ввода данных нажимаем ctrl+o, Enter и затем ctrl+x
Вводим команду
rm -r project.yaml
Вводим команду
nano project.yaml
Вставляем данные
specVersion: 0.2.0 name: tonystake version: 1.0.0 description: '' repository: '' schema: file: ./schema.graphql network: genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3' endpoint: wss://polkadot.api.onfinality.io/public-ws dataSources: - kind: substrate/Runtime startBlock: 7000000 mapping: file: ./dist/index.js handlers: - handler: handleSumRewarded kind: substrate/EventHandler filter: module: staking method: Rewarded - handler: handleStakingRewarded kind: substrate/EventHandler filter: module: staking method: Rewarded
После ввода данных нажимаем ctrl+o, Enter и затем ctrl+x
Вводим команду
cd src/mappings
Вводим команду
rm -r mappingHandlers.ts
Вводим команду
nano mappingHandlers.ts
Копируем команду и вставляем
import {SubstrateEvent} from "@subql/types"; import {StakingReward, SumReward} from "../types"; import {Balance} from "@polkadot/types/interfaces"; export async function handleStakingRewarded(event: SubstrateEvent): Promise<void> { const {event: {data: [account, newReward]}} = event; const entity = new StakingReward(`${event.block.block.header.number}-${event.idx.toString() }`); entity.accountId = account.toString(); entity.balance = (newReward as Balance).toBigInt(); entity.date = event.block.timestamp; await entity.save(); } function createSumReward(accountId: string): SumReward { const entity = new SumReward(accountId); entity.totalReward = BigInt(0); return entity; } export async function handleSumRewarded(event: SubstrateEvent): Promise<void> { const {event: {data: [account, newReward]}} = event; let entity = await SumReward.get(account.toString()); if (entity === undefined){ entity = createSumReward(account.toString()); } entity.totalReward = entity.totalReward + (newReward as Balance).toBigInt(); entity.blockheight = event.block.block.header.number.toNumber(); await entity.save(); }
После ввода данных нажимаем ctrl+o, Enter и затем ctrl+x
Вводим команду
cd ..
Повторно вводим команду
cd ..
Вводим команду
ls -la
Вывод будет примерно такой
Вводим команду
yarn codegen
Вводим команду и ждём пару секунд
yarn build
Вводим команду
docker-compose pull
Вводим команду
docker-compose up
Заходим в Google и обновляем страницу
Предыдущую команду поменяйте на эту, чтобы рядок в рядок всё было одинаково
query{ sumRewards(filter: {id:{equalTo:"16jWQMBXZNxfgXJmVL61gMX4uqtc9WTXV3c8DGx6DUKejm7"}}){ nodes{ blockheight id totalReward stakingRewardsByAccountId{ nodes{ balance } } } } }
Нажимаем на кнопку ''play''. Вывод должен быть похожим
Заходим в терминал
Нажимаем ctrl+c
Вводим команду
docker-compose stop
Вводим команду
rm -r .data
Вводим команду
rm -r schema.graphql
Вводим команду
nano schema.graphql
Вставляем данные
type StakingReward @entity{ id: ID! #blockHeight-eventIdx account: SumReward! balance: BigInt! date: Date! blockheight: Int } type SumReward @entity{ id: ID! # AccountId totalReward: BigInt! blockheight: Int }
После ввода данных нажимаем ctrl+o, Enter и затем ctrl+x
Вводим команду
rm -r project.yaml
Вводим команду
nano project.yaml
Вставляем данные
specVersion: 0.2.0 name: tonystake version: 1.0.0 description: '' repository: '' schema: file: ./schema.graphql network: genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3' endpoint: wss://polkadot.api.onfinality.io/public-ws dataSources: - kind: substrate/Runtime startBlock: 6000000 mapping: file: ./dist/index.js handlers: - handler: handleSumReward kind: substrate/EventHandler filter: module: staking method: Reward - handler: handleStakingReward kind: substrate/EventHandler filter: module: staking method: Reward
После ввода данных нажимаем ctrl+o, Enter и затем ctrl+x
Вводим команду
cd src/mappings
Вводим команду
rm -r mappingHandlers.ts
Вводим команду
nano mappingHandlers.ts
Вставляем данные
import {SubstrateEvent} from "@subql/types"; import {StakingReward, SumReward} from "../types"; import {Balance} from "@polkadot/types/interfaces"; export async function handleStakingReward(event: SubstrateEvent): Promise<void> { const {event: {data: [account, newReward]}} = event; const entity = new StakingReward(`${event.block.block.header.number}-${event.idx.toString() }`); entity.accountId = account.toString(); entity.balance = (newReward as Balance).toBigInt(); entity.date = event.block.timestamp; await entity.save(); } function createSumReward(accountId: string): SumReward { const entity = new SumReward(accountId); entity.totalReward = BigInt(0); return entity; } export async function handleSumReward(event: SubstrateEvent): Promise<void> { const {event: {data: [account, newReward]}} = event; let entity = await SumReward.get(account.toString()); if (entity === undefined){ entity = createSumReward(account.toString()); } entity.totalReward = entity.totalReward + (newReward as Balance).toBigInt(); entity.blockheight = event.block.block.header.number.toNumber(); await entity.save(); }
После ввода данных нажимаем ctrl+o, Enter и затем ctrl+x
Вводим команду
cd ..
Повторно вводим команду
cd ..
Вводим команду
ls -la
Вывод будет примерно такой
Вводим команду
yarn codegen
Вводим команду
yarn build
Вводим команду
docker-compose pull
Вводим команду
docker-compose up
Заходим в Google, обновляем страницу
Предыдущую команду поменяйте на эту, чтобы рядок в рядок всё было одинаково
query{ sumRewards(first:3 orderBy:BLOCKHEIGHT_ASC){ nodes{ blockheight id totalReward } } }
Нажимаем на кнопку "play", вывод должен быть похож
Переходим в терминал
Нажимаем ctrl+c
Вводим команду
docker-compose stop
Вводим команды
ls -la
rm -r .git
git init
git remote add origin ссылка_на_репозиторий
Пример команды: git remote add origin https://github.com/nepster57/module-4.git
Команды нужно вводить отдельно и вместе с "
git config --global user.name "имя на гитхабе"
git config --global user.email "ваша почта"
git add .
git commit -m 'create project'
git push origin master
Attention!
После этого нужно ввести название своего гитхаба и пароль. Название - ник, что у вас в гитхабе. Пароль - это acces_token, который нужно создать в гитхабе, инструкция ниже
Тыкаем на профиль и заходим в настройки
Выбираем "Developer settings"
Заходим сюда и нажимаем "generate new token"
Выставляем данные как на скрине и нажимаем "Generate token"
Cвой access token нужно сохранить (записать)