health-check.sh


Обзор

health-check.sh — это скрипт на Bash, предназначенный для комплексной проверки состояния игровой сети и связанных с ней компонентов. Он выполняет мониторинг:

Скрипт выводит цветные сообщения, информирующие пользователя об успешности или проблемах с каждым из проверяемых элементов. В случае критических ошибок выполнение прерывается с соответствующим уведомлением.


Подробное описание функционала

Основные блоки скрипта

  1. Загрузка конфигурации
    Проверяется наличие файла ./config/network.env. Если файл есть — он загружается, иначе используется набор значений по умолчанию.

  2. Определение файла развертывания
    Проверяется наличие файлов с информацией о деплое: ./deployments/local.json или ./deployments/sepolia.json. Используется первый найденный.

  3. Извлечение адресов смарт-контрактов
    Из выбранного файла деплоя с помощью jq извлекаются адреса контрактов:

    • MANA Token

    • Game Manager

    • Mana Settlement

  4. Проверка соединения с RPC
    Производится POST-запрос к RPC-URL (по умолчанию http://localhost:8545) методом eth_blockNumber для проверки доступности и получения номера последнего блока.

  5. Проверка статуса контрактов
    Проверяется, задеплоены ли контракты (адреса не пустые и не равны "null").

  6. Проверка статуса валидаторов
    Если существует директория ./validators, скрипт перебирает JSON-файлы валидаторов, проверяет их активность и выводит информацию:

    • Имя валидатора

    • Адрес

    • Статус (активен/неактивен)

  7. Проверка оффчейн-компонентов
    Проверяется наличие бинарного файла игровой ноды и локального конфигурационного файла. Также проверяется, запущены ли процессы с именем game-node.

  8. Итоговое резюме
    Подсчитывается количество найденных проблем и выводится итоговое сообщение о состоянии системы.


Описание ключевых частей скрипта

Переменные цветов

Переменная

Значение

Назначение

RED

\033[0;31m

Красный цвет для ошибок

GREEN

\033[0;32m

Зеленый цвет для успешных действий

YELLOW

\033[1;33m

Желтый цвет для предупреждений

BLUE

\033[0;34m

Синий цвет для заголовков

NC

\033[0m

Сброс цвета (No Color)


Проверка конфигурации

if [ -f "./config/network.env" ]; then
    source ./config/network.env
    echo -e "${GREEN}✓ Configuration loaded${NC}"
else
    echo -e "${YELLOW}⚠ Configuration file not found, using defaults${NC}"
fi

Пояснение:
Если файл конфигурации существует, он подключается и может содержать переменные окружения, например, RPC_URL или MIN_VALIDATORS.


Определение файла деплоя

if [ -f "./deployments/local.json" ]; then
    DEPLOYMENT_FILE="./deployments/local.json"
elif [ -f "./deployments/sepolia.json" ]; then
    DEPLOYMENT_FILE="./deployments/sepolia.json"
else
    echo -e "${RED}✗ No deployment file found${NC}"
    exit 1
fi

Пояснение:
Последовательная проверка наличия файлов с информацией о развертывании смарт-контрактов. Если ни один файл не найден — скрипт завершается с ошибкой.


Извлечение адресов контрактов

Используется jq для парсинга JSON:

MANA_TOKEN=$(jq -r '.contracts.manaToken' $DEPLOYMENT_FILE)
GAME_MANAGER=$(jq -r '.contracts.gameManager' $DEPLOYMENT_FILE)
MANA_SETTLEMENT=$(jq -r '.contracts.manaSettlement' $DEPLOYMENT_FILE)

Пример использования:
Если local.json содержит:

{
  "contracts": {
    "manaToken": "0x123456...",
    "gameManager": "0xabcdef...",
    "manaSettlement": "0x987654..."
  }
}

то переменные будут заполнены соответствующими адресами.


Проверка RPC соединения и получение номера блока

if curl -s -X POST -H "Content-Type: application/json" \
   --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
   $RPC_URL > /dev/null; then
    BLOCK_NUMBER=$(curl -s -X POST -H "Content-Type: application/json" \
                   --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
                   $RPC_URL | jq -r '.result')
    BLOCK_NUMBER_DEC=$((16#${BLOCK_NUMBER#0x}))
    echo -e "${GREEN}✓ RPC connection successful${NC}"
    echo "  Latest block: $BLOCK_NUMBER_DEC"
else
    echo -e "${RED}✗ RPC connection failed${NC}"
    exit 1
fi

Особенности:


Проверка статуса контрактов

Проверяется, что адреса контрактов не равны "null" и не пусты:

if [ "$MANA_TOKEN" != "null" ] && [ "$MANA_TOKEN" != "" ]; then
    echo -e "${GREEN}✓ MANA Token deployed${NC}"
else
    echo -e "${RED}✗ MANA Token not deployed${NC}"
fi

Аналогично для других контрактов.


Проверка валидаторов

if [ -d "./validators" ]; then
    for validator_file in ./validators/*.json; do
        if [ -f "$validator_file" ]; then
            VALIDATOR_NAME=$(basename "$validator_file" .json)
            VALIDATOR_ADDR=$(jq -r '.address' "$validator_file")
            IS_ACTIVE=$(jq -r '.isActive' "$validator_file")
            
            if [ "$IS_ACTIVE" = "true" ]; then
                echo -e "${GREEN}✓ $VALIDATOR_NAME ($VALIDATOR_ADDR)${NC}"
                VALIDATOR_COUNT=$((VALIDATOR_COUNT + 1))
            else
                echo -e "${YELLOW}⚠ $VALIDATOR_NAME ($VALIDATOR_ADDR) - Inactive${NC}"
            fi
        fi
    done
else
    echo -e "${YELLOW}⚠ No validator directory found${NC}"
fi

Проверка оффчейн-компонентов


Итоговая проверка и вывод

Скрипт подсчитывает количество найденных проблем и выводит итоговое сообщение:


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


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

./health-check.sh

Вывод будет цветным и структурированным, например:

=== Game Network Health Check ===
Timestamp: Thu Jun 22 14:00:00 UTC 2024

✓ Configuration loaded
✓ Using deployment: ./deployments/local.json

Contract Addresses:
MANA Token: 0x123456...
Game Manager: 0xabcdef...
Mana Settlement: 0x987654...

Network Connectivity:
✓ RPC connection successful
  Latest block: 1234567

Contract Status:
✓ MANA Token deployed
✓ Game Manager deployed
✓ Mana Settlement deployed

Validator Status:
✓ validator1 (0xabc123...)
⚠ validator2 (0xdef456...) - Inactive
Active validators: 1
✗ Insufficient validators (1 < 3)

Off-Chain Components:
✓ Game node binary exists
✓ Off-chain configuration exists
✓ Game nodes running: 2

=== Health Check Summary ===
⚠ 1 issues detected
Please review the issues above and take corrective action.

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


Диаграмма потока выполнения

flowchart TD
    A[Запуск скрипта] --> B{Есть config/network.env?}
    B -- Да --> C[Загрузить конфигурацию]
    B -- Нет --> D[Вывести предупреждение, использовать дефолты]

    C & D --> E{Файл деплоя?}
    E -- local.json --> F[Использовать local.json]
    E -- sepolia.json --> G[Использовать sepolia.json]
    E -- Нет --> H[Завершить с ошибкой]

    F & G --> I[Извлечь адреса контрактов]
    I --> J[Проверить RPC соединение]
    J --> K[Проверить статус контрактов]
    K --> L[Проверить валидаторов]
    L --> M[Проверить оффчейн-компоненты]
    M --> N[Подсчитать и вывести итоги]
    N --> O[Завершить]

    style H fill:#f96,stroke:#900,stroke-width:2px,color:#900
    style O fill:#6f6,stroke:#060,stroke-width:2px,color:#060

Заключение

Скрипт health-check.sh является мощным инструментом для быстрого аудита состояния игровой сети, смарт-контрактов, валидаторов и оффчейн-сервисов. Он помогает своевременно выявлять проблемы и уведомлять операторов системы для поддержания стабильной и работоспособной инфраструктуры.