#!/usr/bin/env bash set -e # Generate Genesis for ChainID 138 - DeFi Oracle Meta Mainnet # This script generates validator keys and creates the genesis.json with IBFT 2.0 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/../lib/init.sh" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" CONFIG_DIR="$PROJECT_ROOT/config" KEYS_DIR="$PROJECT_ROOT/keys" VALIDATORS_DIR="$KEYS_DIR/validators" ORACLE_DIR="$KEYS_DIR/oracle" # Configuration CHAIN_ID=138 BLOCK_PERIOD=2 EPOCH_LENGTH=30000 REQUEST_TIMEOUT=10 GAS_LIMIT="0x1c9c380" NUM_VALIDATORS=4 log_success "Generating genesis for ChainID ${CHAIN_ID} - DeFi Oracle Meta Mainnet" # Check if Besu is installed if ! command -v besu &> /dev/null; then log_error "Error: Besu CLI not found. Please install Besu." echo "Visit: https://besu.hyperledger.org/en/stable/HowTo/Get-Started/Installation-Options/" exit 1 fi # Create directories mkdir -p "$VALIDATORS_DIR" mkdir -p "$ORACLE_DIR" mkdir -p "$CONFIG_DIR" # Generate validator keys log_warn "Generating ${NUM_VALIDATORS} validator keys..." VALIDATOR_ADDRESSES=() for i in $(seq 1 $NUM_VALIDATORS); do VALIDATOR_DIR="$VALIDATORS_DIR/validator-$i" mkdir -p "$VALIDATOR_DIR" # Generate key pair besu operator generate-blockchain-config \ --config-file="$CONFIG_DIR/genesis-template.json" \ --to="$VALIDATOR_DIR" \ --private-key-file-name=key.priv 2>/dev/null || \ besu public-key export-address \ --node-private-key-file="$VALIDATOR_DIR/key.priv" > "$VALIDATOR_DIR/address.txt" 2>/dev/null || \ { # Fallback: use openssl to generate keys if Besu tooling is limited openssl ecparam -genkey -name secp256k1 -noout -out "$VALIDATOR_DIR/key.pem" 2>/dev/null # Extract public key and derive address (simplified) openssl ec -in "$VALIDATOR_DIR/key.pem" -pubout -out "$VALIDATOR_DIR/pubkey.pem" 2>/dev/null } # For now, we'll generate keys using a simpler method # In production, use proper HSM/KMS key generation if [ ! -f "$VALIDATOR_DIR/key.priv" ]; then # Generate a private key (32 bytes hex) PRIVATE_KEY=$(openssl rand -hex 32) echo "$PRIVATE_KEY" > "$VALIDATOR_DIR/key.priv" log_success "Generated validator $i key" fi # Note: In production, use Besu's operator generate-blockchain-config # which properly generates keys and addresses done # Generate oracle key log_warn "Generating oracle key..." ORACLE_PRIVATE_KEY=$(openssl rand -hex 32) echo "$ORACLE_PRIVATE_KEY" > "$ORACLE_DIR/key.priv" log_success "Generated oracle key" # Generate IBFT extraData # Note: This is a placeholder. In production, use Besu's operator generate-blockchain-config # which generates the proper RLP-encoded extraData with validator addresses log_warn "Generating IBFT extraData..." EXTRA_DATA="0x" # Create genesis.json log_warn "Creating genesis.json..." cat > "$CONFIG_DIR/genesis.json" < "$CONFIG_DIR/genesis-template.json" <