NEAR. Stake Wars: Episode III
Near Protocol проводит 3 эпизод программы по привлечению новых валидаторов. В данном руководстве описан процесс запуска валидатора(Chunk-Only Producers).
Форма сдачи выполненных заданий.
Подготовка оборудования
Минимальные требования к серверу:
- 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 -v #v18.x.x
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"
# устанавливаем необходимые пакеты sudo apt install clang build-essential make -y # загружаем установочный скрипт Rust curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Выбираем пункт 1) Продолжить установку (по умолчанию)
Активируем среду Rust для текущей оболочки
source ~/.cargo/env
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
sudo apt-get install awscli -y
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
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:****"
}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 yoctoNEARnear 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=300000000000000near 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 на порту 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"))'