generate-keys.sh
1 #!/usr/bin/env bash 2 # ============================================================================= 3 # ALPHA/DELTA Network - Key Generation Script 4 # ============================================================================= 5 # Generates validator keys and prepares key material for testnet deployment. 6 # 7 # Usage: 8 # ./generate-keys.sh [options] 9 # 10 # Options: 11 # --validators N Number of validators (default: 5) 12 # --output-dir DIR Output directory for keys (default: ../genesis/keys) 13 # --encrypt Encrypt keys with password 14 # --help Show this help message 15 16 set -euo pipefail 17 18 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 19 OUTPUT_DIR="${SCRIPT_DIR}/../genesis/keys" 20 NUM_VALIDATORS=5 21 ENCRYPT=false 22 23 # Colors 24 RED='\033[0;31m' 25 GREEN='\033[0;32m' 26 YELLOW='\033[1;33m' 27 BLUE='\033[0;34m' 28 NC='\033[0m' 29 30 # Parse arguments 31 while [[ $# -gt 0 ]]; do 32 case $1 in 33 --validators) 34 NUM_VALIDATORS="$2" 35 shift 2 36 ;; 37 --output-dir) 38 OUTPUT_DIR="$2" 39 shift 2 40 ;; 41 --encrypt) 42 ENCRYPT=true 43 shift 44 ;; 45 --help) 46 grep -E '^#' "$0" | grep -v '#!/' | sed 's/^# //' | sed 's/^#//' 47 exit 0 48 ;; 49 *) 50 echo -e "${RED}Unknown option: $1${NC}" 51 exit 1 52 ;; 53 esac 54 done 55 56 log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } 57 log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } 58 log_error() { echo -e "${RED}[ERROR]${NC} $1"; } 59 60 # Create output directory 61 mkdir -p "${OUTPUT_DIR}" 62 chmod 700 "${OUTPUT_DIR}" 63 64 log_info "Generating keys for ${NUM_VALIDATORS} validators..." 65 66 # Generate SSH deployment key 67 generate_ssh_key() { 68 log_info "Generating SSH deployment key..." 69 local ssh_key="${OUTPUT_DIR}/../testnet_ed25519" 70 71 if [[ -f "${ssh_key}" ]]; then 72 log_info "SSH key already exists: ${ssh_key}" 73 else 74 ssh-keygen -t ed25519 -f "${ssh_key}" -N "" -C "testnet-deployment-key" 75 chmod 600 "${ssh_key}" 76 log_success "SSH key generated: ${ssh_key}" 77 fi 78 } 79 80 # Generate validator consensus keys 81 generate_validator_keys() { 82 for i in $(seq 1 "${NUM_VALIDATORS}"); do 83 log_info "Generating keys for validator-${i}..." 84 85 local validator_dir="${OUTPUT_DIR}/validator-${i}" 86 mkdir -p "${validator_dir}" 87 chmod 700 "${validator_dir}" 88 89 # Generate consensus key (BLS) 90 # In production, this would use adnet key generation 91 # For now, create placeholder structure 92 cat > "${validator_dir}/consensus.json" << EOF 93 { 94 "type": "bls12-381", 95 "validator_id": "validator-${i}", 96 "public_key": "", 97 "secret_key_encrypted": "", 98 "created_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)", 99 "note": "PLACEHOLDER - Generate with: adnet validator keygen" 100 } 101 EOF 102 103 # Generate account key (Ed25519) 104 cat > "${validator_dir}/account.json" << EOF 105 { 106 "type": "ed25519", 107 "validator_id": "validator-${i}", 108 "address": "", 109 "public_key": "", 110 "secret_key_encrypted": "", 111 "created_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)", 112 "note": "PLACEHOLDER - Generate with: adnet alpha account new" 113 } 114 EOF 115 116 # Generate network key (Ed25519 for libp2p) 117 cat > "${validator_dir}/network.json" << EOF 118 { 119 "type": "ed25519", 120 "validator_id": "validator-${i}", 121 "peer_id": "", 122 "public_key": "", 123 "secret_key_encrypted": "", 124 "created_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)", 125 "note": "PLACEHOLDER - Generate with: adnet keygen --type network" 126 } 127 EOF 128 129 chmod 600 "${validator_dir}"/*.json 130 log_success "Keys generated for validator-${i}" 131 done 132 } 133 134 # Generate genesis validator list 135 generate_validator_list() { 136 log_info "Generating validator list..." 137 138 local validator_list="${OUTPUT_DIR}/../validators.json" 139 140 echo "[" > "${validator_list}" 141 for i in $(seq 1 "${NUM_VALIDATORS}"); do 142 local comma="" 143 if [[ $i -lt ${NUM_VALIDATORS} ]]; then 144 comma="," 145 fi 146 cat >> "${validator_list}" << EOF 147 { 148 "name": "validator-${i}", 149 "host": "testnet-validator-${i}.ac-dc.network", 150 "consensus_key": "", 151 "account_address": "", 152 "peer_id": "", 153 "stake": "3000000000000", 154 "commission_percent": 5 155 }${comma} 156 EOF 157 done 158 echo "]" >> "${validator_list}" 159 160 log_success "Validator list generated: ${validator_list}" 161 } 162 163 # Create key summary 164 create_summary() { 165 local summary="${OUTPUT_DIR}/../key-summary.txt" 166 167 cat > "${summary}" << EOF 168 ALPHA/DELTA Testnet Key Summary 169 =============================== 170 Generated: $(date -u +%Y-%m-%dT%H:%M:%SZ) 171 Validators: ${NUM_VALIDATORS} 172 173 Key Files Location: ${OUTPUT_DIR} 174 175 Structure: 176 ${OUTPUT_DIR}/ 177 EOF 178 179 for i in $(seq 1 "${NUM_VALIDATORS}"); do 180 cat >> "${summary}" << EOF 181 validator-${i}/ 182 consensus.json - BLS consensus key 183 account.json - Ed25519 account key 184 network.json - Ed25519 network/peer key 185 EOF 186 done 187 188 cat >> "${summary}" << EOF 189 190 IMPORTANT: 191 1. Replace placeholder keys with real keys using adnet keygen 192 2. Store keys securely - they control validator funds 193 3. Back up keys before deployment 194 4. Never commit secret keys to version control 195 196 Key Generation Commands: 197 adnet validator keygen --output <path> 198 adnet alpha account new --output <path> 199 adnet keygen --type network --output <path> 200 EOF 201 202 log_success "Summary written to: ${summary}" 203 } 204 205 main() { 206 echo "==============================================" 207 echo " ALPHA/DELTA Network - Key Generation" 208 echo "==============================================" 209 echo "" 210 211 generate_ssh_key 212 generate_validator_keys 213 generate_validator_list 214 create_summary 215 216 echo "" 217 log_success "Key generation complete!" 218 echo "" 219 echo "Output directory: ${OUTPUT_DIR}" 220 echo "" 221 echo "Next steps:" 222 echo " 1. Review key-summary.txt for instructions" 223 echo " 2. Generate real keys using adnet keygen commands" 224 echo " 3. Securely distribute keys to validators" 225 echo " 4. Run deploy-testnet.sh to deploy" 226 echo "" 227 } 228 229 main "$@"