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
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, чтобы исключить двойную подпись!