synor/scripts/generate-node-keys.sh
Gulshan Yadav 48949ebb3f Initial commit: Synor blockchain monorepo
A complete blockchain implementation featuring:
- synord: Full node with GHOSTDAG consensus
- explorer-web: Modern React blockchain explorer with 3D DAG visualization
- CLI wallet and tools
- Smart contract SDK and example contracts (DEX, NFT, token)
- WASM crypto library for browser/mobile
2026-01-08 05:22:17 +05:30

136 lines
3.6 KiB
Bash
Executable file

#!/bin/bash
# =============================================================================
# Synor Node Key Generation Script
# =============================================================================
# Generates cryptographic keys for Synor nodes.
# Each node needs:
# - Ed25519 keypair (for P2P identity)
# - Dilithium3 keypair (for post-quantum signatures)
# - Mining address (for block rewards)
# =============================================================================
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
# Colors
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
# Default output directory
OUTPUT_DIR="${1:-$PROJECT_DIR/keys}"
# Create output directory
mkdir -p "$OUTPUT_DIR"
generate_node_keys() {
local node_name="$1"
local node_dir="$OUTPUT_DIR/$node_name"
log_info "Generating keys for $node_name..."
mkdir -p "$node_dir"
# Generate Ed25519 keypair for P2P identity
# Using OpenSSL for key generation
openssl genpkey -algorithm Ed25519 -out "$node_dir/p2p.key" 2>/dev/null
openssl pkey -in "$node_dir/p2p.key" -pubout -out "$node_dir/p2p.pub" 2>/dev/null
# Extract peer ID from public key (base58 encoding of the public key bytes)
PUBKEY_HEX=$(openssl pkey -in "$node_dir/p2p.key" -pubout -outform DER 2>/dev/null | xxd -p | tr -d '\n' | tail -c 64)
echo "$PUBKEY_HEX" > "$node_dir/peer_id.hex"
# Generate a random mining address (for testnet, this is simplified)
# In production, this would be derived from a proper wallet
MINING_ADDR=$(openssl rand -hex 32)
echo "synor1$MINING_ADDR" > "$node_dir/mining_address.txt"
# Create node configuration snippet
cat > "$node_dir/node_config.toml" << EOF
# Node Configuration for $node_name
# Generated: $(date -u +"%Y-%m-%dT%H:%M:%SZ")
[identity]
# P2P private key file
key_file = "p2p.key"
# Peer ID (derived from public key)
peer_id = "$PUBKEY_HEX"
[mining]
# Mining reward address
coinbase_address = "synor1$MINING_ADDR"
EOF
log_success "Generated keys for $node_name in $node_dir"
}
print_usage() {
echo "Usage: $0 [output_dir] [node_names...]"
echo ""
echo "Examples:"
echo " $0 # Generate keys for seed1, seed2, seed3 in ./keys"
echo " $0 /path/to/keys # Specify output directory"
echo " $0 ./keys node1 node2 node3 # Generate for specific nodes"
}
# Main
echo ""
echo "==============================================="
echo " Synor Node Key Generation"
echo "==============================================="
echo ""
# Check for openssl
if ! command -v openssl &> /dev/null; then
echo "Error: OpenSSL is required but not installed."
exit 1
fi
# Parse arguments
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
print_usage
exit 0
fi
# Determine output directory
if [[ -n "$1" && ! "$1" =~ ^- ]]; then
OUTPUT_DIR="$1"
shift
fi
# Determine node names
if [[ $# -gt 0 ]]; then
NODES=("$@")
else
NODES=("seed1" "seed2" "seed3")
fi
log_info "Output directory: $OUTPUT_DIR"
log_info "Generating keys for: ${NODES[*]}"
echo ""
# Generate keys for each node
for node in "${NODES[@]}"; do
generate_node_keys "$node"
done
echo ""
log_success "All keys generated!"
echo ""
echo "Keys saved to: $OUTPUT_DIR"
echo ""
echo "WARNING: Keep private keys secure! Never commit them to version control."
echo ""
# Create a .gitignore in the keys directory
echo "*" > "$OUTPUT_DIR/.gitignore"
echo "!.gitignore" >> "$OUTPUT_DIR/.gitignore"