November 2, 2022

Celestia: как установить ноду (Validator Node). Подробный гайд

Требования: 4 CPU, 8 RAM, 250 GB SSD

Аренда сервера

Перед установкой ноды нам надо арендовать сервер, я пользуюсь услугами сервиса Hetzner.

Если придерживаться требований к серверу из официальной документации Celestia, аренда получается довольно затратной. Но мы можем использовать менее мощное железо (на свой страх и риск) в проектах, где еще нет оплачиваемой стадии тестнета.

∎ Регистрируемся на Hetzner, если у вас еще нет аккаунта. После этого переходим сюда и нажимаем NEW PROJECT и придумываем имя:

Затем нажимаем на созданный проект и на открывшейся странице нажимаем ADD SERVER:

∎ Выбираем сервер и нажимаем CREATE & BUY NOW:

После этого вам на почту придет пароль от сервера:

∎ Переходим в терминал, пишем команду для входа на сервер, где вставляем IP адрес своего арендованного сервера:

ssh root@IP_АДРЕС_СЕРВЕРА

Далее появится вопрос:

Are you sure you want to continue connecting (yes/no/[fingerprint])?

Отвечаем "yes", а потом попросят ввести пароль, который прислали на почту, два раза. После этого надо будет ввести новый пароль, который вы будете использовать при входе на сервер. Его попросят ввести тоже два раза.

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

∎ Теперь, когда сервер арендован, надо обновить репозитории:

sudo apt update && sudo apt upgrade -y

∎ И установить необходимые новые пакеты:

sudo apt install curl tar wget clang pkg-config libssl-dev jq build-essential bsdmainutils git make ncdu -y

∎ Устанавливаем Go:

cd $HOME
ver="1.18.3"
wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
rm "go$ver.linux-amd64.tar.gz"
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile

Проверяем версию Go (в выводе должно быть go version go1.18.3 linux/amd64):

go version

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

Устанавливаем файлы:

cd $HOME
rm -rf celestia-app
git clone https://github.com/celestiaorg/celestia-app.git
cd celestia-app
git checkout v0.6.0
make install

Проверяем версию (должна быть 0.6.0):

celestia-appd version

Скачиваем бинарный файл:

cd $HOME
rm -rf networks
git clone https://github.com/celestiaorg/networks

Создаём переменные. Вставляем свои данные вместо ИМЯ_НОДЫ и ИМЯ_КОШЕЛЬКА в кавычках (в поле CHAIN ничего не меняем):

NODE_NAME="ИМЯ_НОДЫ" 
WALLET_NAME="ИМЯ_КОШЕЛЬКА"
CHAIN="mamaki" 

Добавляем переменные в баш профиль (ничего не меняем):

echo 'export NODE_NAME='${NODE_NAME} >> $HOME/.bash_profile 
echo 'export WALLET_NAME='${WALLET_NAME} >> $HOME/.bash_profile 
echo 'export CHAIN='${CHAIN} >> $HOME/.bash_profile 
source $HOME/.bash_profile

Инициализируем ноду:

celestia-appd init $NODE_NAME --chain-id $CHAIN

Копируем генезисный файл:

cp $HOME/networks/mamaki/genesis.json $HOME/.celestia-app/config

Настройка сервера

Настраиваем режим валидатора:

sed -i 's/mode = \"full\"/mode = \"validator\"/g' $HOME/.celestia-app/config/config.toml

Настраиваем прунинг:

PRUNING="custom"
PRUNING_KEEP_RECENT="100"
PRUNING_INTERVAL="10"

sed -i -e "s/^pruning *=.*/pruning = \"$PRUNING\"/" $HOME/.celestia-app/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \
\"$PRUNING_KEEP_RECENT\"/" $HOME/.celestia-app/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \
\"$PRUNING_INTERVAL\"/" $HOME/.celestia-app/config/app.toml

Копируем сиды и пиры:

BOOTSTRAP_PEERS=$(curl -sL https://raw.githubusercontent.com/celestiaorg/networks/master/mamaki/bootstrap-peers.txt | tr -d '\n')
echo $BOOTSTRAP_PEERS
sed -i.bak -e "s/^bootstrap-peers *=.*/bootstrap-peers = \"$BOOTSTRAP_PEERS\"/" $HOME/.celestia-app/config/config.toml

∎ Устанавливаем параметры конфигурации консенсуса:

sed -i 's/timeout-commit = ".*/timeout-commit = "25s"/g' $HOME/.celestia-app/config/config.toml
sed -i 's/peer-gossip-sleep-duration *=.*/peer-gossip-sleep-duration = "2ms"/g' $HOME/.celestia-app/config/config.toml

∎ Устанавливаем параметры конфигурации P2P:

max_num_inbound_peers=40 
max_num_outbound_peers=10 
max_connections=50

sed -i -e "s/^use-legacy *=.*/use-legacy = false/;\
s/^max-num-inbound-peers *=.*/max-num-inbound-peers = $max_num_inbound_peers/;\
s/^max-num-outbound-peers *=.*/max-num-outbound-peers = $max_num_outbound_peers/;\
s/^max-connections *=.*/max-connections = $max_connections/" $HOME/.celestia-app/config/config.toml

Сбрасываем состояние валидатора:

celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app

Добавляем в конфиг:

celestia-appd config keyring-backend test

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

tee $HOME/celestia-appd.service > /dev/null <<EOF 
[Unit] 
Description=celestia-appd Cosmos daemon 
After=network-online.target 

[Service] 
User=$USER 
ExecStart=$(which celestia-appd) start 
Restart=on-failure 
RestartSec=3 
LimitNOFILE=65535 

[Install] 
WantedBy=multi-user.target 
EOF

Перемещаем в нужную папку:

sudo mv $HOME/celestia-appd.service /etc/systemd/system/

Запускаем сервис:

sudo systemctl enable celestia-appd 
sudo systemctl daemon-reload 
sudo systemctl restart celestia-appd

Смотрим логи:

journalctl -u celestia-appd -f -o cat

Выйти из логов - CTRL+C

Проверяем статус синхронизации (если в строке catching up стоит false, то нода синхронизирована):

curl -s localhost:26657/status 

Если нода долго не синхронизируется, то можно использовать снепшот.

Останавливаем сервис:

sudo systemctl stop celestia-appd

Загружаем блоки:

cd $HOME
rm -rf ~/.celestia-app/data 
mkdir -p ~/.celestia-app/data 

Далее копируйте всё одной командой:

SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \

egrep -o ">mamaki.*tar" | tr -d ">")

wget -O - https://snaps.qubelabs.io/celestia/${SNAP_NAME} | tar xf - -C ~/.celestia-app/data/

Перезапускаем сервис и смотрим логи:

sudo systemctl restart celestia-appd && journalctl -u celestia-appd -f -o cat

Создание валидатора

После того как нода синхронизировалась, можно приступать к следующим шагам.

Создаём кошелёк, если устанавливаем эту ноду впервые:

celestia-appd keys add $WALLET_NAME

Сохраняем мнемоник в надёжном месте! Также сохраните адрес кошелька, он нам пригодится (celestia1...).

Если кошелёк уже есть, то восстанавливаем его и после команды вставляем мнемоник от кошелька:

celestia-appd keys add $WALLET_NAME --recover

Создаём переменную с адресом валидатора (ничего не меняем):

WALLET_ADDRESS=$(celestia-appd keys show $WALLET_NAME -a) 
VALOPER=$(celestia-appd keys show $WALLET_NAME --bech val -a)
echo 'export WALLET_ADDRESS='${WALLET_ADDRESS} >> $HOME/.bash_profile 
echo 'export VALOPER='${VALOPER} >> $HOME/.bash_profile 
source $HOME/.bash_profile

∎ Запрашиваем токены в кране. Переходим в Discord, верифицируемся и переходим в ветку mamaki-faucet, вставляем свой адрес celestia1... :

$request celestia1...

Будьте внимательны с вводом своего адреса в кране, так как монеты можно запрашивать 1 раз в неделю!

∎ Проверяем баланс:

celestia-appd q bank balances $WALLET_ADDRESS

∎ Если монеты поступили, то создаём валидатора:

celestia-appd tx staking create-validator \
 --amount=9000000utia \
 --pubkey=$(celestia-appd tendermint show-validator) \
 --moniker=$WALLET_NAME \
 --chain-id=$CHAIN \
 --commission-rate=0.1 \
 --commission-max-rate=0.2 \
 --commission-max-change-rate=0.01 \
 --min-self-delegation="1" \
 --from=$WALLET_ADDRESS

∎ Проверяем статус валидатора:

celestia-appd q staking validator $CELESTIA_VALOPER

Полезные команды:

∎ Посмотреть логи:

journalctl -u celestia-appd -f -o cat

∎ Делегировать себе:

celestia-appd tx staking delegate $VALOPER 1000000utia --from $WALLET_ADDRESS --chain-id $CHAIN

∎ Посмотреть список активных валидаторов:

celestia-appd q staking validators --limit=3000 -oj \ | jq -r '.validators[] | select(.status=="BOND_STATUS_BONDED") | [(.tokens|tonumber / pow(10;6)), .description.moniker] | @csv' \ | column -t -s"," | tr -d '"'| sort -k1 -n -r | nl

Спасибо за внимание!

Ссылка на TG канал: https://t.me/cryptonik_space