genesis-generator.sh
Обзор
genesis-generator.sh — это shell-скрипт, предназначенный для автоматизации процесса генерации файла генезиса (начального состояния) сети блокчейнов в рамках развертывания децентрализованного приложения или смарт-контрактной платформы. Скрипт ожидает завершения предварительного этапа развертывания и появления необходимых файлов, затем с помощью утилиты /app/relay_utils последовательно пытается сгенерировать генезис сети с заданными параметрами. В случае неудачи выполняется повторная попытка до 50 раз с задержкой между попытками. При успешном завершении скрипт создаёт маркер успешного выполнения и корректно завершает работу.
Подробное описание
Основной функционал
Устанавливает утилиту
jqдля работы с JSON.Ожидает появления маркера завершения этапа развертывания (
/deploy-data/deployment-complete.marker).Ожидает появления файла с параметрами смарт-контрактов реле (
/deploy-data/relay_contracts.json).Извлекает адрес драйвера из JSON-файла.
Запускает процесс генерации генезиса с помощью внешней утилиты
/app/relay_utilsс параметрами подключения к двум RPC-узлам и секретными ключами.Повторяет попытки генерации до 50 раз с интервалом в 2 секунды в случае неудачи.
При успешном выполнении создаёт маркер
/deploy-data/genesis-complete.markerи завершает выполнение.
Разбор скрипта по блокам
Установка зависимостей
apk add --no-cache jq
Устанавливает пакет
jqбез кэширования в Alpine Linux, необходимый для парсинга JSON.
Ожидание завершения развертывания
echo 'Waiting for deployment completion...'
until [ -f /deploy-data/deployment-complete.marker ]; do sleep 2; done
Цикл ожидания появления файла-маркера, сигнализирующего, что предыдущий этап развертывания завершён.
Проверка файла каждые 2 секунды.
Ожидание файла с данными реле
echo 'Waiting for relay contracts file...'
until [ -f /deploy-data/relay_contracts.json ]; do sleep 2; done
Аналогично ждёт файл
relay_contracts.json, который содержит адреса смарт-контрактов.
Извлечение адреса драйвера
DRIVER_ADDRESS=$(jq -r '.driver.addr' /deploy-data/relay_contracts.json)
echo "Driver address from relay_contracts.json: $DRIVER_ADDRESS"
С помощью
jqпарсит поле.driver.addrиз JSON.Сохраняет в переменную
DRIVER_ADDRESSдля дальнейшего использования.
Параметры повторных попыток
MAX_RETRIES=50
RETRY_DELAY=2
attempt=1
Максимальное число попыток — 50.
Задержка между попытками — 2 секунды.
Счётчик текущей попытки.
Цикл генерации генезиса
while [ $attempt -le $MAX_RETRIES ]; do
echo "Attempt $attempt of $MAX_RETRIES: Generating network genesis..."
if /app/relay_utils network \
--chains http://anvil:8545,http://anvil-settlement:8546 \
--driver-address "$DRIVER_ADDRESS" \
--driver-chainid 31337 \
generate-genesis \
--commit \
--secret-keys 31337:0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80,31338:0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; then
echo 'Genesis generation completed successfully!'
echo "$(date): Genesis generation completed successfully" > /deploy-data/genesis-complete.marker
echo "Genesis completion marker created"
echo "Waiting few seconds before exiting..."
sleep 5
exit 0
else
echo "Genesis generation failed on attempt $attempt"
if [ $attempt -lt $MAX_RETRIES ]; then
echo "Waiting $RETRY_DELAY seconds before retry..."
sleep $RETRY_DELAY
else
echo "All $MAX_RETRIES attempts failed. Exiting with error."
exit 1
fi
attempt=$((attempt + 1))
fi
done
Для каждой попытки запускается команда
/app/relay_utils network generate-genesisс параметрами:--chains— два RPC-адреса (основной и для сеттлмента).--driver-address— адрес драйвера.--driver-chainid— ID цепочки (31337 — часто используется для локальных эмуляторов).--commit— флаг коммита результата.--secret-keys— список секретных ключей для цепочек.
Если генерация успешна:
Выводится сообщение об успехе.
Создаётся файл-маркер
/deploy-data/genesis-complete.markerс отметкой времени.Скрипт ждёт 5 секунд и завершает работу с кодом 0.
Если неудача:
Выводится сообщение об ошибке.
Если попытки ещё остались — ждёт 2 секунды и повторяет.
Если попытки исчерпаны — завершает работу с кодом ошибки 1.
Использование
Скрипт предназначен для запуска в среде, где:
Уже выполнено развертывание контрактов (наличие маркера
/deploy-data/deployment-complete.marker).Доступен файл
/deploy-data/relay_contracts.jsonс данными о смарт-контрактах.Установлена и доступна утилита
/app/relay_utils.Запускается в окружении с Alpine Linux (для использования
apk).
Пример запуска:
sh genesis-generator.sh
Взаимодействие с другими частями системы
Файл
/deploy-data/deployment-complete.marker— маркер, сигнализирующий о завершении предыдущего этапа деплоя.Файл
/deploy-data/relay_contracts.json— содержит адреса смарт-контрактов реле, из которого извлекается адрес драйвера.Утилита
/app/relay_utils— внешний бинарник или скрипт, который выполняет основную работу по генерации генезиса сети.RPC-сервисы на
http://anvil:8545иhttp://anvil-settlement:8546— блокчейн-ноды, к которым происходит подключение для получения и записи состояния.
Важные детали реализации
Используется простой polling (опрос) с фиксированным интервалом для ожидания появления файлов.
В цикле с повторными попытками реализована базовая логика retry с ограничением по количеству попыток.
Использование
jqгарантирует корректное извлечение нужного поля из JSON.Перед завершением скрипт ставит маркер успешного завершения, что позволяет другим компонентам системы контролировать статус.
Mermaid-диаграмма: поток выполнения скрипта
flowchart TD
A[Старт скрипта] --> B[Установка jq]
B --> C{Файл deployment-complete.marker\nсуществует?}
C -- Нет --> C
C -- Да --> D{Файл relay_contracts.json\nсуществует?}
D -- Нет --> D
D -- Да --> E[Извлечь DRIVER_ADDRESS из relay_contracts.json]
E --> F[Инициализация счётчика попыток: attempt=1]
F --> G{attempt <= MAX_RETRIES?}
G -- Нет --> U[Завершение с ошибкой]
G -- Да --> H[Запуск генерации генезиса]
H --> I{Генерация успешна?}
I -- Да --> J[Создать файл\ngenesis-complete.marker]
J --> K[Ждать 5 секунд]
K --> L[Завершить скрипт с успехом]
I -- Нет --> M[Вывести ошибку]
M --> N{attempt < MAX_RETRIES?}
N -- Да --> O[Ждать RETRY_DELAY секунд]
O --> P[Увеличить attempt на 1]
P --> G
N -- Нет --> U
Резюме
genesis-generator.sh — диагностически важный скрипт для надежной и повторяемой генерации начального состояния блокчейн-сети в процессе автоматизированного деплоя. Его архитектура предусматривает ожидание необходимых входных данных, извлечение критически важных параметров из JSON, выполнение генерации с управлением повторными попытками, а также создание маркеров статуса выполнения для координации с другими частями системы. Такой подход обеспечивает устойчивость и предсказуемость процесса и облегчает интеграцию в CI/CD пайплайн или оркестрацию контейнеров.