COSMOS WIKI
April 22, 2022

Cosmos - перенос валидатора на примере Archway

Валидаторы поднимая ноду берут на себя большую ответственность, так как именно они помимо своего стейка отвечают за сохранность средств делегаторов. Валидаторы не могут напрямую завладеть делегированными средствами, но могут своими ошибками (при slashing) повлечь потерю части средств как делегаторов, так и своих. Это может произойти по двум причинам:

  • плохая работа валидатора - когда нода валидатора перестает обрабатывать блоки и пропускает достаточное количество блоков. При этом валидатор попадает тюрьму (jail), но может от туда выбраться. Доля застейканных средств сокращается на 0,01%
  • двойная подпись - когда валидатор подписывает 2 одинаковых блока на 1 высоте. При этом валидатор попадает в тюрьму и не может от туда выбраться. Доля застейканных средств сокращается на 5 процентов. Двойная подпись может случиться в том случае, если на разных серверах будет использоваться один файл priv_validator_key.json, что категорически не допустимо

В данной статье мы разберем пример, когда валидатору необходимо будет сменить сервер по тем или иным причинам. При это необходимо будет аккуратно перенести priv_validator_key.json на новый сервер, чтобы не допустить двойной подписи. В нашем примере будет использоваться нода Archway с рабочим валидатором в тестовой сети torii-1

Приступаем

1. Итак, мы имеем сервер1 с запущенным валидатором, который находится в активном сете. Первоначально нам необходимо скачать с сервера1 файл priv_validator_key.json (находится в папке $HOME/.archway/config/priv_validator_key.json) себе на компьютер и иметь seed фразу для восстановления кошелька

2. Далее, нам необходимо подготовить сервер2 и запустить на нем ноду пока без валидатора и кошелька (в нашем примере Archway), для этого:

Обновляем репозитории

sudo apt update && sudo apt upgrade -y

Устанавливаем необходимые утилиты

sudo apt install curl build-essential git wget jq make gcc tmux -y

Устанавливаем Go ОДНОЙ КОМАНДОЙ

wget https://golang.org/dl/go1.17.5.linux-amd64.tar.gz; \
rm -rv /usr/local/go; \
tar -C /usr/local -xzf go1.17.5.linux-amd64.tar.gz && \
rm -v go1.17.5.linux-amd64.tar.gz && \
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile && \
source ~/.bash_profile && \
go version

ВАЖНО — в командах ниже все, что в <> меняем на свое значение и убираем сами <>

Устанавливаем бинарники V. # "0.0.5"

git clone https://github.com/archway-network/archway && cd archway
git checkout main
make install
archwayd version

Инициализируем ноду (даем имя)

archwayd init <name_node> --chain-id=torii-1

Скачиваем Genesis

wget -O $HOME/.archway/config/genesis.json "https://raw.githubusercontent.com/archway-network/testnets/main/torii-1/genesis.json"

# Проверим генезис
sha256sum ~/.archway/config/genesis.json
# 0257e0be068328514f79ddcc1a3f8703909c116c6bd4a8dc1c9f8f31018e0d93

Проверяем, что состояние валидатора на начальном этапе

cd && cat .archway/data/priv_validator_state.json
{
  "height": "0",
  "round": 0,
  "step": 0
}

# если нет, то выполняем команду
archwayd unsafe-reset-all

Правим конфиг $HOME/.archway/config/client.toml

archwayd config chain-id torii-1

Настраиваем минимальную цену за газ $HOME/.archway/config/app.toml

sed -i.bak -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.0025utorii\"/;" ~/.archway/config/app.toml

Настраиваем прунинг одной командой nano $HOME/.archway/config/app.toml

pruning="custom" && \
pruning_keep_recent="100" && \
pruning_keep_every="0" && \
pruning_interval="50" && \
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.archway/config/app.toml && \
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.archway/config/app.toml && \
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.archway/config/app.toml && \
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.archway/config/app.toml

Добавляем seed/peers $HOME/.archway/config/config.toml

external_address=$(wget -qO- eth0.me)

peers="[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:46656,[email protected]:26756,[email protected]:30273,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656"
sed -i.bak -e "s/^external_address *=.*/external_address = \"$external_address:26656\"/; s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.archway/config/config.toml

seeds=""
sed -i.bak -e "s/^seeds =.*/seeds = \"$seeds\"/" $HOME/.archway/config/config.toml

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

sudo tee /etc/systemd/system/archwayd.service > /dev/null <<EOF
[Unit]
Description=archway
After=network-online.target

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

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload && \
sudo systemctl enable archwayd && \
sudo systemctl restart archwayd && sudo journalctl -u archwayd -f -o cat

3. Нода на сервере2 должна полностью догнать блокчейн

Проверяем высоту сети

archwayd status 2>&1 | jq ."SyncInfo"."latest_block_height"

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

Восстанавливаем кошелек

archwayd keys add <name_wallet> --recover

5. Теперь самый главный этап, который необходимо делать очень быстро. Нам необходимо будет остановить ноды на обоих серверах и подменить файл priv_validator_key.json на сервере2. Повторюсь - останавливаем сервис на сервере1 и на сервере2.

Останавливаем ноду на сервере1

sudo systemctl stop archwayd

Останавливаем ноду на сервере2

sudo systemctl stop archwayd

Удаляем priv_validator_key.json с сервера2 вручную или командой

cd $HOME/.archway/config/ && rm -vf priv_validator_key.json

После чего переносим ранее скопированный файл priv_validator_key.json с сервера1 на сервер2 и запускаем ноду на сервере2

sudo systemctl restart archwayd && sudo journalctl -u archwayd -f -o cat

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

Также можно следующей командой проверить не попал ли валидатор в тюрьму

archwayd query staking validator <archwayvaloper1ms...>

После того, как все получилось можно полностью удалить сервер1 или как минимум с него файл priv_validator_key.json, чтобы исключить двойную подпись!

Поддержим природу вместе: 0xa7476EC14cD663C742d527113638C77a1631Cc89 cosmos1m2mm7kzvw6m3464h94ryqg8xvr6tyeyyecppnq