Перенос Polkadot & Cosmos /// v1.0
В этой статье я буду «переносить» ноды, построенные на базе Polkadot и Tendermint, на другие сервера, не теряя валидатора и (практически) не пропуская блоков.
Проекты на вышеупомянутых сетях «переносятся» по одному и тому же сценарию.
Если проект использует свой собственный блокчейн — подход будет уникальным от проекта к проекту и лучше уточнять особенности «переезда» в тематическом чате.
Если вы не знаете, что такое нода — читаем статью.
Если вы не знаете, где арендовать сервер для ноды — читаем статью.
Если вы не знаете, как подключиться к серверу — читаем статью.
Если вы всё знаете — открываем MobaXterm и создаём сессию.
Я не буду углубляться в технические особенности и различия блокчейнов на уровне кода — я в этом не силён, да нам и не нужно.
Определить, с каким блокчейном вы работаете, можно посмотрев на команды и инструменты, которыми вы пользуетесь при «поднятии» и «содержании» ноды.
Например, отличительной особенностью нод на польке является их телеметрия и дашборд.
Так выглядит дашборд или эксплорер:
Если вам знаком данный дизайн, можете приступать к пункту: перенос polkadot.
У космоса нет единого эксплорера для всех проектов, как у польки.
Но зато, все команды, используемые при работе с тендерминтом, практически идентичны.
Для космоса характерны такие команды, как:
# отправляем транзакцию создания валидатора $ rizond tx staking create-validator \ --amount="7000000uatolo" \ --pubkey=$($HOME/go/bin/rizond tendermint show-validator) \ --moniker=$NICKNAME \ --commission-rate="0.10" \ --commission-max-rate="0.20" \ --commission-max-change-rate="0.01" \ --min-self-delegation="1" \ --from $NICKNAME'_keys' \ --chain-id=groot-011 \ --fees="1000uatolo"
# получаем высоту блоков нашей ноды $ stchaincli status 2>&1 | jq ."sync_info"."latest_block_height"
# получаем статус синхронизации ноды $ stchaincli status 2>&1 | jq ."sync_info"."catching_up" # 'true' - нода синхронизируется, 'false' - нода синхронизирована
Если вы узнали эти команды, можно приступать к пункту: перенос tendermint.
Чтобы «перенести» ноду «на польке» на новый сервер, не теряя валидатора, нам нужно будет:
Например, у меня есть функционирующая нода porta, которую я хочу «перенести» на другой сервер.
Первое, что нужно сделать — зайти в Staking > Account actions и убедиться, что валидатор вообще работает:
Важно иметь мнемонику и json-файлы от stash-аккаунта и controller-аккаунта.
При «переносе» нам они не пригодятся, если данные сохранились в «личном кабинете» на сайте полькадота, но возьмите в привычку: всегда бэкапить абсолютно все мнемоники и json-файлы.
Второе, мы арендуем второй сервер (куда будем «переносить» ноду) и устанавливаем ПО на новый сервер, запускаем узел и начинаем синхронизацию. Можно даже использовать старый никнейм ноды.
В конечном итоге, у вас должны быть: старая нода с функционирующим валидатором и новая, уже синхронизированная нода без валидатора.
Вот так это будет примерно выглядеть в телеметрии:
Теперь мы заходим в Staking > Account actions, выбираем своего валидатора и нажимаем на настройки, затем — Change session keys:
На новом сервере выполняем команду генерации сессионных ключей:
Возможно, от проекта к проекту, команда будет незначительно отличаться, просто выполните команду, которую выполняли в самый первый раз, когда ставили ноду.
$ curl -H "Content-Type: application/json" \ -d '{"id":1, "jsonrpc":"2.0", "method": "author_rotateKeys", "params":[]}' \ http://127.0.0.1:9937 | jq .result | sed 's/"//g'
И вставляем новые ключи в соответствующее поле на сайте:
На скриншоте видно, что транзакция прошла успешно и нода теперь «привязана» к новому серверу. Теперь можно выключить ноду на старом сервере.
$ sudo systemctl stop portad
В начале новой эпохи валидатор перестанет валидировать, нужно будет вновь нажать Validate в Staking > Account actions и заново настроить комиссию:
Теперь валидатор валидирует с нового сервера с новыми ключами:
Чтобы «перенести» ноду «на тендерминте» на новый сервер, не теряя валидатора, нам нужно будет:
- установить новую ноду на новом сервере и начать её синхронизацию.
- дождаться, пока новая нода догонит последний блок.
- восстановить старые ключи (кошелёк) на новой ноде.
- скопировать 1 файл со старого сервера на новый: priv_validator_key.json.
- остановить старую ноду и включить новую с подменёнными файлами.
Например, у меня есть функционирующая нода stratos, которую я хочу «перенести» на другой сервер.
Первое, мы скачиваем со старого сервера файл, которые находится в следующем каталоге: $HOME/.<cosmos>/config/ на свой компьютер.
Нужный нам файл называется: priv_validator_key.json.
Название каталога с необходимым нам конфигом будет начинаться с точки и содержать несколько «папок»: config, data, возможно keyring-test или что-то подобное.
Нам нужно найти в «корневом каталоге» (обычно, root) директорию, которая содержит папку config, и скачать её себе на ПК.
Скачать файлы можно с помощью инструментов программы MobaXterm или SCP:
Теперь мы должны начать установку ноды на новом сервере, настроить конфиги, файлы генезиса и следовать инструкции вплоть до запуска синхронизации ноды и дождаться её полного завершения.
В определённый момент у вас будет всё ещё активный валидатор на старом сервере и полностью синхронизированная нода без валидатора на новом сервере.
Теперь восстанавливаем ключи на новом сервере по старой мнемонической фразе. Для стратоса команда имеет вид:
$ stchaincli keys add --hd-path "m/44'/606'/0'/0/0" \ --keyring-backend=test $NICKNAME --recover
$ cosmosd keys add $NICKNAME --recover
Как вы могли заметить, команда для восстановления ключей по мнемонике, идентична с командой для генерации новых ключей, за исключением одного параметра: --recover.
Если нет мнемоники, можно перенести следующие файлы со старого сервера на новый:
И положить их в соответствующую директорию: рядом с конфигом или в конкретный каталог keyring-test, например, — одним словом туда, откуда вы их сохранили со старого сервера.
Настал момент, когда нам нужно остановить сервисы нод на каждом из серверов, чтобы не было такой ситуации, что одновременно работают 2 валидатора на одних и тех же ключах.
Важно убедиться, что старая нода выключена и не обрабатывает блоки. Очень важно.
$ sudo systemctl stop stratosd
В этот момент старый валидатор перестанет обрабатывать блоки.
Чтобы не угодить в «тюрьму», следующие действия нужно выполнять быстро.
На новом сервере, в каталоге config мы удаляем файл priv_validator_key.json. Можно руками, можно командами:
$ cd $HOME/.<cosmos>/config/ $ rm -vf priv_validator_key.json
И загружаем скачанный ранее priv_validator_key.json на новый сервер, в соответствующую директорию config.
Этими действиями мы «переносим» валидатора на новый сервер, пропуская минимум блоков.
Теперь можно со спокойной душой запускать сервис на новом сервере:
Важно убедиться, что старая нода выключена и не обрабатывает блоки. Только после этого запускаем новую ноду.
# включаем сервис 'stratosd' одной командой $ sudo systemctl daemon-reload && \ sudo systemctl enable stratosd && sudo systemctl restart stratosd
Сейчас нужно наблюдать в эксплорере, прошло ли всё удачно.
Как видно на скриншоте, валидатор продолжает обрабатывать блоки, несмотря на то, что первый сервер выключен.
Также можно проверить состояние валидатора на новом сервере с помощью команды:
$ stchaincli query staking validator $(stchaincli keys show $NICKNAME \ --bech val --address --keyring-backend test) --trust-node
$ cosmosd query staking \ validator $(cosmosd keys show $NICKNAME --bech val --address)
Получилось всё провести быстро и нода даже не успела попасть в тюрьму.
Но если валидатор всё же угодил в неё — нужно соответствующей командой его оттуда вытащить:
# выйти из 'тюрьмы' $ stchaincli tx slashing unjail --from=$NICKNAME \ --chain-id=stratos-testnet-2 \ --keyring-backend=test \ --gas="auto" \ --gas-prices="0.5ustos" \ --gas-adjustment=1.5
$ cosmosd tx slashing unjail --from=$NICKNAME --chain-id=<chain-id>
мамичу за то, что родила такого гения.
@napal_ded за статью про переезд омнифликса. эта статья и натолкнула меня на написание текущего, на мой взгляд, более универсального гайда.
@MikhailRadusha за отчёт по «переносу» порты.
@how_to_node - канал, где я выкладываю свои гайды.