January 6, 2022

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 нужно ввести

айпи вашего сервера:3000

Пример - 65.21.248.92:3000

Должно появится окно

Вставляем команду в левое окно и нажимаем на кнопку "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 ссылка_на_репозиторий

Нужно зайти на Github и создать репозиторий

Пример команды: 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 нужно сохранить (записать)

Если в конце установки вы видите эту строку, значит всё хорошо!
* [new branch] master -> master

Заходим на сайт и нажимаем "create project"

https://project.subquery.network/

Вводим данные как на скрине и нажимаем "create project"

Нажимаем Deploy в двух разделах и ждем пока нода синхронизируется. Если все сделано правильно, то будет гореть зеленым RUNNING.

После появления "RUNNING" возле верхнего раздела тыкаем на ... и заходим через Explorer

Опускаемся немного ниже и нажимаем кнопку "play"

Вывод должен быть примерно такой

После этого нужно удалить Staging Slot - тыкаем на ... и "delete"

Поздравляю, вы успешно выполнили 4 модуль!