Files
proxmox/scripts/fix-genesis-validators.sh

98 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# Fix genesis.json to ensure it contains exactly 5 validators
# This script checks if genesis.json needs to be regenerated
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
SMOM_PROJECT="${SMOM_PROJECT:-$PROJECT_ROOT/../smom-dbis-138}"
GENESIS_FILE="$SMOM_PROJECT/config/genesis.json"
log_info() { echo "[INFO] $1"; }
log_success() { echo "[✓] $1"; }
log_warn() { echo "[⚠] $1"; }
log_error() { echo "[✗] $1"; }
log_info "=== Genesis.json Validator Check ==="
echo ""
if [[ ! -f "$GENESIS_FILE" ]]; then
log_error "genesis.json not found: $GENESIS_FILE"
exit 1
fi
# Extract validator addresses from keys
log_info "Extracting validator addresses from keys..."
VALIDATOR_ADDRESSES=()
for i in 1 2 3 4 5; do
KEY_DIR="$SMOM_PROJECT/keys/validators/validator-$i"
if [[ -f "$KEY_DIR/address.txt" ]]; then
ADDR=$(cat "$KEY_DIR/address.txt" | tr -d '\n' | tr '[:upper:]' '[:lower:]' | sed 's/^0x//')
VALIDATOR_ADDRESSES+=("$ADDR")
log_success "validator-$i: 0x${ADDR:0:10}..."
else
log_error "validator-$i address.txt not found"
exit 1
fi
done
if [[ ${#VALIDATOR_ADDRESSES[@]} -ne 5 ]]; then
log_error "Expected 5 validator addresses, found ${#VALIDATOR_ADDRESSES[@]}"
exit 1
fi
log_success "Found all 5 validator addresses"
echo ""
# Check genesis.json
log_info "Analyzing genesis.json extraData..."
VALIDATOR_COUNT=$(python3 << PYEOF
import json
with open('$GENESIS_FILE') as f:
g = json.load(f)
extra = g.get('extraData', '')
hex_data = extra[2:] if extra.startswith('0x') else extra
# Skip vanity (64 hex chars = 32 bytes)
if len(hex_data) > 64:
validator_data = hex_data[64:]
count = len(validator_data) // 40
print(count)
else:
print(0)
PYEOF
)
log_info "Validators in genesis.json extraData: $VALIDATOR_COUNT"
log_info "Expected: 5"
if [[ $VALIDATOR_COUNT -eq 5 ]]; then
log_success "✓ Genesis.json contains correct number of validators (5)"
echo ""
log_info "Genesis.json is correct - no action needed"
exit 0
elif [[ $VALIDATOR_COUNT -eq 0 ]]; then
log_warn "Could not determine validator count from extraData"
log_warn "extraData may be in RLP-encoded format"
echo ""
log_info "Note: QBFT uses dynamic validator management via validator contract"
log_info "The extraData field may contain RLP-encoded data that requires special parsing"
exit 0
else
log_error "✗ Genesis.json contains $VALIDATOR_COUNT validators (expected 5)"
echo ""
log_warn "WARNING: Genesis.json needs to be regenerated with the correct 5 validators"
log_warn "Current validator addresses:"
for i in "${!VALIDATOR_ADDRESSES[@]}"; do
echo " validator-$((i+1)): 0x${VALIDATOR_ADDRESSES[$i]}"
done
echo ""
log_info "To fix: Regenerate genesis.json using quorum-genesis-tool or besu"
log_info "with the 5 validator addresses listed above"
exit 1
fi