generate_network.sh
Обзор
generate_network.sh — это Bash-скрипт для автоматической генерации конфигурации Docker Compose, которая разворачивает локальную блокчейн-сеть с настраиваемым количеством операторов, коммиттеров и агрегаторов. Скрипт создает изолированную среду для разработки и тестирования, включающую несколько сервисов: локальные Ethereum-ноды (Anvil), сервисы деплоя контрактов, генерации генезиса сети, релейные сайдкары и игровые ноды.
Основная задача — быстро и удобно развернуть имитированную блокчейн-сеть с нужным соотношением ролей и взаимодействием сервисов для локального тестирования протоколов или приложений.
Подробное описание компонентов и функций
Глобальные переменные
RELAY_IMAGE_TAG— тег Docker-образа релэй-сервиса.Цветовые константы (
RED,GREEN,YELLOW,BLUE,NC) — для цветного вывода сообщений.Значения по умолчанию и ограничения:
DEFAULT_OPERATORS=4 — операторов по умолчанию.
DEFAULT_COMMITERS=1 — коммиттеров по умолчанию.
DEFAULT_AGGREGATORS=1 — агрегаторов по умолчанию.
MAX_OPERATORS=999— максимальное число операторов.
Функции
print_status(message)
Выводит информационное сообщение с зеленым цветом.
Параметры:
message(string) — текст сообщения.
Возвращаемое значение: нет.
Пример использования:
print_status "Запуск процесса"
print_warning(message)
Выводит предупреждение желтым цветом.
Параметры:
message(string) — текст предупреждения.
Возвращаемое значение: нет.
print_error(message)
Выводит сообщение об ошибке красным цветом и завершает скрипт.
Параметры:
message(string) — текст ошибки.
Возвращаемое значение: скрипт завершается с кодом 1.
print_header(title)
Выводит заголовок с синей рамкой.
Параметры:
title(string) — текст заголовка.
Возвращаемое значение: нет.
validate_number(num, name)
Проверяет, что num — положительное целое число. Если проверка не пройдена — выводит ошибку и завершает скрипт.
Параметры:
num(string) — проверяемое значение.name(string) — имя параметра в сообщении об ошибке.
Возвращаемое значение: нет.
get_user_input()
Интерактивно запрашивает у пользователя количество операторов, коммиттеров и агрегаторов, проверяет корректность вводимых значений. Проверяет, что сумма коммиттеров и агрегаторов не превышает общее число операторов, и что число операторов не больше максимального.
Параметры: нет.
Возвращаемое значение: значения сохраняются в глобальных переменных
operators,commiters,aggregators.Работа:
Запрашивает ввод с подсказками и значениями по умолчанию.
Валидация чисел.
Вывод итоговой конфигурации.
Пример:
Enter number of operators (default: 4, max: 999): 5 Enter number of commiters (default: 1): 1 Enter number of aggregators (default: 1): 1
generate_docker_compose(operators, commiters, aggregators)
Генерирует файл docker-compose.yml и структуру каталогов для локальной сети с заданным количеством операторов и ролей. Создает директории для хранения данных каждого оператора, прописывает конфигурацию сервисов в Docker Compose, включая:
Две локальные Ethereum ноды (Anvil) для основной цепочки и цепочки расчетов.
Сервис деплоя смарт-контрактов.
Генератор генезиса.
Релейные сервисы (sidecar) для каждого оператора с назначением роли (committer, aggregator, signer).
Игровые ноды, которые зависят от релэев.
Параметры:
operators(int) — число операторов.commiters(int) — число коммиттеров.aggregators(int) — число агрегаторов.
Возвращаемое значение: нет, генерирует файлы в каталоге temp-network.
Ключевые детали реализации:
Создает директории
data-XXдля каждого оператора с правами 777.Использует диапазон портов для релейных и игровых сервисов (начинаются с 8081 и 9091 соответственно).
Генерирует приватные ключи для операторов в корректном диапазоне ECDSA secp256k1.
Прописывает зависимости и условия запуска сервисов в Docker Compose.
В конце прописывает сеть
symbiotic-networkс драйверомbridge.
main()
Основная точка входа. Последовательно:
Выводит заголовок.
Проверяет наличие Docker и Docker Compose.
Вызывает
get_user_inputдля получения параметров сети.Выводит статус и вызывает
generate_docker_compose.Выводит инструкции по запуску и проверке сети.
Завершает работу.
Взаимодействия с другими частями системы
Скрипт зависит от следующих внешних компонентов:
Docker и Docker Compose — для запуска контейнеров.
Скрипты и файлы в директориях
../network-scriptsи../off-chain— для запуска игровых нод, деплоя и генерации генезиса.Docker-образы Foundry (Anvil) для локальных Ethereum-ноды.
Релейный образ
symbioticfi/relayс тегом, указанным вRELAY_IMAGE_TAG.
Генерируемый файл
docker-compose.ymlиспользуется для запуска всей сети черезdocker compose up -dв каталогеtemp-network.Операторы, коммиттеры и агрегаторы реализованы как отдельные контейнеры, взаимодействующие друг с другом через мостовую сеть Docker.
Алгоритмы и важные детали
Генерация приватных ключей для операторов происходит инкрементально из базового значения (
BASE_PRIVATE_KEY), при этом соблюдается ограничение диапазона secp256k1.Роли операторов назначаются в порядке: сначала коммиттеры, затем агрегаторы, оставшиеся — обычные подписанты.
Скрипт обеспечивает проверку валидности вводимых данных и корректное завершение при ошибках.
Используется шаблонное создание
docker-compose.ymlс динамическими вставками ролей, портов и путей.
Инструкция по использованию
Запустите скрипт:
./generate_network.shВведите запрашиваемые параметры (количество операторов, коммиттеров, агрегаторов).
После успешной генерации перейдите в каталог
temp-network:cd temp-networkЗапустите сеть:
docker compose up -dДля проверки статуса и логов используйте:
docker compose ps docker compose logs -f
Диаграмма: поток выполнения и структура функций
flowchart TD
A[main] --> B{Проверка Docker и Docker Compose}
B -->|ОК| C[get_user_input]
C --> D[validate_number для каждого ввода]
D --> E[generate_docker_compose]
E --> F[Вывод инструкции пользователю]
B -->|Ошибка| G[print_error и выход]
subgraph generate_docker_compose
E1[Удаление temp-network]
E2[Создание директорий data-XX]
E3[Создание docker-compose.yml]
E4[Добавление сервисов anvil, deployer, genesis-generator]
E5[Добавление relay-sidecar с ролями]
E6[Добавление game-node для каждого оператора]
E1 --> E2 --> E3 --> E4 --> E5 --> E6
end
subgraph get_user_input
C1[Ввод операторов]
C2[Ввод коммиттеров]
C3[Ввод агрегаторов]
C4[Проверка суммы ролей]
C1 --> C2 --> C3 --> C4
end
Заключение
generate_network.sh — мощный и удобный инструмент для быстрого развертывания локальной симбиотической блокчейн-сети с возможностью гибкой настройки ролей операторов. Скрипт помогает автоматизировать создание сложной инфраструктуры из множества контейнеров, облегчая разработку и тестирование. Благодаря встроенной валидации и подробной обратной связи, минимизируется риск ошибок конфигурации.