genesis-generator.sh

Обзор

genesis-generator.sh — это shell-скрипт, предназначенный для автоматизации процесса генерации файла генезиса (начального состояния) сети блокчейнов в рамках развертывания децентрализованного приложения или смарт-контрактной платформы. Скрипт ожидает завершения предварительного этапа развертывания и появления необходимых файлов, затем с помощью утилиты /app/relay_utils последовательно пытается сгенерировать генезис сети с заданными параметрами. В случае неудачи выполняется повторная попытка до 50 раз с задержкой между попытками. При успешном завершении скрипт создаёт маркер успешного выполнения и корректно завершает работу.


Подробное описание

Основной функционал


Разбор скрипта по блокам

Установка зависимостей

apk add --no-cache jq

Ожидание завершения развертывания

echo 'Waiting for deployment completion...'
until [ -f /deploy-data/deployment-complete.marker ]; do sleep 2; done

Ожидание файла с данными реле

echo 'Waiting for relay contracts file...'
until [ -f /deploy-data/relay_contracts.json ]; do sleep 2; done

Извлечение адреса драйвера

DRIVER_ADDRESS=$(jq -r '.driver.addr' /deploy-data/relay_contracts.json)
echo "Driver address from relay_contracts.json: $DRIVER_ADDRESS"

Параметры повторных попыток

MAX_RETRIES=50
RETRY_DELAY=2
attempt=1

Цикл генерации генезиса

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 

Использование

Скрипт предназначен для запуска в среде, где:

Пример запуска:

sh genesis-generator.sh

Взаимодействие с другими частями системы


Важные детали реализации


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 пайплайн или оркестрацию контейнеров.