Тестнеты
July 23, 2022

NEAR. Stake Wars: Episode III

Запуск валидатора "Chunk-only Producer" в сети shardnet.

Stake Wars III is already online!

Stake Wars — это программа, которая помогает сообществу ознакомиться с тем, что значит быть валидатором NEAR, и дает им ранний шанс получить доступ к Сhunk-only producer. Вознаграждения, предлагаемые программой Stake Wars, поддерживают новых участников, которые хотят присоединиться к основной сети в качестве валидатора, начиная с сентября 2022 года.

Приступим

Что такое программа Stake Wars и Chunk-only Producer

Заполняем форму для регистрация Chunk-Only Producer и арендуем сервер.

Требования к серверу

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

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

Переходим на сайт https://wallet.shardnet.near.org/ и нажимаем Reserve My Account ID.

Выбираем метод восстановления. Я рекомендую использовать мнемоническую фразу. Если вы выбрали этот метод, то сохраняем фразу и далее вводим её в соответствующее поле.

Как результат видим тестовые токены в кошельке:

Запускаем узел

Подключаемся к серверу и обновляем пакеты

sudo apt update && sudo apt upgrade -y

Устанавливаем Node.js и npm

curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install build-essential nodejs
PATH="$PATH"

Проверяем версии

node -v

Должен быть ответ: v18.xx

npm -v

Должен быть ответ: 8.xx

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

sudo npm install -g near-cli

Должен быть ответ: 8.xx

Настраиваем окружающую среду

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

Устанавливаем инструменты разработчика

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

Устанавливаем Python pip

sudo apt install python3-pip

Устанавливаем конфигурацию

USER_BASE_BIN=$(python3 -m site --user-base)/bin
export PATH="$USER_BASE_BIN:$PATH"

Устанавливаем Building env

sudo apt install clang build-essential make

Устанавливаем Rust & Cargo

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

Отвечаем "1"

source $HOME/.cargo/env

Клонируем репозиторий nearcore

git clone https://github.com/near/nearcorecd nearcoregit fetch

Далее проверяем <commit> в файле и заменяем его на значение из файла

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

git checkout 98x1ad1ebf21731b41397929103aa5247e7f2vx1

Компилируем бинарный файл

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

Инициализируем рабочую директорию

Для правильной работы узлу NEAR требуется рабочий каталог и несколько файлов конфигурации.

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

Эта команда создаст структуру каталогов и сгенерирует config.json, node_key.json genesis.json

Заменяем config.json

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

Устанавливаем AWS Cli

sudo apt-get install awscli -y

Заменяем genesis.json

rm ~/.near/genesis.json
cd ~/.nearw
get https://s3-us-west-1.amazonaws.com/build.nearprotocol.com/nearcore-deploy/shardnet/genesis.json

Активация узла в качестве валидатора

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

near login

Затем скопируйте ссылку и вставьте её в браузер

https://...

Предоставьте полный доступ Near CLI и нажмите "Next", далее "Подключить".

Введите название вашего кошелька и нажмите "Подтвердить". После этого вы увидите такую страницу, это нормально:

Вводим в терминале название кошелька на нажимаем "ENTER".

Проверяем validator_key.json

cat ~/.near/validator_key.json

Если файл validator_key.json отсутствует, выполняем

near generate-key <pool_id>

<pool_id> — -> xx.factory.shardnet.near , где xx это имя вашего пула

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

near generate-key derzky.factory.shardnet.near

Копируем сгенерированный файл в папку shardnet

cp ~/.near-credentials/shardnet/YOUR_WALLET.json
~/.near/validator_key.json

YOUR_WALLET замените на ваше имя, в моём случае команда выглядит следующим образом:

cp ~/.near-credentials/shardnet/derzky.shardnet.near.json
~/.near/validator_key.json

Редактируем validator_key.json

nano ~/.near/validator_key.json
  • Отредактируйте «account_id» => xx.factory.shardnet.near, где xx — имя вашего пула.
  • Измените private_keyнаsecret_key

Содержимое файла должно соответствовать следующему шаблону:

{
 "account_id": "xx.factory.shardnet.near",
 "public_key": "ed25519:HeaBJ3xLgvZacQWmEctTeUqyfSU4SDEnEwckWxd92W2G",
 "secret_key": "ed25519:****"
}

Ctrl+S — сохранить файл
Ctrl+X — закрыть файл

Создаём сервисный файл

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

Вставляем следующий текст в файл:

[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

Отредактирует строки USER, WorkingDirectory, ExecStart под ваши значения

Ctrl+S — сохранить файл
Ctrl+X — закрыть файл

Запускаем узел валидатора

sudo systemctl daemon-reload
sudo systemctl enable neard
sudo systemctl start neard

Отображаем цветные логи

sudo apt install ccze
journalctl -n 100 -f -u neard | ccze -A

Дожидаемся полной синхронизации

Запуск стейкинг пула

Разворачиваем контракт стейкинг пула, шаблон команды:

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=450 --gas=300000000000000

Заменяем на свои данные

  • Pool ID: Имя стейкинг пула. Пример: derzkycapital
  • Owner ID: Shardnet аккаунт. Пример: derzky.shardnet.near
  • Public Key: public key из файла validator_key.json
  • 5: Комиссия, которую будет взимать пул
  • Account Id: Shardnet аккаунт. Обычно совпадает с Owner ID

Видим сообщение об успешном создании пула.
Проверить пул можно здесь.

Создаём cron задачу для автоматического пинга

cd
mkdir scripts
cd scripts
nano ping.sh

В тексте файла прописываем:

#!/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

Редактируем LOGS, POOLID, ACCOUNTID в зависимости от ваших данных.

Создаём новый crontab, запускаемый каждые 5 минут:

crontab -e

Прописываем строку с измененным путем к файлу скрипта:

*/5 * * * * sh /home/<USER_ID>/scripts/ping.sh

Сохраняем и закрываем файл

Список crontab, чтобы увидеть, что он работает:

crontab -l

Смотрим логи:

cat home/<USER_ID>/logs/all.log

Руководство по командам NEAR CLI

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

near proposals

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

near validators current

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

near validators next

Руководство по транзакциям

Депозит и стейкинг NEAR

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

Анстейкинг NEAR. Количество в yoctoNEAR

near call <staking_pool_id> unstake '{"amount": "<amount yoctoNEAR>"}' --accountId <accountId> --gas=300000000000000

Анстейкинг всех NEAR

near call <staking_pool_id> unstake_all --accountId <accountId> --gas=300000000000000

Вывод. Анстейкинг занимает 2–3 эпохи, после чего вы можете вывести в YoctoNEAR из пула. Команда:

near call <staking_pool_id> withdraw '{"amount": "<amount yoctoNEAR>"}' --accountId <accountId> --gas=300000000000000

Команда вывести всё:

near call <staking_pool_id> withdraw_all --accountId <accountId> --gas=300000000000000

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

near call <staking_pool_id> ping '{}' --accountId <accountId> --gas=300000000000000

Общий баланс

near view <staking_pool_id> get_account_total_balance '{"account_id": "<accountId>"}'

Стейкинг баланса

near view <staking_pool_id> get_account_staked_balance '{"account_id": "<accountId>"}'

Анстейкнутый баланс

near view <staking_pool_id> get_account_unstaked_balance '{"account_id": "<accountId>"}'

Доступно для вывода

near view <staking_pool_id> is_account_unstaked_balance_available '{"account_id": "<accountId>"}'

Пауза в стейкинге

near call <staking_pool_id> pause_staking '{}' --accountId <accountId>

Продолжить стейкинг

near call <staking_pool_id> resume_staking '{}' --accountId <accountId>

RPC

Любой узел в сети предлагает службы RPC через порт 3030, если этот порт открыт в брандмауэре узла. Обычно RPC используется для проверки статистики валидатора, версии узла и просмотра доли делегатора, его можно использовать для взаимодействия с блокчейном, учетными записями и контрактами в целом.

Подробнее о многих командах и о том, как их использовать, можно узнать здесь

Общие команды

Версия узла

sudo apt install curl jqcurl -s http://127.0.0.1:3030/status | jq .version

Проверка делегаторов и ставок

near view <your pool>.factory.shardnet.near get_accounts '{"from_index": 0, "limit": 10}' --accountId <accountId>.shardnet.near

Причина отказа валидатора

curl -s -d '{"jsonrpc": "2.0", "method": "validators", "id": "dontcare", "params": [null]}' -H 'Content-Type: application/json' 127.0.0.1:3030 | jq -c '.result.prev_epoch_kickout[] | select(.account_id | contains ("<POOL_ID>"))' | jq .reason

Проверка созданных/ожидаемых блоков

curl -s -d '{"jsonrpc": "2.0", "method": "validators", "id": "dontcare", "params": [null]}' -H 'Content-Type: application/json' 127.0.0.1:3030 | jq -c '.result.current_validators[] | select(.account_id | contains ("POOL_ID"))'