Konstantin Narkhov
Pheix 0.8.96
@condemnedcell
konstantinnarkhov.pro

Частные PoA сети на базе Parity Ethereum — часть 2: настройка и запуск

30 май, 2019


Настройка частной PoA сети из двух узлов

В wiki parity есть пошаговая инструкция по настройки частной PoA сети из двух узлов. Если обобщить, то настройка узла сводится к следующему:

  • создание файла первичной спецификации частной сети (genesis);
  • создание файлов первичной конфигурации узлов (путь к genesis, путь к каталогу хранения данных blockchain, номера портов, настройка сети, etc…);
  • запуск узлов с заданными конфигурационными файлами;
  • создание аккаунтов (через REST-запросы к запущенным на предыдущем шаге узлам);
  • дополнение спецификации частной сети данными об аккаунтах;
  • дополнение файлов конфигурации узлов данными об аккаунтах.

Отмечу, что узел, сконфигурированный по схеме Ctrl+C/Ctrl+V из данной инструкции является незащищенным: как минимум следует заблокировать websockets и ограничить доступ по RPC из внешней сети.

Я хотел бы остановиться на особенностях настройки, в частности на отличиях в конфигурировании частной сети с помощью клиента geth. Во-первых, у узла parity нет этапа инициализации: путь к genesis указывается в конфигурационном файле узла и инициализация выполняется при запуске автоматически. Во-вторых, parity умеет создавать аккаунты, адреса которых однозначно определяются некоторой фразой, т.е. при создании топологии сети можно назначить символьные имена узлам, и для этих имен parity выполнит генерацию постоянных адресов (т.е. в результате повторной генерации будут получены те же адреса). В-третьих, узел parity может быть запущен с единственным параметром командной строки: файлом конфигурации. Это весьма удобно, т.к. нет необходимости конструировать длинные строки запуска с несколькими десятками аргументов.


Тестирование работоспособности частной PoA сети

Тестирование и отладку локальной частной сети (узлы работают на одном физическом сервере) удобно выполнять в docker контейнере с предустановленным для выполнения CLI ПО. Полагаем, что узлы частной сети сконфигурированы и готовы к запуску. Запуск узла выполняется командой:

parity --config node.cfg

После запуска к консолям узлов можно подключиться с помощью команды:

geth attach http://addr:port

Тем не менее просто выполнить запуск недостаточно. Для валидации транзакций и передачи blockchain данных требуется на одном из узлов добавить адрес партнера, другими словами выполнить связывание узлов.

Узлы связываются одним из следующих способов: через конфигурационный файл, через консоль geth, через REST-запрос или через так называемый bootnode. В официальной инструкции используется REST-запрос, поэтому предлагается остановиться на этом способе. Успешное связывание сопровождается соответствующей строкой на каждом из узлов: 1/25 peers… , где 1 - число активных партнеров, 25 - максимально возможное число партнеров.

Запуск узлов на удаленных серверах сопровождается некоторыми особенностями в части сетевых настроек. Например, если сервер находится за NAT, то необходимо задать параметр запуска --nat "extip:78.47.192.226", в котором указать IP вашего маршрутизатора. При этом сетевой порт доступа к узлу, указанный в секции [network] конфигурационного файла, должен быть доступен для входящего подключения на вашем маршрутизаторе.

Я подготовил набор helper-скриптов, упрощающих запуск узлов в частной сети. Скрипты можно скачать из репозитория. В каталоге parity.local присутствуют:

  • patchaccounts.sh - скрипт, выполняющий все этапы настройки частной сети из официальной инструкции, используя genesis шаблон demo-spec.json и шаблоны конфигурационных файлов узлов node0.toml и node1.toml; в результате выполнения скрипта в каталоге patched сохраняются genesis и конфигурационные файлы узлов, необходимые и достаточные для запуска частной сети;
  • bindpeers.sh - скрипт, выполняющий связывание узлов; входным аргументом является адрес enode:// партнера; в случае связывания в локальной сети указывать адрес не требуется;
  • start.node* - скрипты запуска узлов частной сети;
  • attach.node* - скрипты подключения JS-консоли geth к узлам частной сети;
  • reinit.sh - скрипт удаления blockchain данных из локальной файловой системы;
  • trace_tx.sh - скрипт отладки транзакции через REST-запрос; входным аргументом является hash заданной транзакции.

Эти скрипты существенно упрощают развертывание частной сети. Основная автоматизация рутинных действий достигается при отладке, например, смарт-контракта, когда требуется регулярные перезапуск узлов, очистка данных blockchain и подключение к консоли geth.

Blog entries

Check out latest blog entries: most interesting stories about past events & activities.

Quick feedback

Letters and spaces only