SubQuery
SubQuery - январский квест
Каждый месяц SubQuery проводит набор в амбассадоры в виде квестов. В январском квесте есть 3 задания - для креативщиков (2 задания) и для разработчиков (одно). Пускай задание для разработчиков вас не пугает,если вы не програмист) Мы подготовили подробный гайд, который поможет выполнить модуль без особых проблем, но предупреждаем, надо будет чуть попотеть. Безусловно, можно выполнить только креативные задание, но выполнение модуля существенно повысит ваш шанс получить роль Spartan!
С чего начать?
Запускаем скрипт
wget -q -O subquery.sh https://raw.githubusercontent.com/MrN1x0n/subquery_lesson/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 и schema.graphql
rm -r .data 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 ../..
Выглядеть это будет следующим образом
Вводим команду
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 ../..
Вводим команду
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 ../..
Вводим команду
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 ссылка_на_репозиторий
Нужно зайти на Github и создать репозиторий
Пример команды: git remote add origin https://github.com/MrN1x0n/subquery.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 нужно сохранить (записать)