Сompleted testnets
July 26, 2022

NEAR: Stakewars installation guide (Testnet is over)

Near Protocol запускает третий эпизод тестнета Stake Wars, целью которого является децентрализация сети NEAR, путем привлечение новых валидаторов. Анонсированные награды составляют 50к $NEAR на ноду в мейнете и 500 $NEAR токенов за успешное выполнение всех заданий. Думаю, описывать что такое Near Protocol не имеет смысла, поэтому читаем информацию о тестнете, подаем заявку на участие по ссылке. Удачи и да прибудет с Вами Web3.

Список заданий

Форма для сдачи выполненных заданий

Обсуждаем и делимся мнением в дискорде Nodera

Гайд актуален для коммита 1897d5144a7068e4c0d5764d8c9180563db2fe43 (02.09.2022)

Тестнет завершен!! Ждем объявления результатов, до 17 сентября попросили не тушить ноды

DYOR:

Website
Twitter
Discord

Оглавление


Задание 1.1: Подготовка сервера

Оглавление

Минимальные требования к серверу составляют:

CPU: 4-Core, RAM: 8GB DDR4, Storage: 500GB SSD

Я установил на сервере Hetzner - CPX31. На данном сервере всего 160GB, поэтому если ставите также, следим за заполнением (команда df) и заблаговременно увеличиваем хранилище.

Стоимость аренды сервера - 12 евро, при расширении хранилища до 500GB - 25 евро.

Если устанавливаете на другом сервере, проверьте подходит ли выбранный сервер для установки ноды

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

Если выдает "Supported" продолжаем установку

Обновляем пакеты

sudo apt update && sudo apt upgrade -y

Устанавливаем инструменты разработчика, Node.js, npm и другие необходимые пакеты

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 llvm cargo
sudo apt install clang build-essential make
sudo apt install curl jq
curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -  
sudo apt install nodejs
PATH="$PATH"

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

node -v
#v18.x.x
npm -v
#8.x.x

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

sudo npm install -g near-cli

Настраиваем окружение. Текущий тестнет проходит в сети shardnet. Вводим название сети в качестве переменной

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

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

sudo apt install python3-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
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Выбираем пункт 1) продолжить установку (по умолчанию).

# активируем среду Rust для текущей оболочки
source ~/.profile
source ~/.cargo/env

Задание 1.2: Создание кошелька

Оглавление

Заходим по ссылке https://wallet.shardnet.near.org/ и создаем кошелек NEAR для тестовой сети. Сохраняем мнемонику в надежном месте. Запоминаем имя кошелька, он же Account_ID.


Задание 2.1: Установка ноды

Оглавление

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

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

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

git checkout 1897d5144a7068e4c0d5764d8c9180563db2fe43

Собираем бинарные файлы

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

Создаем сервисный файл. Я устанавливал ноду под суперпользователем, так как на сервере будет только одна нода. Если вы используете другого пользователя, в сервисном файле меняем root на имя вашего пользователя.

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

Смотрим логи и ждем пока нода найдет пиры, загрузит хедеры и синхронизируется. Это может занять больше часа

journalctl -n 100 -f -u neard

Проверяем синхронизацию

curl -s http://127.0.0.1:3030/status | jq .sync_info

Дополнительно: можно добавить цвета в вывод логов

sudo apt install ccze

Проверка логов в цвете

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

Задание 2.2 Активация ноды и создание валидатора

Оглавление

Запускаем команду

near login

Копируем ссылку и открываем в браузере, в котором устанавливали кошелек в первом задании

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

Переходим в терминал и вводим имя кошелька (Account_ID).

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

near generate-key <ACCOUNT_ID> 
#ACCOUNT_ID должен быть в формате xxx.shardnet.near
#Например: trdm.shardnet.near

Сгенерируется JSON файл, в котором нужно скопировать публичный ключ

nano /root/.near-credentials/shardnet/<ACCOUNT_ID>.shardnet.near.json

Копируем "public_key" и нажимаем Ctrl + X для выхода из редактора

В ссылке ниже заменяем <public_key> на скопированный ключ и открываем в браузере

https://wallet.shardnet.near.org/login/?referrer=NEAR+CLI&public_key=<public_key>&success_url=http://127.0.0.1:5000/

Продолжаем установку

Важно! В настоящий момент получить токены невозможно

Для дальнейшего удобства использования команд, создаем переменные моникера, ID пула и ID аккаунта. Заменяем <MONIKER> на свой ник.

MONIKER=<MONIKER>
POOL=<MONIKER>.factory.shardnet.near
ACCOUNT_ID=<MONIKER>.shardnet.near

Сохраняем переменные, перезагружаем .bash_profile и проверяем значения переменных

echo "export MONIKER="${MONIKER}"" >> $HOME/.bash_profile
echo "export POOL="${POOL}"" >> $HOME/.bash_profile
echo "export ACCOUNT_ID="${ACCOUNT_ID}"" >> $HOME/.bash_profile

source $HOME/.bash_profile

echo -e "\nmoniker > ${MONIKER}.\n"
echo -e "\npool > ${POOL}.\n"
echo -e "\naccount_id > ${ACCOUNT_ID}.\n"

Создаем ключ валидатора

near generate-key $POOL

Заходим в файл и меняем слово private_key на secret_key

nano ~/.near-credentials/shardnet/$POOL.json

Нажимаем Ctrl + X и подтверждаем изменения

Копируем ключ в папку тестнета

cp ~/.near-credentials/shardnet/$POOL.json ~/.near/validator_key.json

Перезапускаем ноду

sudo systemctl daemon-reload
sudo systemctl enable neard
sudo systemctl restart neard

Задание 3: Настройка стекинг пула

Оглавление

Вызываем стекинг пул фэктори, создаем и разворачиваем новый стекинг пул. Важно! Заменяем <MONIKER> и <ACCOUNT_ID> (в моем случае: <MONIKER> - trdm; <ACCOUNT_ID> - trdm.shardnet.near). Вместо <public key> вставляем ключ из файла validator_key.json

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

Дополнительно! Для изменения настроек пула, например изменения комиссии, воспользуемся следующей командой

NEAR_ENV=shardnet near call $POOL update_reward_fee_fraction '{"reward_fee_fraction": {"numerator": 1, "denominator": 100}}' --accountId $ACCOUNT_ID --gas=300000000000000

При условии корректного исполнения программы, выведется хэш транзакции и ссылка на транзакцию в эксплорере:


Теперь можем застейкать еще токенов. В моем случае 500.

NEAR_ENV=shardnet near call $POOL deposit_and_stake --amount 500 --accountId $ACCOUNT_ID --gas=300000000000000

Важно! Оставьте немного токенов в кошельке для оплаты комиссий.


Задание 4: Проверка и мониторинг

Оглавление

Найти своего валидатора можно в эксплорере по ссылке: https://explorer.shardnet.near.org/nodes/validators

Проверка логов

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

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

curl -s http://127.0.0.1:3030/status | jq .version

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

near view $POOL get_accounts '{"from_index": 0, "limit": 10}' --accountId $ACCOUNT_ID

Проверка произведенных блоков. Заменить <POOL> на адрес своего пула в формате xxx.factory.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.current_validators[] | select(.account_id | contains ("<POOL>"))'

Задание 5. Установка ноды на облачном сервере

Оглавление

В данном задании Вам нужно написать статью в Medium, Github или Teletype, в которой описывается информация об используемом сервере (провайдер, характеристики, стоимость и т.д.), а также все ваши действия по выполнению 1-4 заданий с пошаговым описанием и скриншотами.


Задание 6. Настройка автоматического пинга

Оглавление

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

mkdir logs
mkdir scripts
cat > /root/scripts/ping.sh
#!/bin/sh
# Ping call to renew Proposal added to crontab

export NEAR_ENV=shardnet
export POOL=$POOL
export ACCOUNT_ID=$ACCOUNT_ID
export MONIKER=$MONIKER
export LOGS=/root/logs

echo "---" >> $LOGS/all.log
date >> $LOGS/all.log
near call $POOL ping '{}' --accountId $ACCOUNT_ID --gas=300000000000000 >> $LOGS/all.log
near proposals | grep $MONIKER >> $LOGS/all.log
near validators current | grep $MONIKER >> $LOGS/all.log
near validators next | grep $MONIKER >> $LOGS/all.log

# нажимаем CTRL + D для сохранения и выхода из редактора

Создаем новый crontab, запускающий наш скрипт каждые 2 часа

crontab -e

Копируем команду и вставляем в файл

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

Перезапускаем cron

systemctl restart cron

Проверяем активен ли cron

systemctl status cron

Через пару часов проверяем логи

cat /root/logs/all.log

Для подтверждения задания отправляем в форму скриншот транзакций и ссылку на свой пул


Задание 8. Разворачивание смарт контракта

Оглавление

Обновляем Rust

curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env

Добавляем набор wasm32-unknown-unknown

rustup target add wasm32-unknown-unknown

Клонируем репозиторий и компилируем смарт контракт

git clone https://github.com/zavodil/near-staking-pool-owner
cd near-staking-pool-owner/contract
rustup target add wasm32-unknown-unknown
cargo build --target wasm32-unknown-unknown --release

Разворачиваем смарт контракт на своей учетной записи

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

Создаем новый кошелек, на который будем отправлять часть доходов https://wallet.shardnet.near.org/. Сохраняем мнемонику в надежном месте.

Инициализируем учетные записи для разделения доходов. Вносим изменения в команду:

  • <POOL>: адрес вашего стекинг пула (например: trdm.factory.shardnet.near)
  • <ACCOUNT_ID>: адрес основного кошелька (например: trdm.shardnet.near)
  • <REWARDS_ACCOUNT_1>: адрес первого кошелька для наград. Я использую свой основной кошелек (trdm.shardnet.near)
  • <REWARDS_ACCOUNT_2>: адрес второго кошелька для наград (trdm_rewards.shardnet.near)

Также можно изменить распределение дохода между кошельками, изменив показатели numerator и denominator. В данной команде используется распределение 50/50.

NEAR_ENV=shardnet near call $ACCOUNT_ID new '{"staking_pool_account_id": "<POOL>", "owner_id":"<ACCOUNT_ID>", "reward_receivers": [["<REWARDS_ACCOUNT_1>", {"numerator": 50, "denominator":100}], ["<REWARDS_ACCOUNT_2>", {"numerator": 50, "denominator":100}]]}' --accountId $ACCOUNT_ID

Успешный вывод выглядит следующим образом

По прошествии одной эпохи (8 часов) можно вывести токены, используя следующую команду

NEAR_ENV=shardnet near call $ACCOUNT_ID withdraw '{}' --accountId $ACCOUNT_ID --gas 200000000000000
# {} выведет все токены из стейка. После успешной транзакции, застейкать токены заново

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


Задание 9. Аптайм

Оглавление

Для успешного выполнения задания ваш влидатор должен иметь аптайм выше 70%. Проверить аптайм можно по ссылке, после открытия 3030 порта.

Открываем порты

ufw enable
ufw allow 3030
ufw allow 22

Проверяем открылся ли порт

ufw status

Заходим по ссылке http://<ваш_ip>:3030/statusи делаем скриншот для отправки в форму.

После этого заходим на сайт https://openshards.io/shardnet-uptime-scoreboard/, ждем когда аптайм станет более 70%, делаем скриншот и заполняем форму.

Аптайм считается по следующей формуле:
% chunks online = (CHUNKS PRODUCED / CHUNKS EXPECTED) * (VALIDATED EPOCHS / TOTAL EPOCHS)


Задание 13. Бэкап-нода

Оглавление

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

Важно! Данное задание прошу внимательно изучить перед установкой и попытаться понять какие действия выполняются. Если две ноды будут работать одновременно с одним ключем, произойдет двойное подписание блока - самое страшное, что может случится с вашим валидатором. Валидатор будет навсегда помещен в тюрьму без возможности восстановления, а средства - утеряны.

Создаем папку для бэкап ноды, скачиваем и собираем бинарные файлы

mkdir backup_node
cd backup_node
git clone https://github.com/near/nearcore
cd nearcore
git fetch origin --tags
git checkout 1897d5144a7068e4c0d5764d8c9180563db2fe43 
cargo build -p neard --release

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

printf "[Unit]
Description=NEARBACKUPd Daemon Service

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

[Install]
WantedBy=multi-user.target" > /etc/systemd/system/nearbackupd.service

Создаем папки для хранения ключей

cd
mkdir reserve_keys
cd reserve_keys
mkdir main
mkdir backup

Копируем ключи от основной ноды в резервную папку

cd
cp /root/.near/validator_key.json /root/reserve_keys/main
cp /root/.near/node_key.json /root/reserve_keys/main

Останавливаем основную ноду

sudo systemctl stop neard

Удаляем ключи, генезис и конфиг файлы (это нужно для того, чтобы с генерировать node_key бэкап ноды). Несмортя на то, что мы скопировали ключи основной ноды в папку на сервере, советую сохранить их на ваш компьютер

rm /root/.near/genesis.json
rm /root/.near/node_key.json
rm /root/.near/config.json

Инициализируем бэкап-ноду

/root/backup_node/nearcore/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

Переносим ключи бэкап-ноды в папку с резервными ключами

cp /root/.near/validator_key.json /root/reserve_keys/backup
cp /root/.near/node_key.json /root/reserve_keys/backup

Возвращаем ключ основной ноды и проверяем работоспособность

cp /root/reserve_keys/main/node_key.json /root/.near 
sudo systemctl restart neard && journalctl -n 100 -f -u neard | ccze -A|grep INFO 

Теперь мы готовы выполнять задание. Для подтверждения задания необходимо сделать скриншот всех ваших следующих действий.

sudo systemctl stop neard
cat .near/node_key.json|grep public_key
rm /root/.near/node_key.json
rm /root/.near/validator_key.json
cp /root/reserve_keys/backup/validator_key.json /root/.near
cp /root/reserve_keys/backup/node_key.json /root/.near
cat .near/node_key.json|grep public_key
sudo systemctl daemon-reload
sudo systemctl enable nearbackupd
sudo systemctl restart nearbackupd && journalctl -f -u nearbackupd | ccze -A|grep INFO

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

Задание выполнено. Форма для подтверждения этого задания- https://docs.google.com/forms/d/e/1FAIpQLSfZV6_SUpdAMlOOjpwQSVa0xUcvCjO5iiNG3k9KrGDvCEEw3w/viewform

Теперь ваш валидатор работает на бэкап-ноде. Можно спокойно обновлять и делать другие действия с основной нодой, это не повлияет на работу вашего валидатора.

Для возврата на основную ноду выполните следующие команды

cd
sudo systemctl stop nearbackupd
cat .near/node_key.json|grep public_key
rm /root/.near/node_key.json
rm /root/.near/validator_key.json
cp /root/reserve_keys/main/validator_key.json /root/.near
cp /root/reserve_keys/main/node_key.json /root/.near
cat .near/node_key.json|grep public_key
sudo systemctl restart neard && journalctl -f -u neard | ccze -A|grep INFO

Еще раз хочу вас предупредить про двойное подписание блока, будьте внимательны!


Обновление

Оглавление

Останавливаем ноду

sudo systemctl stop neard

Подтягиваем новую версию и собираем бинарные файлы

export NEAR_ENV=shardnet
echo 'export NEAR_ENV=shardnet' >> ~/.bashrc
cd ~/nearcore
git fetch
git checkout 1897d5144a7068e4c0d5764d8c9180563db2fe43
cargo build -p neard --release --features shardnet

Скачиваем новый файл конфига

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

Если при выполнении команды cargo возникает ошибка версии Rust

Обновляем раст и запускаем cargo заново

curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env
cargo build -p neard --release --features shardnet

Перезапускаем ноду и ждем окончания синхронизации

Важно!! Если на время обновления вы переносили валидатора на бэкап-ноду, используйте вместо neard - nearbackupd, либо поменяйте ключи до старта сервиса

sudo systemctl start neard && journalctl -n 100 -f -u neard | ccze -A

В логах может быть куча сообщений с текстом "missing chunks". Проверяем логи командой, если блоки совпадают с эксплорером и увеличиваются, всё ок.

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

Удаление ноды

Оглавление

Перед удалением сохраняем следующие файлы и папки

$HOME/.near/node_key.json
$HOME/.near/validator_key.json
$HOME/.near-credentials/shardnet
#если выполняли 13-е задание, то дополнительно сохраняем папку
$HOME/reserve_keys

Останавливаем сервис и удаляем ноду

systemctl stop neard && systemctl disable neard
rm -rf $HOME/nearcore
rm -rf $HOME/.near
rm -rf $HOME/.near-config
rm -rf $HOME/.near-credentials
systemctl daemon-reload
#если выполняли 6-е задание дополнительно выполняем команды
rm -rf $HOME/scripts
rm -rf $HOME/logs
#если выполняли 8-е задание дополнительно выполняем команды
rm -rf $HOME/near-staking-pool-owner
#если выполняли 13-е задание дополнительно выполняем команды
systemctl stop nearbackupd && systemctl disable nearbackupd
rm -rf $HOME/backup_node
rm -rf $HOME/reserve_keys
systemctl daemon-reload

Полезные ссылки и команды

Оглавление

Кошелек: https://wallet.shardnet.near.org/

Эксплорер: https://explorer.shardnet.near.org/

Проверка логов

journalctl -n 100 -f -u neard

Перезапуск ноды

sudo systemctl restart neard

Проверка баланса

near view $POOL get_account_total_balance '{"account_id": "<MONIKER>.shardnet.near"}'

Анстейк токенов

#определенное количество
near call $POOL unstake '{"amount": "<amount yoctoNEAR>"}' \
--accountId $ACCOUNT_ID --gas=300000000000000

#все
near call $POOL unstake_all --accountId $ACCOUNT_ID \
--gas=300000000000000

Вывод токенов

#определенное количество
near call $POOL withdraw '{"amount": "<amount yoctoNEAR>"}' \
--accountId $ACCOUNT_ID --gas=300000000000000

#все
near call $POOL withdraw_all --accountId $ACCOUNT_ID \
--gas=300000000000000

Список активных валидаторов текущей эпохи

near validators current

Список валидаторов, чей пропозал принят и которые будут активны в следующей эпохе

near validators next

Nodera

Telegram | Discord | Twitter