156 lines
5.3 KiB
Django/Jinja
156 lines
5.3 KiB
Django/Jinja
#!/bin/bash
|
|
# Info: Script to generate and manage Polkadot solochain keys
|
|
# Author: Provisioning System
|
|
|
|
set -e
|
|
|
|
POLKADOT_BIN_PATH="{{ polkadot_solochain.bin_path }}"
|
|
POLKADOT_NODE_BINARY="{{ polkadot_solochain.node_binary }}"
|
|
POLKADOT_BASE_PATH="{{ polkadot_solochain.base_path }}"
|
|
POLKADOT_CONFIG_PATH="{{ polkadot_solochain.config_path }}"
|
|
POLKADOT_RUN_USER="{{ polkadot_solochain.run_user.name }}"
|
|
CHAIN_SPEC_FILE="{{ polkadot_solochain.config_path }}/{{ polkadot_solochain.network.chain_id }}.json"
|
|
|
|
echo "Polkadot Solochain Key Management"
|
|
echo "================================="
|
|
|
|
# Function to generate Aura keys
|
|
generate_aura_key() {
|
|
local seed="$1"
|
|
local name="$2"
|
|
|
|
echo "Generating Aura key for $name..."
|
|
sudo -u "$POLKADOT_RUN_USER" "$POLKADOT_BIN_PATH/$POLKADOT_NODE_BINARY" key insert \
|
|
--base-path "$POLKADOT_BASE_PATH" \
|
|
--chain "$CHAIN_SPEC_FILE" \
|
|
--scheme Sr25519 \
|
|
--suri "$seed" \
|
|
--key-type aura \
|
|
--password-interactive < /dev/null
|
|
}
|
|
|
|
# Function to generate GRANDPA keys
|
|
generate_grandpa_key() {
|
|
local seed="$1"
|
|
local name="$2"
|
|
|
|
echo "Generating GRANDPA key for $name..."
|
|
sudo -u "$POLKADOT_RUN_USER" "$POLKADOT_BIN_PATH/$POLKADOT_NODE_BINARY" key insert \
|
|
--base-path "$POLKADOT_BASE_PATH" \
|
|
--chain "$CHAIN_SPEC_FILE" \
|
|
--scheme Ed25519 \
|
|
--suri "$seed" \
|
|
--key-type gran \
|
|
--password-interactive < /dev/null
|
|
}
|
|
|
|
# Function to generate session keys
|
|
generate_session_keys() {
|
|
echo "Generating session keys..."
|
|
|
|
# Generate random session keys
|
|
AURA_SEED="$(openssl rand -hex 32)"
|
|
GRANDPA_SEED="$(openssl rand -hex 32)"
|
|
|
|
# Insert keys
|
|
generate_aura_key "0x$AURA_SEED" "validator"
|
|
generate_grandpa_key "0x$GRANDPA_SEED" "validator"
|
|
|
|
# Save seeds for reference
|
|
echo "AURA_SEED=0x$AURA_SEED" > "$POLKADOT_CONFIG_PATH/validator-seeds"
|
|
echo "GRANDPA_SEED=0x$GRANDPA_SEED" >> "$POLKADOT_CONFIG_PATH/validator-seeds"
|
|
chmod 600 "$POLKADOT_CONFIG_PATH/validator-seeds"
|
|
chown "$POLKADOT_RUN_USER:$POLKADOT_RUN_USER" "$POLKADOT_CONFIG_PATH/validator-seeds"
|
|
|
|
echo "Session keys generated and saved to $POLKADOT_CONFIG_PATH/validator-seeds"
|
|
}
|
|
|
|
# Function to generate development keys (Alice, Bob, etc.)
|
|
generate_dev_keys() {
|
|
echo "Setting up development keys..."
|
|
|
|
# Alice
|
|
generate_aura_key "//Alice" "Alice"
|
|
generate_grandpa_key "//Alice" "Alice"
|
|
|
|
# Bob (if needed for multi-node setup)
|
|
if [ "$1" = "multi" ]; then
|
|
generate_aura_key "//Bob" "Bob"
|
|
generate_grandpa_key "//Bob" "Bob"
|
|
|
|
# Charlie
|
|
generate_aura_key "//Charlie" "Charlie"
|
|
generate_grandpa_key "//Charlie" "Charlie"
|
|
fi
|
|
|
|
echo "Development keys configured"
|
|
}
|
|
|
|
# Function to list existing keys
|
|
list_keys() {
|
|
echo "Listing existing keys in keystore..."
|
|
if [ -d "$POLKADOT_BASE_PATH/chains/{{ polkadot_solochain.network.chain_id }}/keystore" ]; then
|
|
ls -la "$POLKADOT_BASE_PATH/chains/{{ polkadot_solochain.network.chain_id }}/keystore"
|
|
else
|
|
echo "No keystore found at $POLKADOT_BASE_PATH/chains/{{ polkadot_solochain.network.chain_id }}/keystore"
|
|
fi
|
|
}
|
|
|
|
# Function to show public keys
|
|
show_public_keys() {
|
|
echo "Extracting public keys..."
|
|
if command -v jq >/dev/null 2>&1; then
|
|
# Extract public keys from chain spec if available
|
|
if [ -f "$CHAIN_SPEC_FILE" ]; then
|
|
echo "Aura authorities:"
|
|
jq -r '.genesis.runtime.aura.authorities[]?' "$CHAIN_SPEC_FILE" 2>/dev/null || echo "No Aura authorities found"
|
|
|
|
echo "GRANDPA authorities:"
|
|
jq -r '.genesis.runtime.grandpa.authorities[]?[0]' "$CHAIN_SPEC_FILE" 2>/dev/null || echo "No GRANDPA authorities found"
|
|
fi
|
|
else
|
|
echo "jq not available - install jq to extract public keys from chain spec"
|
|
fi
|
|
}
|
|
|
|
# Main command handling
|
|
case "${1:-help}" in
|
|
"session")
|
|
generate_session_keys
|
|
;;
|
|
"dev")
|
|
generate_dev_keys "${2:-single}"
|
|
;;
|
|
"list")
|
|
list_keys
|
|
;;
|
|
"public")
|
|
show_public_keys
|
|
;;
|
|
"clean")
|
|
echo "Removing all keys from keystore..."
|
|
if [ -d "$POLKADOT_BASE_PATH/chains/{{ polkadot_solochain.network.chain_id }}/keystore" ]; then
|
|
sudo -u "$POLKADOT_RUN_USER" rm -rf "$POLKADOT_BASE_PATH/chains/{{ polkadot_solochain.network.chain_id }}/keystore"/*
|
|
echo "Keystore cleaned"
|
|
else
|
|
echo "No keystore found"
|
|
fi
|
|
;;
|
|
"help"|*)
|
|
echo "Usage: $0 [command]"
|
|
echo ""
|
|
echo "Commands:"
|
|
echo " session Generate random session keys for validator"
|
|
echo " dev [multi] Generate development keys (Alice, Bob, Charlie if multi)"
|
|
echo " list List existing keys in keystore"
|
|
echo " public Show public keys from chain specification"
|
|
echo " clean Remove all keys from keystore"
|
|
echo " help Show this help message"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 dev # Generate Alice keys for development"
|
|
echo " $0 dev multi # Generate Alice, Bob, Charlie keys"
|
|
echo " $0 session # Generate random validator keys"
|
|
echo " $0 list # Show current keystore contents"
|
|
;;
|
|
esac |