Immortal Articles
September 22, 2021

Перенос 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 - канал, где я выкладываю свои гайды.

Полезные ресурсы.

Крипто-кошельки автора гайда.