Продвинутым
August 4, 2021

Несколько Tendermint нод на одном сервере

1package & Let's Node

⠀О том, как можно запустить несколько нод, использующих Tendermint (например OmniFlix, Stratos, Findora и пр.), написано в этой статье.


Содержание


Кратко о Tendermint

К содержанию

⠀Tendermint — это алгоритм консенсуса, устойчивый к злоумышленным действиям. Алгоритм был придуман в 2014 году Джае Квоном, который был озабочен проблемой высокого энергопотребления сети Bitcoin’а. В отличие от Nakamoto консенсуса, где выбирается цепочка с наибольшей совокупностью сложности, в Tendermint выбирается цепочка, где за блок проголосовало 2/3 участников сети.

⠀Плюсы:

  • Прост в понимании;
  • Довольно быстрый;
  • Блок не может быть отменен после того, как 2/3 проголосовало и подтвердило его.

⠀Минусы:

  • Если нода, которая должна создать блок, его не создает, то необходимо подождать некоторое время до начала нового раунда;
  • Алгоритм плохо масштабируется так как за каждый блок должно проголосовать 2/3 сети.

Решение конфликта

К содержанию

⠀Для решения проблемы необходимо изменить используемые порты в конфиге

Автоматическое

⠀Подойдёт, если на сервере стоит 2 ноды

1) Перейти в директорию с файлом config.toml или изменить путь файла в команде и использовать её

sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:26653\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:26652\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:6061\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:26651\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":26655\"%" config.toml
sed -i.bak -e "s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:9092\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:9093\"%" app.toml

2) Перезапустить ноду командой

sudo systemctl restart SERVICE_FILE_NAME

Ручное

1) Найти файл config.toml нужной ноды (обычно находится в директории DIR_WITH_NODE/config/)

2) Открыть его с помощью текстового редактора и найти строки, показанные ниже

И строку pprof_laddr = "localhost:6060"

3) Заменить порты, чтобы не было пересечения со стандартным конфигом

Например:
26658 -> 26653
26657 -> 26652
6060 -> 6061
26656 -> 26651
26660 -> 26655

4) Сохранить config.toml

5) Найти файл app.toml (обычно находится в директории DIR_WITH_NODE/config/)

6) Открыть его с помощью текстового редактора и найти строки, показанные ниже

7) Заменить порты, чтобы не было пересечения со стандартным конфигом

Например:
9090 -> 9092
9091 -> 9093

8) Сохранить app.toml

9) Перезапустить ноду командой

sudo systemctl restart SERVICE_FILE_NAME

SERVICE_FILE_NAME — название сервисного файла ноды

  1. Если ноды 3 и более, то необходимо проделать эту процедуру с каждой, исключая одну — главное, чтобы порты не пересекались
  2. Если какая-то из нод не будет работать, то, скорее всего, нужно открыть используемые порты

Небольшие трудности

К содержанию

⠀Поскольку TCP адрес был изменён, в некоторых командах, например, в команде для просмотра статуса ноды, необходимо явно указывать изменённый TCP адрес через флаг --node, иначе произойдёт взаимодействие с нодой со стандартным конфигом (по умолчанию команда использует --node "tcp://127.0.0.1:26657").

⠀Например:

omniflixhubd status 2>&1 | jq ".SyncInfo"
$HOME/stratos/stchaincli status --node "tcp://127.0.0.1:26652" 2>&1 | jq ".sync_info"

Полезные ссылки

К содержанию

Разбор алгоритма консенсуса в Tendermint — для более глубокого изучения


Благодарности

К содержанию

Команда 1package — написание статьи

Выразить благодарность