Поднимаем ноду Near, Stake Wars III

Статья написана не для того, чтоб ознакомить вас с наградами, которые нам обещает команда проекта. Вы сами можете ознакомиться со всем необходимым на оффициальной страничке Stake Wars III или в оффициальных статьях проекта. Цель статьи - подробно описать процесс прохождения заданий с технической стороны.

Полезные ссылки

Прежде чем начать

Забегая вперед, сразу скажу, что 5ое задание включает в себя написание статьи (на подобие этой) с подробным описанием выполнения заданий 1-4 со скринами и описанием.

По- этому, нам нужно скринить и писать заметки на протяжении всего процесса поднятия ноды, а так же делать это сразу на сервере. Команда предлагает поднимать ноду на слеедующий облачных серверах:

  • Amazon Web Services
  • Google Cloud Platform
  • Microsoft Azure
  • IBM Cloud
  • DigitalOcean
  • Hetzner

Минимальные требования для ноды описаны во 2ом задании:

  • CPU: 4-Core CPU with AVX support
  • RAM: 8GB DDR4
  • Storage: 500GB SSD

Я создал сервер на Hetzner со спецификациями 4/8/160, в дальнейшем буду расширять память при необходимости (нужно будет постоянно мониторить память), однако это позволит мне сэкономить на ноде. Ребята в коммуне говорят, что понадобится реально 400-500 GB, на Hetzner можно в любой момет добавить память.

Для работы с сервером я буду использовать программу MobaXTerm.

Поднимаем сервак

Регистрируемся в Hetzner, привязываем карту, заходим в Cloud, создаем проект с любым названием и добавляем новый сервер.

image

Выбираем ближайшую до нас локацию, операционную систему (Ubuntu), тип (Standard) и сервер (CPX31 в моем случае, в дальнейшем SSD можно расширить). Все это будет стоить 15 евро в месяц без дополнительной памяти.

image

Если вы хотите сразу добавить недостоющие 340 GB - это вам обойдется еще в 16.46 евро в месяц.

Все остальное я оставляю без изменений (можете дать серверу название).

image

Создаем сервер и ждем его готовности (рядом с сервером загорится зеленая лампочка).

Коннектимся к серваку

Устанавливаем MobaXTerm. Данные для коннекта к серверу вы получите по почте.

Открываем Moba и жмем кнопку "Session".

image

Жмем кнопку "SSH".

image

В поле "Remote host" вбиваем наш IPv4, ставим галочку в поле "Specify username" и вписываем туда "root", далее жмем "OK".

image

У нас появится командная строка с запросом пароля, вбиваем туда наш пароль (который мы получили по почте). Символы видны не будут, можно вставлять в терминал что - то из буффера комбинацией клавиш "Shift+Insert". Вставляем пароль и жмем ENTER. Не сохраняем пароль, если нам Moba это предложит.

Так как это временный пароль, нам необходимо будет вбить его еще раз и далее вбить наш новый пароль 2 раза. Делаем.

image

Сервак готов к работе.

image

Задание 01

Оффициальный гайд можете найти тут.

Внимание! в оффициальном гайде вы можете найти все объяснения и теорию в целом (советую читать офф документацию для личного развития). Я буду лаконичен и буду описывать весь процесс без лишних слов, советую использовать этот гайд исключительно как дополнение к оригиналу. Имейте ввиду, что материал, описанный мной, может устареть.

Цель задания - создать кошелек на Near и поставить NEAR CLI. Я буду ставить его и ноду на одном сервере.

Создаем Near кошелек

Переходим на сайт и создаем кошелек в тестовой сети.

image

Выбираем себе ник и жмем синюю кнопку.

image

В качестве метода защиты я выбрал "Secure Passphrase".

image

Сохраняем сид фразу (никому не показываем ее никогда), жмем "Continue". Далее вставляем слово из нашей сид фразы, которое у нас запросили. В моем случае это слово под номером 3, жмем "Verify & Complete". Этот шаг может потребовать несколько больше времени, просто ждем, если словите ошибку - пробуйте снова.

image

Далее вставляем всю нашу сид фразу в поле и жмем "Find My Account". Процесс тоже займет некоторое время.

image

Если все прошло хорошо - вы не увидите никаких ошибок, создастся аккаунт и на нем будет какое - то количество монет.

image

Устанавливаем NEAR CLI на сервер

Вбиваем следущие команды по - очереди и ждем полного их выполнения. Я покажу, как выглядит окно терминала после выполнения команд.

sudo apt update && sudo apt upgrade -y

image

curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash - 

image

sudo apt install build-essential nodejs

image

Вбиваем "Y" и жмем ENTER.

image

PATH="$PATH"

image

node -v

Должно отбиться в терминале v18.x.x, у меня v18.7.0.

image

npm -v

Должно отбиться в терминале 8.x.x, у меня 8.15.0.

image

sudo npm install -g near-cli

image

export NEAR_ENV=shardnet

image

echo 'export NEAR_ENV=shardnet' >> ~/.bashrc

image

echo 'export NEAR_ENV=shardnet' >> ~/.bash_profile

image

source $HOME/.bash_profile

image

Проверяем, встал ли NEAR CLI на сервер.

near proposals

Если что - то такое выдает - все ок.

image

Задание 02

Оффициальный гайд можете найти тут.

Цель задания - поднимаем ноду Near и активируем ее как валидатора.

Поднимаем ноду

lscpu | grep -P '(?=.*avx )(?=.*sse4.2 )(?=.*cx16 )(?=.*popcnt )' > /dev/null \
  && echo "Supported" \
  || echo "Not supported"

Вот так должно быть, если сервак подходит под это дело.

image

sudo apt install -y git binutils-dev libcurl4-openssl-dev zlib1g-dev libdw-dev libiberty-dev cmake gcc g++ python docker.io protobuf-compiler libssl-dev pkg-config clang llvm cargo

image

apt-get install containerd=1.3.3-0ubuntu2

image

Вбиваем "Y" и жмем ENTER.

image

sudo apt install python3-pip

image

Вбиваем "Y" и жмем ENTER.

image

USER_BASE_BIN=$(python3 -m site --user-base)/bin

image

export PATH="$USER_BASE_BIN:$PATH"

image

sudo apt install clang build-essential make

image

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

image

Вбиваем "y" и жмем ENTER.

image

Вбиваем "1" и жмем ENTER.

image

source $HOME/.cargo/env

image

git clone https://github.com/near/nearcore

image

cd nearcore

image

git fetch

image

Идем по ссылке и берем там строчку (вероятно, она может измениться, потому не копируйте мою команду, а перепроверьте).

image

git checkout c1b047b8187accbf6bd16539feb7bb60185bdc38

image

cargo build -p neard --release --features shardnet

Тут потребуется минут 10.

image

./target/release/neard --home ~/.near init --chain-id shardnet --download-genesis

image

rm ~/.near/config.json

image

wget -O ~/.near/config.json https://s3-us-west-1.amazonaws.com/build.nearprotocol.com/nearcore-deploy/shardnet/config.json

image

./target/release/neard --home ~/.near run

Запускается нода, начинается что - то вроде синхронизации, ждем 100%.

image

В итоге у нас должен пойти похожий лог. Сверяем текущий блок с эксплорером. Должно быть похожее значение.

image

Активируем валидатора

Нажимаем "CTRL+C" в консоли.

image

near login

image

Вбиваем "y" и жмем ENTER.

image

Полностью копируем ссылку из терминала и вставляем ее в браузер, в котором мы залогинены в наш кошелек.

image

Жмем "Next".

image

Жмем "Connect".

image

Вставляем адрес нашего кошелька в поле и жмем "Confirm". На этом этапе просто ждем, пока появится такая страница.

image

Идем обратно в терминал и вбиваем адрес нашего кошелька, жмем ENTER. Должна появиться инфа о том, что кошелек подключен.

image

```
cd ..
```

![image](_attachments/Pasted%20image%2020220801233031.png)
cat ~/.near/validator_key.json

Если пишет, что нет такого файла - делаем следующее (у меня нет файла).

image

Придумаем название для нашего пула (pool_id). Я выбрал название как при создании кошелька "cryptobusher666". Теперь мой пул называется "cryptobusher666.factory.shardnet.near". Вбиваем команду (замените pool_id на свой), в моем случае:

near generate-key cryptobusher666.factory.shardnet.near

image

Вбиваем команду, предварительно заменив pool_id на ваш собственный.

cp ~/.near-credentials/shardnet/cryptobusher666.factory.shardnet.near.json ~/.near/validator_key.json

image

Так как мы работаем в MobaXTerm, мы можем облегчить себе жизнь при редактировании .json файла, просто переходим в навигаторе (слева) в папку "root -> .near".

image

Открываем наш файл "validator_key.json".

image

Откроется окно с данными, нужно заменить "private_key" на "secret_key".

image image

Нужно удостоверится, что тут указан ваш pool_id. Если это не так - редактируем.

image

Жмем "CTRL+S". Сохраняем все данные в блокнот, они нам могут пригодиться, будет гораздо удобнее иметь к ним легкий доступ.

image

Жмем "Yes".

target/release/neard run

Запускается валидатор, сверяем блоки

image

Жмем "CTRL+C".

image

sudo vi /etc/systemd/system/neard.service

image

Открывается редактор, жмем клавишу "i".

image

Вставляем такой вот скрипт, предварительно подправив имя юзера на свое в путях. Вот как выглядит шаблон от разработчиков (обратите внимание на <USER>).

[Unit]
Description=NEARd Daemon Service

[Service]
Type=simple
User=<USER>
#Group=near
WorkingDirectory=/home/<USER>/.near
ExecStart=/home/<USER>/nearcore/target/release/neard run
Restart=on-failure
RestartSec=30
KillSignal=SIGINT
TimeoutStopSec=45
KillMode=mixed

[Install]
WantedBy=multi-user.target

Если ставите ноду на Hetzner, то, скорее всего, у вас будет как у меня.

[Unit]
Description=NEARd Daemon Service

[Service]
Type=simple
User=root
#Group=near
WorkingDirectory=/root/.near
ExecStart=/root/nearcore/target/release/neard run
Restart=on-failure
RestartSec=30
KillSignal=SIGINT
TimeoutStopSec=45
KillMode=mixed

[Install]
WantedBy=multi-user.target

image

Эмем "ESC".

image

Жмем ":", вписываем "wq" и жмем "ENTER".

image image

sudo systemctl enable neard

image

sudo systemctl start neard

image

sudo apt install ccze

image

Данной командой можем в любой момент чекнуть логи. Чтоб выйти, просто вбиваем "CTRL+C".

journalctl -n 100 -f -u neard | ccze -A

image

Задание 03

Оффициальный гайд можете найти тут.

Цель задания - задеплоить стейкинг пул. Произвести операции делегирования и застейкать Near.

Вот шаблон команды, который надо подправить нашими значениями.

near call factory.shardnet.near create_staking_pool '{"staking_pool_id": "<pool id>", "owner_id": "<accountId>", "stake_public_key": "<public key>", "reward_fee_fraction": {"numerator": 5, "denominator": 100}, "code_hash":"DD428g9eqLL8fWUxv8QSpVFzyHi1Qd16P8ephYCTmMSZ"}' --accountId="<accountId>" --amount=30 --gas=300000000000000

Меняем следующие поля на свои:

  • "staking_pool_id": "<pool id>" - тут меняем <pool id> на свой (только первая часть названия), я вбиваю сюда "cryptobusher666"
  • "owner_id": "<accountId>" - тут меняем <accountId> на свой, я вбиваю сюда "cryptobusher666.shardnet.near"
  • "stake_public_key": "<public key>" - тут меняем <public key> на свой, который можно найти в файле "validator_key.json" (мы сохраняли эти данные в нашем прошлом задании) я вбиваю сюда "ed25519:Bdki49wnff9SHF4ZpUYvrvf9KyAKezDSTWfX8sCVdfqu"
  • --accountId="<accountId>" - тут меняем <accountId> на свой, я вбиваю сюда "cryptobusher666.shardnet.near"

В итоге финальная команда в моем случае выглядит так:

near call factory.shardnet.near create_staking_pool '{"staking_pool_id": "cryptobusher666", "owner_id": "cryptobusher666.shardnet.near", "stake_public_key": "ed25519:Bdki49wnff9SHF4ZpUYvrvf9KyAKezDSTWfX8sCVdfqu", "reward_fee_fraction": {"numerator": 5, "denominator": 100}, "code_hash":"DD428g9eqLL8fWUxv8QSpVFzyHi1Qd16P8ephYCTmMSZ"}' --accountId="cryptobusher666.shardnet.near" --amount=30 --gas=300000000000000

image

Можем зайти в эксплорер и проверить, что произошло на нашем аккаунте (в моем случае на "cryptobusher666.shardnet.near"). Виден успешный вызов метода и изменение баланса (примерно на 30 Near).

image

Можете изменить параметры пула (например комиссия), можете использовать следующую команду, однако я этого делать не буду.

near call <pool_name> update_reward_fee_fraction '{"reward_fee_fraction": {"numerator": 1, "denominator": 100}}' --accountId <account_id> --gas=300000000000000

Для дополнительных команд (депозит, анстейк и тд) обращайтесь к оффициальному гайду для этого задания.

На сколько я понял, нам нужно некоторое минимальное количество Near для того, чтоб стать валидатором (поправьте, если не прав), однако после данных операций я еще не являюсь валидатором, мне нужно запросить токены в дискорде Near. Для того, чтоб получить токены через дискорд, нужно попасть в proposals. Проверить это можно следующей командой (подставьте название своего пула).

 near proposals | grep cryptobusher666

Мне ничего не выдало, должно быть так вообще:

image

Посерфил дискорд и понял, для того, чтоб попасть в proposal нужно застейкать суммарно 56 Near. Где их взять - не особо понятно, но все создают еще один кошелек, чтоб получить дополнительных 50 Near и застейкать их. Не уверен, что это прям понравится команде, но другого выхода я не вижу, потому сделал как все.

Создал аккаунт, получил на него около 50 Near, скинул на основной кошелек.

Вбиваем команду, сменив все значения на свои, вот шаблон команды:

near call <staking_pool_id> deposit_and_stake --amount <amount> --accountId <accountId> --gas=300000000000000

У меня команда выглядит так:

near call cryptobusher666.factory.shardnet.near deposit_and_stake --amount 49 --accountId cryptobusher666.shardnet.near --gas=300000000000000

Появились дополнительные токены в пуле.

image

Проверяем, попали ли мы в proposals:

 near proposals | grep cryptobusher666

image

Ура, попали. Идем в дискорд Near, в канал "stake-wars-tokens_delegation".

image

Просим токены, это может затянуться, так как очередь на раздачу большая, просто терпеливо ждем и иногда напоминаем о себе (не стоит спамить). Пока я не получил токены, иду дальше выполнять задания.

image

Задание 04

Оффициальный гайд можете найти тут.

Цель задания - настроить мониторинг статуса ноды.

Напоминаю, что лог можно посмотреть с помощью команды:

journalctl -n 100 -f -u neard | ccze -A

Подробное описание значений в логе можно найти в оффициальном гайде по данному заданию.

sudo apt install curl jq

image

Вбиваем "Y" и жмем ENTER.

image

Готово. В оффициальном гайде по этому заданию перечислены команды для проверки некоторых данных (проверка валидаторов и стейка, причины кика валидатора, информация по блокам). Советую попрактиковаться.

Задание 05

Оффициальный гайд можете найти тут.

Цель задания - написать гайд по выполнению первых четырех заданий.

Я говорил об этом в начале статьи. В процессе выполнения первых четырех заданий вам необходимо было документировать весь процесс, скринить все, что считаете нужным (эта статья от части написана для выполнения 5го задания). Подходите к заданию так, как считаете нужным.

Я решил опустить многие пояснения, так как они уже есть в оффициальных гайдах, смысла переписывать это я не вижу. Я решил сделать такой гайд, с помощью которого любой новичек смог бы выполнить первые 4 этапа, описал некоторые тонкости, которые в офф гайдах опущены из - за их очевидности.

Задание 06

Оффициальный гайд можете найти тут.

Цель задания - создать cron task для автоматического пинга.

Нам необходимо создать дерикторию "scripts" в папке юзера (в моем случае нет юзера, просто в root), а там уже создать файл "ping.sh".

Вы на данном этапе можете находиться в какой - то директории, отличной от моей, потому го немного теории по навигации.

Вернуться назад можно с помощью этой команды:

cd ..

Посмотреть список файлов и папок в текущей директории можно с помощью команды:

ls

Перейти в папку в данной директории можно с помощью команды:

cd названиепапки

Показать, где я нахожусь сейчас можно с помощью команды:

pwd

Итак, допустим я нахожусь в папке "nearcore".

image

cd ..

image

pwd

image

Я в руте, создаю тут папку "scripts".

mkrid scripts

Проверяю, создалась ли папка.

ls

image

Иду в эту папку.

cd scripts

image

Создаю файл "ping.sh".

touch ping.sh

Проверяю, создался ли файл.

ls

image

Открываю файл с помощью vim.

vim ping.sh

image

Жму "i".

image

Вставляю данный скрипт, предварительно изменив пути. Вот так выглядит шаблон.

#!/bin/sh
# Ping call to renew Proposal added to crontab

export NEAR_ENV=shardnet
export LOGS=/home/<USER_ID>/logs
export POOLID=<YOUR_POOL_ID>
export ACCOUNTID=<YOUR_ACCOUNT_ID>

echo "---" >> $LOGS/all.log
date >> $LOGS/all.log
near call $POOLID.factory.shardnet.near ping '{}' --accountId $ACCOUNTID.shardnet.near --gas=300000000000000 >> $LOGS/all.log
near proposals | grep $POOLID >> $LOGS/all.log
near validators current | grep $POOLID >> $LOGS/all.log
near validators next | grep $POOLID >> $LOGS/all.log

Вот так выглядит мой вариант.

#!/bin/sh
# Ping call to renew Proposal added to crontab

export NEAR_ENV=shardnet
export LOGS=/root/logs
export POOLID=cryptobusher666
export ACCOUNTID=cryptobusher666

echo "---" >> $LOGS/all.log
date >> $LOGS/all.log
near call $POOLID.factory.shardnet.near ping '{}' --accountId $ACCOUNTID.shardnet.near --gas=300000000000000 >> $LOGS/all.log
near proposals | grep $POOLID >> $LOGS/all.log
near validators current | grep $POOLID >> $LOGS/all.log
near validators next | grep $POOLID >> $LOGS/all.log

image

Жму "ESC".

image

Жму ":" и пишу "wq".

image

Жму "ENTER".

image

Создаю папку для логов.

mkdir $HOME/logs

image

Меняем permission для скрипта.

chmod +x $HOME/scripts/ping.sh

image

Создаем crontab с интервалом в 2 часа.

crontab -e

image

Я выбрал второй вариант, жму "2" и "ENTER".

image

Все как обычно, жму "i", вставляю скрипт, предварительно заменив значение на свое, вот шаблон:

0 */2 * * * sh /home/<USER_ID>/scripts/ping.sh

Вот мой вариант:

0 */2 * * * sh /root/scripts/ping.sh

image

Жму "ESC", жму ":", пишу "wq" и жму "ENTER".

image

В дальнейшем у нас будут появляться логи, просмотреть их можно с помощью данной команды:

cat $HOME/logs/all.log

После выполнения данных шагов нам нужно дождаться вызовов метода "ping", заскринить это все в эксплорере и заполнить форму с отчетом. Так как у меня этот процесс еще не прошел, я буду сабмитить форму позже, но пример вы можете увидеть на странице с оффициальным гайдом по этому шагу.

Задание 08

Оффициальный гайд можете найти тут.

Цель задания - задеплоить контракт для распределения наград между 2мя аккаунтами.

Нам предлагают поставить cargo и Rust, но мы это делали ранее, на всякий случай прогоню эти 2 команды.

curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

Прожимаем там "y" и "1" в процессе выполнения, не буду скринить.

source $HOME/.cargo/env

image

rustup target add wasm32-unknown-unknown

image

Тут надо склонировать репозиторий из Гитхаба. Для этого я создам директорию "github" в "root".

mkdir github

image

cd github

image

git clone https://github.com/zavodil/near-staking-pool-owner

image

cd near-staking-pool-owner/contract

image

cargo build --target wasm32-unknown-unknown --release

image

Вбиваем команду, скорректировав некоторые данные под себя, вот шаблон:

NEAR_ENV=shardnet near deploy <OWNER_ID>.shardnet.near --wasmFile target/wasm32-unknown-unknown/release/contract.wasm

Вот как выглядит моя команда:

NEAR_ENV=shardnet near deploy cryptobusher666.shardnet.near --wasmFile target/wasm32-unknown-unknown/release/contract.wasm

image

Создаем переменную, вот шаблон команды:

CONTRACT_ID=<OWNER_ID>.shardnet.near

Моя команда выглядит так:

CONTRACT_ID=cryptobusher666.shardnet.near

image

Тут нам нужен еще один аккаунт для получения наград. Создаем новый аккаунт в Shardnet сети, мы это делали в первом задании, все происходит похожим образом. Я создал новый аккаунт "cryptobusher6662.shardnet.near" (там двойка в конце).

Вбиваем следующую команду, предварительно сменив некоторые значения на свои. Вот шаблон:

NEAR_ENV=shardnet near call $CONTRACT_ID new '{"staking_pool_account_id": "<STAKINGPOOL_ID>.factory.shardnet.near", "owner_id":"<OWNER_ID>.shardnet.near", "reward_receivers": [["<SPLITED_ACCOUNT_ID_1>.shardnet.near", {"numerator": 3, "denominator":10}], ["<SPLITED_ACCOUNT_ID_2>.shardnet.near", {"numerator": 70, "denominator":100}]]}' --accountId $CONTRACT_ID

Вот моя команда (немного подправил еще "numerator" и "denominator" чтоб изменить распределение наград, можете тоже поиграться).

NEAR_ENV=shardnet near call $CONTRACT_ID new '{"staking_pool_account_id": "cryptobusher666.factory.shardnet.near", "owner_id":"cryptobusher666.shardnet.near", "reward_receivers": [["cryptobusher666.shardnet.near", {"numerator": 5, "denominator":10}], ["cryptobusher6662.shardnet.near", {"numerator": 5, "denominator":10}]]}' --accountId $CONTRACT_ID

image

Необходимо подождать, пока мы начнем получать реварды и сделать их вывод. Это можно сделать после завершения эпохи, которая длится 12 часов. Ждем и вбиваем команду, скорректировав все своими значениями. Вот шаблон:

CONTRACT_ID=<OWNER_ID>.shardnet.near
NEAR_ENV=shardnet near call $CONTRACT_ID withdraw '{}' --accountId $CONTRACT_ID --gas 200000000000000

Вот мой вариант:

CONTRACT_ID=cryptobusher666.shardnet.near
NEAR_ENV=shardnet near call $CONTRACT_ID withdraw '{}' --accountId $CONTRACT_ID --gas 200000000000000

Далее делаем скрин успешного вывода токенов и прикрепляем к форме отчета по данному заданию. Больше подробностей об отчете можете найти в оффициальном гайде по данному заданию.