- Покупка сервера
- Создание кошелька
- Установка NEAR-CLI
- Настройка ноды
- Становимся валидатором
- Установка стейкинг пула
- Инструкция по транзакциям
- Пинг
- Мониторинг
- Подключение мониторинга
В первую очередь нужно определиться с сервером, на котором будем разворачивать ноду NEAR. Мы решили остановиться на HETZNER, т.к. у провайдера демократичные цены и высокая надежность.
Минимальные требования для запуска ноды NEAR следующие:
- CPU 4-ядерный процессор с поддержкой
- AVX RAM 8GB DDR4
- STORAGE 500GB SSD
Соответственно выбираем тот сервер, который равен по характеристикам или превосходит их. В нашем случае это был сервер AX101.
- Перемещаемся к окну конфигурации сервера, где выбираем его локацию, операционную систему, уточняем характеристики и цену. Убедившись, что всё на месте, переходим к покупке сервера, нажав на кнопку ORDER NOW:
В первую очередь нам нужно создать кошелек по этому адресу — https://wallet.shardnet.near.org/
Для этого проделываем следующие шаги:
- Для начала, давайте убедимся, что машина Linux обновлена:
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 -y build-essential nodejs
PATH="$PATH"
- Проверяем версию
Node.js
иnpm
:
node -v
⚠️ Требуемая версия v18.x.x или выше
npm -v
⚠️ Требуемая версия v8.x.x или выше
- Переходим к непосредственной установке 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
После завершения, мы сможем пользоваться базовыми командами NEAR-CLI, такими как:
- Перед началом работы убедимся, что наша машина имеет нужные характеристики:
lscpu | grep -P '(?=.*avx )(?=.*sse4.2 )(?=.*cx16 )(?=.*popcnt )' > /dev/null \
&& echo "Supported" \
|| echo "Not supported"
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 или docker.io на Ubuntu, выполните следующую команду:
sudo apt install python3
sudo apt install docker-ce
- Установка Python pip:
sudo apt install python3-pip
- Настройка конфигурации:
USER_BASE_BIN=$(python3 -m site --user-base)/bin
export PATH="$USER_BASE_BIN:$PATH"
- Установка Building env:
sudo apt install clang build-essential make
- Установка Rust & Cargo:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
При установке увидим следующее: |
---|
Выбираем 1 и нажимаем Enter
- Выполняем команду:
source $HOME/.cargo/env
- Клонируем репозиторий nearcore:
git clone https://github.com/near/nearcore
cd nearcore
git fetch
- Для актуального коммита пройди по этой ссылке. Далее переходим к необходимому коммиту:
git checkout <commit>
- В папке
nearcore
запускаем следующие команды:
cargo build -p neard --release --features shardnet
Компиляция бинарника nearcore может занять некоторое время |
---|
- Для правильной работы ноды NEAR требуется рабочий каталог и несколько конфигурационных файлов. Создаем начальный рабочий каталог, выполнив команду:
./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.json
это снимок состояния сети в определенный момент времени. В нем содержатся контакты счетов, балансы, активные валидаторы и другая информация о сети.node_key.json
— Файл, содержащий открытый и закрытый ключ для ноды. Также включает необязательный параметрaccount_id
, который требуется для запуска ноды валидатора (не рассматривается в данном документе).data/
— Папка, в которую узел NEAR будет записывать свое состояние.
В сгенерированном config.json
есть два параметра, которые необходимо изменить:
boot_nodes
: Если вы не указали загрузочные ноды, сгенерированныйconfig.json
покажет пустой массив, поэтому нам нужно будет заменить его на полный массив с указанием загрузочных нод.tracked_shards
: Это поле будет пустым, в сгенерированном файлеconfig.json
. Нам нужно заменить его на"tracked_shards": [0]
rm ~/.near/config.json
wget -O ~/.near/config.jsonhttps://s3-us-west-1.amazonaws.com/build.nearprotocol.com/nearcore-deploy/shardnet/config.json
- Следующим шагом запускаем ноду:
cd ~/nearcore
./target/release/neard --home ~/.near run
Теперь нода запущена, и вы можете видеть логи в консоли. Ваша нода должна найти пиры, загрузить хедеры до 100%, а затем загружать блоки.
Для подписания транзакций через NEAR-CLI необходимо установить полный ключ доступа, а для этого нужно авторизоваться в кошельке на локальном уровне.
- Выполняем команду, которая запустит веб-браузер, позволяя разрешить копирование ключа полного доступа:
- Проверяем файл
validator_key.json
командой:
cat ~/.near/validator_key.json
Если файл validator_key.json
отсутствует, выполняем следующие шаги для его создания:
- Генерируем ключ пула
near generate-key <pool_id>
<pool_id> — xx.factory.shardnet.near, где 'хх' имя нашего пула
- Копируем сгенерированный файл в папку
shardnet
. Убеждаемся, что заменили<pool_id>
на нашaccount_id
cp ~/.near-credentials/shardnet/YOUR_WALLET.json ~/.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:****"
}
- Запускаем ноду валидатора как сервис:
sudo vi /etc/systemd/system/neard.service
- Вставляем:
[Unit]
Description=NEARd Daemon Service
[Service]
Type=simple
User=<USER>
#Group=near
WorkingDirectory=/home/<USER>/.near
ExecStart=/home/<USER>/nearcore/target/release/neard run
Restart=on-failure
RestartSec=30
KillSignal=SIGINT
TimeoutStopSec=45
KillMode=mixed
[Install]
WantedBy=multi-user.target
Где <USER> — имя нашего пользователя.
- Команда активации сервиса:
sudo systemctl enable neard
- Команда запуска сервиса:
sudo systemctl start neard
- Если нам нужно внести изменения в сервис из-за ошибки в файле, то его необходимо перезагрузить:
sudo systemctl reload neard
- Посмотреть логи работы ноды можно следующей командой:
journalctl -n 100 -f -u neard
- А чтобы логи имели человеческий вид, выполняем команду:
sudo apt install ccze
- Далее пишем команду:
journalctl -n 100 -f -u neard | ccze -A
- Нода должна быть полностью синхронизирована;
- Файл
validator_key.json
должен быть на своем месте; - Контракт должен быть инициализирован
public_key
вvalidator_key.json
; account_id
должен быть установленid
контрактом стейкинг пула;- Должно быть достаточно делегировано, чтобы удовлетворить минимальную стоимость места. Ознакомиться с ценой места можно здесь;
- Предложение должно быть подтверждено “пингуя” контракт;
- После принятия предложения валидатор должен подождать 2–3 эпохи, чтобы войти в набор валидаторов;
- Став валидатором, валидатор должен производить более 90% назначенных блоков.
Проверьте статус работы ноды валидатора. Если отображается “Validator”, значит ваш пул стал валидатором.
Стейкинг пул — это смарт-контракт, развернутый на учетной записи NEAR. Вызов команды стейкинг пула, создает пул с указанным именем и развертывает его на указанный accountId
.
Пример команды:
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":"5if1dPtovQ9pMd1CacZVmBHhU13szy7jKoZyKYkGdeba"}' --accountId="<accountId>" --amount=30 --gas=300000000000000
Из примера выше следует, что вам нужно заменить:
pool id
: имя стейкинг пула, слово “factory” автоматически добавится к этому параметру, создавая {pool_id}.{staking_pool_factory} Пример: если Pool ID “btcsecure”, то будет :btcsecure.factory.shardnet.near
owner_id
: это аккаунт в SHARDNET (btcsecure.shardnet.near
), который будет управлять стейкинг пуломpublic key
: публичный ключ, расположенный в файлеvalidator_key.json
5
: комиссия пула, где 5 — это 5%accountId
: SHARDNET аккаунт, разворачивающий и подписывающий транзакции. ОбычноaccountId
=owner_id
Убеждаемся, что на аккаунте есть 30 NEAR — это минимум, необходимый для хранения.
- Наша команда для запуска пула:
near call factory.shardnet.near create_staking_pool '{"staking_pool_id": "btcsecure.factory.shardnet.near", "owner_id": "<accountId>", "stake_public_key": " ed25519:AbskEuvTEx9GvGz9CFLdqfPzgHiSVnJ2C6QwoPyExFYo", "reward_fee_fraction": {"numerator": 5, "denominator": 100}, "code_hash":"DD428g9eqLL8fWUxv8QSpVFzyHi1Qd16P8ephYCTmMSZ"}' --accountId="btcsecure.shardnet.near" --amount=30 --gas=300000000000000
✅Стейкинг пул успешно создан!
Чтобы изменить параметры пула, например, изменить размер взимаемой комиссии на 1%, используем эту команду:
near call <pool_name> update_reward_fee_fraction '{"reward_fee_fraction": {"numerator": 1, "denominator": 100}}' --accountId <account_id> --gas=300000000000000
Пример:
near call btcsecure.factory.shardnet.near update_reward_fee_fraction '{"reward_fee_fraction": {"numerator": 1, "denominator": 100}}' --accountId btcsecure.shardnet.near --gas=300000000000000
Проверить появился ли пул в списке можно по этой ссылке.
- Депозит и стейкинг NEAR:
near call <staking_pool_id> deposit_and_stake --amount <amount> --accountId <accountId> --gas=300000000000000
- Анстейк NEAR:
near call <staking_pool_id> unstake '{"amount": "<amount yoctoNEAR>"}' --accountId <accountId> --gas=300000000000000
- Чтобы анстейкнуть всё, используейте эту команду:
near call <staking_pool_id> unstake_all --accountId <accountId> --gas=300000000000000
- Вывести средства:
near call <staking_pool_id> withdraw '{"amount": "<amount yoctoNEAR>"}' --accountId <accountId> --gas=300000000000000
- Команда, чтобы вывести всё:
near call <staking_pool_id> withdraw_all --accountId <accountId> --gas=300000000000000
Мы можем видеть наши вызовы смарт-контрактов в эксплорере
Пинг выдает новое предложение и обновляет баланс ставок для ваших делегатов. Для поддержания актуальности сообщений о вознаграждениях следует проводить пинг каждую эпоху.
- Команда:
near call <staking_pool_id> ping '{}' --accountId <accountId> --gas=300000000000000
- Команда, чтобы узнать общий баланс:
near view <staking_pool_id> get_account_total_balance '{"account_id": "<accountId>"}'
- Стейкинг баланса:
near view <staking_pool_id> get_account_staked_balance '{"account_id": "<accountId>"}'
- Анстейкнутый баланс:
near view <staking_pool_id> get_account_unstaked_balance '{"account_id": "<accountId>"}'
- Доступно для вывода средств:
near view <staking_pool_id> is_account_unstaked_balance_available '{"account_id": "<accountId>"}'
- Пауза стейкинга:
near call <staking_pool_id> pause_staking '{}' --accountId <accountId>
- Возобновление стейкинга:
near call <staking_pool_id> resume_staking '{}' --accountId <accountId>
Файл журнала хранится либо в каталоге ~/.nearup/logs
, либо в systemd
, в зависимости от вашей настройки.
- Команда Systemd:
journalctl -n 100 -f -u neard | ccze -A
- Пример лога: Validator | 1 validator
INFO stats: #85079829 H1GUabkB7TW2K2yhZqZ7G47gnpS7ESqicDMNyb9EE6tf Validator | 73 validators 30 peers ⬇ 506.1kiB/s ⬆ 428.3kiB/s 1.20 bps 62.08 Tgas/s CPU: 23%, Mem: 7.4 GiB
- Validator: означает, что вы являетесь активным валидатором
- 73 validators: всего 73 валидатора в сети
- 30 peers: в настоящее время у вас 30 пиров. Для достижения консенсуса и начала валидирования вам нужно не менее 3 пиров.
- #46199418: номер блока — убедитесь, что блоки двигаются
Любая нода в сети предоставляет RPC сервисы на порту 3030, если порт открыт в брандмауэре ноды. NEAR-CLI использует вызовы RPC за кулисами. Обычно 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
- Команда, чтобы узнать причину кика валидатора:
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 -s -d '{"jsonrpc": "2.0", "method": "validators", "id": "dontcare", "params": [null]}' -H 'Content-Type: application/json'http://localhost:3030/ | jq -c '.result.current_validators[] | select(.account_id | contains ("<POOLID>"))'
Рассмотрим получение необходимых уведомлений в телеграм на базе очень простого скрипта, cуть которого заключается в том, чтобы сигнализировать нам о падающем онлайне ноды и сообщать кол-во пропущенных блоков за текущую эпоху.
Для начала нам нужно приобрести новый сервер, на котором будет выполняться скрипт, особых требований к серверу не будет.
- После покупки необходимо сервер настроить, для этого, в первую очередь, убедимся, что он обновлен:
sudo apt update && sudo apt upgrade -y
Далее устанавливаем curl
, jq
и bc
:
sudo apt install curl jq bc -y
Теперь переходим в телеграм и создаем бота. Отправляемся сюда — https://t.me/BotFather и выполняем следующие шаги:
- В чате пишем команду
/newbot
; - Указываем желаемое имя для бота;
- Получаем токен в формате:
5580205772:AABBtKj31FtYcpTvbx-hXFPCJVs2eEmk7wg
, это и будет наш <TOKEN>.
Теперь переходим к этому боту https://t.me/getmyid_bot и пишем следующее:
/start
- Получаем ID в формате:
2345234230
, это и будет наш <CHAT_ID>.
- Возвращаемся к серверу и создаём папку, где будет расположен будущий скрипт:
mkdir ~/scripts
cd ~/scripts
- Создаем скрипт:
nano nearalerts.sh
- Вставляем в файл данный текст:
#!/bin/bash
TOKEN=<TOKEN>
CHAT_ID=<CHAT_ID>
URL=”https://api.telegram.org/bot$TOKEN/sendMessage"
QUERY=`curl -s -d ‘{“jsonrpc”: “2.0”, “method”: “validators”, “id”: “dontcare”, “params”: [null]}’ -H ‘Content-Type: application/json’ http://<NODE_IP>:3030/ | jq -c ‘.result.current_validators[] | select(.account_id | contains (“<POOL_ID>”))’`
EXPECTED=`echo $QUERY | sed -e ‘s/.*num_expected_chunks..//g; s/..num_produced_blocks.*//g’`
PRODUCED=`echo $QUERY | sed -e ‘s/.*num_produced_chunks..//g; s/..public_key.*//g’`
ONLINE=$(bc<<<”scale=4;$PRODUCED/$EXPECTED*100")
PAR1=”70.0000"
PAR2=$(( $EXPECTED-$PRODUCED ))
if (( $(echo “$ONLINE < $PAR1” |bc -l) ));
then
MESSAGE=”Онлайн валидатора: $ONLINE%, пропущено блоков: $PAR2.”
curl -s -X POST $URL -d chat_id=$CHAT_ID -d text=”$MESSAGE”
else
sleep 1
fi
echo
Где:
- <TOKEN>: это токен нашего бота в телеграме;
- <CHAT_ID>: это id чата, куда будут приходить уведомления от бота;
- <NODE_IP>: ip адрес ноды валидатора;
- <POOL_IP>: имя пула валидатора.
- Делаем этот скрипт исполняемым:
sudo chmod -x /home/<USER>/scripts/nearalerts.sh
- Следующим шагом нам необходимо сделать так, чтобы этот скрипт включался каждые 5 минут, для этого создаем задачу в кроне:
crontab -e
- Далее вставляем эту строчку:
*/5 * * * * /home/<USER_ID>/scripts/nearalerts.sh
Где <USER>: имя твоего пользователя.
- Проверяем работу:
crontab -l