/ testnet / scripts / generate-keys.sh
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 "$@"