NEAR: Stake Wars
Challenge 001: Подготавливаем сервер
Для начала проверим, все ли обновления установлены:
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.js и npm. Должно быть node.js ≥ v18.x.x и npm ≥ 8.x.x:
node -v
npm -v

Устанавливаем NEAR-Cli
sudo npm install -g near-cli

Настраиваем окружение. Текущий тестнет проходит в сети shardnet. Вводим название сети в качестве переменной:
export NEAR_ENV=shardnet
Также запускаем эти команды, чтобы установить постоянную среду рядом с тестовой сетью:
echo ‘export NEAR_ENV=shardnet’ >> ~/.bashrc
echo ‘export NEAR_ENV=shardnet’ >> ~/.bash_profile
source $HOME/.bash_profile
Challenge 002: Устанавливаем ноду
Заявленные разработчиком характеристики сервера:

Арендуем сервер у HETZNER (CPX31 + дополнительное место 500 Гб):

Проверяем подходит ли выбранный сервер для установки ноды:
lscpu | grep -P ‘(?=.*avx )(?=.*sse4.2 )(?=.*cx16 )(?=.*popcnt )’ > /dev/null \
&& echo “Supported” \
|| echo “Not supported”

Устанавливаем дополнительные инструменты разработчика:
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

Настраиваем Python pip:
USER_BASE_BIN=$(python3 -m site — user-base)/bin
export PATH=”$USER_BASE_BIN:$PATH”

Готовим систему к установке Rust:
sudo apt install curl build-essential gcc make -y

Устанавливаем Rust & Cargo:
curl — proto ‘=https’ — tlsv1.2 -sSf https://sh.rustup.rs | sh

Активируем среду Rust для текущей оболочки:
source ~/.profile
source ~/.cargo/env
Клонируем репозиторий с нодой:
git clone https://github.com/near/nearcore
cd nearcore
git fetch

Проверяем коммит. Актуальный коммит можно найти по ссылке https://github.com/near/stakewars-iii/blob/main/commit.md
git checkout c1b047b8187accbf6bd16539feb7bb60185bdc38

Собираем бинарные файлы:
cargo build -p neard — release — features shardnet

Инициируем ноду и загружаем генезис файл:
./target/release/neard — home ~/.near init — chain-id shardnet — download-genesis

Заменяем конфиг файл новым, с модифицированными параметрами:
rm ~/.near/config.json
wget -O ~/.near/config.json https://s3-us-west-1.amazonaws.com/build.nearprotocol.com/nearcore-deploy/shardnet/config.json

Создаем сервисный файл. Мы устанавливали ноду под суперпользователем, так как на сервере будет только одна нода:
printf “[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” > /etc/systemd/system/neard.service

Запускаем ноду:
sudo systemctl daemon-reload
sudo systemctl enable neard
sudo systemctl restart neard

Смотрим логи, ждем пока наша нода найдет пиры, загрузит хедеры и синхронизируется. Пишут, что это может занять около часа, но фактически проходит за 20–25 минут:
journalctl -n 100 -f -u neard

Проверяем синхронизацию ноды:
curl -s http://127.0.0.1:3030/status | jq .sync_info

Если кто любит цветные логи, то:
journalctl -n 100 -f -u neard | ccze -A
Активируем нашу ноду и создаем валидатор
Запускаем команду:
near login
Копируем ссылку и открываем в браузере, в котором устанавливали кошелек.
Вводим Account_ID и даем все необходимые разрешения, после того как страница выдаст ошибку соединения, возвращаемся в консоль и вводим имя кошелька.

Создаем ключ валидатора (в формате: name.factory.shardnet.near):
near generate-key ccg.factory.shardnet.near

Заходим в созданный файл и меняем слово private_key на secret_key:
nano ~/.near-credentials/shardnet/ccg.factory.shardnet.near.json

Копируем данный файл в папку тестнета:
cp ~/.near-credentials/shardnet/ccg.factory.shardnet.near.json ~/.near/validator_key.json
Перезапускаем ноду:
sudo systemctl daemon-reload
sudo systemctl enable neard
sudo systemctl restart neard
Challenge 003: Настройка стейкинг пула
Вызываем стейкинг пул фэктори, создаем и разворачиваем новый стейкинг пул. Важно! Для “staking_pool_id” в параметре указываем только “ccg”, а “.factory.shardnet.near” будет добавлено автоматически. Для “owner_id” и “accountId” указываем “ccg.shardnet.near”. Для “stake_public_key” вставляем ключ из файла validator_key.json
NEAR_ENV=shardnet near call factory.shardnet.near create_staking_pool ‘{“staking_pool_id”: “ccg”, “owner_id”: “ccg.shardnet.near”, “stake_public_key”: “ed25519:7VZmhcyLQECfLy9zkGBMAjzAhDmS25bG8h1aMszPYSaj”, “reward_fee_fraction”: {“numerator”: 5, “denominator”: 100}, “code_hash”:”DD428g9eqLL8fWUxv8QSpVFzyHi1Qd16P8ephYCTmMSZ”}’ — accountId=”ccg.shardnet.near” — amount=30 — gas=300000000000000

Немного изменим параметры комиссии нашего пула:
near call ccg.factory.shardnet.near update_reward_fee_fraction ‘{“reward_fee_fraction”: {“numerator”: 1, “denominator”: 100}}’ — accountId ccg.shardnet.near — gas=300000000000000

Challenge 004: Проверка и мониторинг ноды
Лог можно посмотреть так:
journalctl -n 100 -f -u neard | ccze -A

Проверяем версию нашей ноды:
curl -s http://127.0.0.1:3030/status | jq .version

Проверка делегатора:
near view ccg.factory.shardnet.near get_accounts ‘{“from_index”: 0, “limit”: 10}’ — accountId ccg.shardnet.near

Проверяем причину kick-а валидатора:
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 (“ccg”))’ | jq .reason
Проверка произведенных блоков:
curl -r -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 (“ccg”))’
Challenge 005: Установка ноды на облачном сервере
Арендуем сервер у HETZNER (CPX31 + дополнительное место 500 Гб):

Стоимость аренды сервера: 12 евро/мес. (с учетом доп. 500 Гб получается 26 евро/мес.)