September 5, 2022

NEAR. Stake Wars: Episode III

Near Protocol проводит 3 эпизод программы по привлечению новых валидаторов. В данном руководстве описан процесс запуска валидатора(Chunk-Only Producers).

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

Информация о тестнете.

Заявка на участие.

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

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

NEAR's Discord server

Подготовка оборудования

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

- CPU: 4 CORE
- RAM: 8 GB
- HDD/SSD: 500 GB

Для установки ноды я выбрал Hetzner AX41-NVMe Dedicated Server.
Выбираем операционную систему Linux Ubuntu 20.04

При первом подключении к серверу нам предлагается сменить пароль. Меняем дефолтный пароль на сложный 16 значный (цифры, заглавные буквы, строчные буквы и спец символы . Это важно для безопасности сервера.

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

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

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

Задание 1

Создаём кошелёк, подготавливаем сервер, устанавливаем NEAR CLI.

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

Открываем в браузере https://wallet.shardnet.near.org/
Нажимаем "Создать учетную запись"

Придумываем название и нажимаем "Reserve My Account ID"

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

Сохраняем мнемоническую фразу и вводим её.

Аккаунт создан. Токены на балансе появляются сразу.

Подготовка сервера:

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

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

Проверяем версию Node.js

node -v
#v18.x.x

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

npm -v 
#8.x.x

Устанавливаем и настраиваем 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 clang build-essential make -y
# загружаем установочный скрипт Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

На вопрос отвечаем "y"

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

Активируем среду Rust для текущей оболочки

source ~/.cargo/env

Установка 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

Задание 2

Разворачиваем ноду, загружаем снапшот, синхронизируем его, активируем ноду как валидатор.

Установка ноды.

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

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

Далее смотрим актуальный <commit> здесь и копируем значение в команду

git checkout <commit>

На момент написания commit - 1897d5144a7068e4c0d5764d8c9180563db2fe43
и команда выглядит так

git checkout 1897d5144a7068e4c0d5764d8c9180563db2fe43

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

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

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

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

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

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

genesis.json - файл со всеми данными, с которыми сеть начала свою работу в genesis. Он содержит начальные счета, контракты, ключи доступа и другие записи, которые представляют собой начальное состояние блокчейна. Файл genesis.json - это моментальный снимок состояния сети в определенный момент времени. В нем содержатся контакты счетов, балансы, активные валидаторы и другая информация о сети.

node_key.json - Файл, содержащий открытый и закрытый ключ для узла. Также включает необязательный параметр account_id, который требуется для запуска узла валидатора (не рассматривается в данном документе).

data/ - Папка, в которую узел NEAR будет записывать свое состояние.

Стандартный конфиг файл необходимо заменить на новый с модифицированными параметрами

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 ~/.near
wget https://s3-us-west-1.amazonaws.com/build.nearprotocol.com/nearcore-deploy/shardnet/genesis.json

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

pip3 install awscli --upgrade

Сделаем цветные логи (это не обязательно)

sudo apt install ccze

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

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

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

После синхронизации выходим из логов с помощью "ctr+c" и продолжаем выполнение задания.

Настройка узла в качестве валидатора.

Чтобы предоставить доступ к нашему кошельку вводим команду

near login

Копируем ссылку в браузер

На сайте кошелька нажимаем продолжить и вводим название вашего аккаунта в формате имя_аккаунта.shardnet.near и подтвердить.

После предоставления доступа видим такую страницу. Переходим в консоль.

В консоль водим: имя_аккаунта.shardnet.near
Происходит генерация ключей, в терминале вы увидите successfully

Проверим validator_key.json

cat ~/.near/validator_key.json

Если validator_key.json отсутствует, вводим команду генерации ключа доступа (без скобок)

near generate-key <pool_id>
#Где <pool_id> соответствует формату <Название_вашего_пула>.factory.shardnet.near

Копируем сгенерированный файл в папку ~/.near/. Обязательно заменяем <pool_id> на свой accountId

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

Открываем сгенерированный файл в редакторе nano

nano /home/.near/validator_key.json

Редактируем «account_id» => xx.factory.shardnet.near, где xx — имя вашего пула.
Меняем private_key на secret_key

Account_id должен совпадать с именем контракта пула ставок, иначе вы не сможете подписывать блоки.

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

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

Ctr+o -> y -> enter
Ctr+x

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

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

Смотрим логи

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

Задание 3

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

Чтобы запустить валидатор на NEAR, пул стейкинга должен быть развернут на учетной записи NEAR и интегрирован в узел валидатора NEAR. Делегаты должны использовать пользовательский интерфейс или командную строку, чтобы делать ставки в пул. Пул стейкинга - это смарт-контракт, развернутый на учетной записи 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

В приведенном выше примере вам нужно заменить:

pool id: здесь вводим само название пула, без shardnet.near, то есть в моем случае просто "physical_bear_pool".

owner id: Здесь вводим имя владельца пула уже с shardnet.near, то есть в моем случае "physical_bear.shardnet.near"

AccountId: Здесь нужно ввести имя кошелька, то есть в моем случае "physical_bear.shardnet.near".

Public Key: Открытый ключ из вашего файла validator_key.json

5: плата которую взимает пул в %

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

near call factory.shardnet.near create_staking_pool '{"staking_pool_id": "physical_bear_pool", "owner_id": "physical_bear.shardnet.near", "stake_public_key": "ed25********************************************37Az", "reward_fee_fraction": {"numerator": 5, "denominator": 100}, "code_hash":"DD428g9eqLL8fWUxv8QSpVFzyHi1Qd16P8ephYCTmMSZ"}' --accountId="physical_bear.shardnet.near" --amount=450 --gas=300000000000000

Вы можете изменить размер комиссии, которую вы берете за стейкинг

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

Измените значение numerator, при условии что denominator = 100, numenator = 1, это 1%. Вы можете изменять числитель и знаменатель в любых пропорциях. Здесь pool_id,account_id полные.

После успешного создания стейкинг пула, вы сможете найти себя в списке

Так же вы можете посмотреть заявки всех валидаторов и найти там себя

near proposals

Для поиска

ctr+shift+f

На этом создание пула для стейкинга закончено.

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

Добавить в стейкинг:

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

Снять со стейкинга:

near call <pool_id> unstake '{"amount": "<amount yoctoNEAR>"}' --accountId <accountId> --gas=300000000000000
#yoctoNEAR = количество near+24нуля например 5 near= 5*10^24 yoctoNEAR

Разблокировать из стейкинга:

near call <pool_id> withdraw '{"amount": "<amount yoctoNEAR>"}' --accountId <accountId> --gas=300000000000000
#yoctoNEAR = количество near+24нуля например 5 near= 5*10^24 yoctoNEAR

Пинг необходим для обновления новых предложений и баланса для делегаторов:

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

Баланс стейкинга:

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

Баланс анстейкинга:

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

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

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

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

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

near proposals

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

near validators current

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

near validators next

Задание 4

Настроить инструменты для мониторинга состояния узла. Установите и используйте RPC на порту 3030, чтобы получать полезную информацию для поддержания работы вашего узла.

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

Файл журнала хранится либо в каталоге ~/.nearup/logs, либо в systemd, в зависимости от вашей настройки.

Проверим логи данной командой

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

Разберём запись журнала:

INFO stats: # 3178993 2K6zVcqbAty4SQMgwNRpNv1X5rxcAMvj8hHqJopgsbGt Validator | 100 validators 19 peers ⬇ 429 kB/s ⬆ 1.49 MB/s 0.00 bps 0 gas/s CPU: 145%, Mem: 3.98 GB

Validator: “Validator” указывает, что вы являетесь активным валидатором

100 validators: Всего 100 валидаторов в сети.

19 peers: У нас сейчас 19 пиров. Вам нужно как минимум 3 коллеги, чтобы достичь консенсуса и начать проверку

Следите чтобы номера блоков двигались.

RPC

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

Подробнее о многих командах и о том, как их использовать, можно узнать здесь:
https://docs.near.org/docs/api/rpc

Установите необходимые утилиты, если ещё этого не сделали

sudo apt install curl jq

Основные команды

Проверить версию своего узла:

curl -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

В двух следующих командах нужно писать только ник вместо pool_id, то есть, в моем случае просто physical_bear.

Узнать причину, по которой вас собираются исключить из валидаторов:

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 -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 ("POOL_ID"))'

На этом можно считать 4 задание выполненным.