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 сентября попросили не тушить ноды
Website
Discord
Оглавление
- Задание 1.1: Подготовка сервера
- Задание 1.2: Создание кошелька
- Задание 2.1: Установка ноды
- Задание 2.2 Активация ноды и создание валидатора
- Задание 3: Настройка стекинг пула
- Задание 4: Проверка и мониторинг
- Задание 5. Установка ноды на облачном сервере
- Задание 6. Настройка автоматического пинга
- Задание 8. Разворачивание смарт контракта
- Задание 9. Аптайм
- Задание 13. Бэкап-нода
- Обновление
- Удаление ноды
- Полезные ссылки и команды
Задание 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
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"
# устанавливаем необходимые пакеты 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
systemctl restart cron
systemctl status cron
Через пару часов проверяем логи
cat /root/logs/all.log
Для подтверждения задания отправляем в форму скриншот транзакций и ссылку на свой пул
Задание 8. Разворачивание смарт контракта
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