mirror of
https://github.com/sonr-io/sonr.git
synced 2026-08-03 01:41:44 +00:00
Feat/add networks (#1303)
* No commit suggestions generated * No commit suggestions generated * No commit suggestions generated
This commit is contained in:
+93
-125
@@ -1,146 +1,114 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eux
|
||||
# scripts/create-genesis.sh - Create genesis file for Sonr network
|
||||
|
||||
# generate_vrf_key generates a VRF keypair and stores it securely
|
||||
generate_vrf_key() {
|
||||
local home_dir="$1"
|
||||
set -euo pipefail
|
||||
|
||||
if [[ -z "${home_dir}" ]]; then
|
||||
echo "Error: HOME_DIR parameter is required" >&2
|
||||
return 1
|
||||
fi
|
||||
# Source helper libraries
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/lib/env.sh"
|
||||
source "${SCRIPT_DIR}/lib/keys.sh"
|
||||
source "${SCRIPT_DIR}/lib/genesis.sh"
|
||||
|
||||
local genesis_file="${home_dir}/config/genesis.json"
|
||||
|
||||
if [[ ! -f "${genesis_file}" ]]; then
|
||||
echo "Error: Genesis file not found at ${genesis_file}" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
local chain_id
|
||||
chain_id=$(jq -r '.chain_id' "${genesis_file}" 2>/dev/null)
|
||||
|
||||
if [[ -z "${chain_id}" || "${chain_id}" == "null" ]]; then
|
||||
echo "Error: Failed to extract chain-id from genesis file" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "Generating VRF keypair for network: ${chain_id}"
|
||||
|
||||
local entropy_seed
|
||||
entropy_seed=$(echo -n "${chain_id}" | sha256sum | cut -d' ' -f1)
|
||||
|
||||
local seed_part1="${entropy_seed}"
|
||||
local seed_part2
|
||||
seed_part2=$(echo -n "${entropy_seed}" | sha256sum | cut -d' ' -f1)
|
||||
|
||||
local vrf_key_hex="${seed_part1}${seed_part2}"
|
||||
|
||||
if [[ ${#vrf_key_hex} -ne 128 ]]; then
|
||||
echo "Error: Generated VRF key has incorrect size: ${#vrf_key_hex}" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
local vrf_key_path="${home_dir}/vrf_secret.key"
|
||||
mkdir -p "${home_dir}"
|
||||
|
||||
echo -n "${vrf_key_hex}" | xxd -r -p > "${vrf_key_path}"
|
||||
chmod 0600 "${vrf_key_path}"
|
||||
|
||||
local file_size
|
||||
file_size=$(wc -c < "${vrf_key_path}")
|
||||
|
||||
if [[ ${file_size} -ne 64 ]]; then
|
||||
echo "Error: VRF key file has incorrect size: ${file_size} bytes" >&2
|
||||
rm -f "${vrf_key_path}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "✓ VRF keypair generated for network: ${chain_id}"
|
||||
echo "✓ VRF secret key stored securely: ${vrf_key_path}"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
DENOM="${DENOM:=usnr}"
|
||||
# Match init-testnet.sh allocation: 100000000000000000000000000snr = 100000000000000000000000000000000usnr
|
||||
COINS="${COINS:=100000000000000000000000000000000$DENOM,100000000000000000000000000snr}"
|
||||
CHAIN_ID="${CHAIN_ID:=sonrtest_1-1}"
|
||||
CHAIN_BIN="${CHAIN_BIN:=snrd}"
|
||||
CHAIN_DIR="${CHAIN_DIR:=$HOME/.sonr}"
|
||||
KEYS_CONFIG="${KEYS_CONFIG:=configs/keys.json}"
|
||||
# Initialize environment
|
||||
init_env
|
||||
|
||||
# Set defaults for genesis creation
|
||||
FAUCET_ENABLED="${FAUCET_ENABLED:=true}"
|
||||
NUM_VALIDATORS="${NUM_VALIDATORS:=1}"
|
||||
NUM_RELAYERS="${NUM_RELAYERS:=0}"
|
||||
|
||||
# check if the binary has genesis subcommand or not, if not, set CHAIN_GENESIS_CMD to empty
|
||||
CHAIN_GENESIS_CMD=$($CHAIN_BIN 2>&1 | grep -q "genesis-related subcommands" && echo "genesis" || echo "")
|
||||
# Match init-testnet.sh allocation: 100000000000000000000000000snr = 100000000000000000000000000000000usnr
|
||||
BASE_COINS="${BASE_COINS:=100000000000000000000000000000000${DENOM},100000000000000000000000000snr}"
|
||||
VALIDATOR_AMOUNT="1000000000000000000000000000${DENOM}"
|
||||
|
||||
jq -r ".genesis[0].mnemonic" "$KEYS_CONFIG" | $CHAIN_BIN init "$CHAIN_ID" --chain-id "$CHAIN_ID" --default-denom "$DENOM" --recover
|
||||
|
||||
# Add genesis keys to the keyring and self delegate initial coins
|
||||
echo "Adding key...." $(jq -r ".genesis[0].name" "$KEYS_CONFIG")
|
||||
jq -r ".genesis[0].mnemonic" "$KEYS_CONFIG" | $CHAIN_BIN keys add $(jq -r ".genesis[0].name" "$KEYS_CONFIG") --recover --keyring-backend="test"
|
||||
$CHAIN_BIN "$CHAIN_GENESIS_CMD" add-genesis-account $($CHAIN_BIN keys show -a $(jq -r .genesis[0].name "$KEYS_CONFIG") --keyring-backend="test") "$COINS" --keyring-backend="test"
|
||||
|
||||
# Add faucet key to the keyring and self delegate initial coins
|
||||
echo "Adding key...." $(jq -r ".faucet[0].name" "$KEYS_CONFIG")
|
||||
jq -r ".faucet[0].mnemonic" "$KEYS_CONFIG" | $CHAIN_BIN keys add $(jq -r ".faucet[0].name" "$KEYS_CONFIG") --recover --keyring-backend="test"
|
||||
$CHAIN_BIN "$CHAIN_GENESIS_CMD" add-genesis-account $($CHAIN_BIN keys show -a $(jq -r .faucet[0].name "$KEYS_CONFIG") --keyring-backend="test") "$COINS" --keyring-backend="test"
|
||||
|
||||
# Add test keys to the keyring and self delegate initial coins
|
||||
echo "Adding key...." $(jq -r ".keys[0].name" "$KEYS_CONFIG")
|
||||
jq -r ".keys[0].mnemonic" "$KEYS_CONFIG" | $CHAIN_BIN keys add $(jq -r ".keys[0].name" "$KEYS_CONFIG") --recover --keyring-backend="test"
|
||||
$CHAIN_BIN "$CHAIN_GENESIS_CMD" add-genesis-account $($CHAIN_BIN keys show -a $(jq -r .keys[0].name "$KEYS_CONFIG") --keyring-backend="test") "$COINS" --keyring-backend="test"
|
||||
|
||||
if [[ $FAUCET_ENABLED == "false" && $NUM_RELAYERS -gt "-1" ]]; then
|
||||
## Add relayers keys and delegate tokens
|
||||
for i in $(seq 0 "$NUM_RELAYERS"); do
|
||||
# Add relayer key and delegate tokens
|
||||
RELAYER_KEY_NAME="$(jq -r ".relayers[$i].name" "$KEYS_CONFIG")"
|
||||
echo "Adding relayer key.... $RELAYER_KEY_NAME"
|
||||
jq -r ".relayers[$i].mnemonic" "$KEYS_CONFIG" | $CHAIN_BIN keys add "$RELAYER_KEY_NAME" --recover --keyring-backend="test"
|
||||
$CHAIN_BIN "$CHAIN_GENESIS_CMD" add-genesis-account $($CHAIN_BIN keys show -a "$RELAYER_KEY_NAME" --keyring-backend="test") "$COINS" --keyring-backend="test"
|
||||
# Add relayer-cli key and delegate tokens
|
||||
RELAYER_CLI_KEY_NAME="$(jq -r ".relayers_cli[$i].name" "$KEYS_CONFIG")"
|
||||
echo "Adding relayer-cli key.... $RELAYER_CLI_KEY_NAME"
|
||||
jq -r ".relayers_cli[$i].mnemonic" "$KEYS_CONFIG" | $CHAIN_BIN keys add "$RELAYER_CLI_KEY_NAME" --recover --keyring-backend="test"
|
||||
$CHAIN_BIN "$CHAIN_GENESIS_CMD" add-genesis-account $($CHAIN_BIN keys show -a "$RELAYER_CLI_KEY_NAME" --keyring-backend="test") "$COINS" --keyring-backend="test"
|
||||
done
|
||||
# Check if binary has genesis subcommand
|
||||
CHAIN_GENESIS_CMD=""
|
||||
if $CHAIN_BIN 2>&1 | grep -q "genesis-related subcommands"; then
|
||||
CHAIN_GENESIS_CMD="genesis"
|
||||
fi
|
||||
|
||||
## if faucet not enabled then add validator and relayer with index as keys and into gentx
|
||||
if [[ $FAUCET_ENABLED == "false" && $NUM_VALIDATORS -gt "1" ]]; then
|
||||
## Add validators key and delegate tokens
|
||||
for i in $(seq 0 "$NUM_VALIDATORS"); do
|
||||
VAL_KEY_NAME="$(jq -r '.validators[0].name' "$KEYS_CONFIG")-$i"
|
||||
echo "Adding validator key.... $VAL_KEY_NAME"
|
||||
jq -r ".validators[0].mnemonic" "$KEYS_CONFIG" | $CHAIN_BIN keys add "$VAL_KEY_NAME" --index "$i" --recover --keyring-backend="test"
|
||||
$CHAIN_BIN "$CHAIN_GENESIS_CMD" add-genesis-account $($CHAIN_BIN keys show -a "$VAL_KEY_NAME" --keyring-backend="test") "$COINS" --keyring-backend="test"
|
||||
done
|
||||
log_info "Creating genesis for Sonr network: $CHAIN_ID"
|
||||
|
||||
# Initialize chain
|
||||
local genesis_mnemonic
|
||||
genesis_mnemonic=$(jq -r ".genesis[0].mnemonic" "$KEYS_CONFIG")
|
||||
echo "$genesis_mnemonic" | $CHAIN_BIN init "$CHAIN_ID" --chain-id "$CHAIN_ID" --default-denom "$DENOM" --recover
|
||||
|
||||
# Add genesis accounts
|
||||
log_info "Adding genesis accounts..."
|
||||
|
||||
# Genesis key
|
||||
local genesis_key_name
|
||||
genesis_key_name=$(jq -r ".genesis[0].name" "$KEYS_CONFIG")
|
||||
import_mnemonic "$genesis_key_name" "$genesis_mnemonic"
|
||||
fund_key "$genesis_key_name" "$BASE_COINS"
|
||||
|
||||
# Faucet key
|
||||
local faucet_key_name
|
||||
faucet_key_name=$(jq -r ".faucet[0].name" "$KEYS_CONFIG")
|
||||
local faucet_mnemonic
|
||||
faucet_mnemonic=$(jq -r ".faucet[0].mnemonic" "$KEYS_CONFIG")
|
||||
import_mnemonic "$faucet_key_name" "$faucet_mnemonic"
|
||||
fund_key "$faucet_key_name" "$BASE_COINS"
|
||||
|
||||
# Test key
|
||||
local test_key_name
|
||||
test_key_name=$(jq -r ".keys[0].name" "$KEYS_CONFIG")
|
||||
local test_mnemonic
|
||||
test_mnemonic=$(jq -r ".keys[0].mnemonic" "$KEYS_CONFIG")
|
||||
import_mnemonic "$test_key_name" "$test_mnemonic"
|
||||
fund_key "$test_key_name" "$BASE_COINS"
|
||||
|
||||
# Add relayer keys if faucet is disabled
|
||||
if [[ "$FAUCET_ENABLED" == "false" && "$NUM_RELAYERS" -gt 0 ]]; then
|
||||
for i in $(seq 0 "$NUM_RELAYERS"); do
|
||||
local relayer_key_name
|
||||
relayer_key_name=$(jq -r ".relayers[$i].name" "$KEYS_CONFIG")
|
||||
local relayer_mnemonic
|
||||
relayer_mnemonic=$(jq -r ".relayers[$i].mnemonic" "$KEYS_CONFIG")
|
||||
import_mnemonic "$relayer_key_name" "$relayer_mnemonic"
|
||||
fund_key "$relayer_key_name" "$BASE_COINS"
|
||||
|
||||
local relayer_cli_key_name
|
||||
relayer_cli_key_name=$(jq -r ".relayers_cli[$i].name" "$KEYS_CONFIG")
|
||||
local relayer_cli_mnemonic
|
||||
relayer_cli_mnemonic=$(jq -r ".relayers_cli[$i].mnemonic" "$KEYS_CONFIG")
|
||||
import_mnemonic "$relayer_cli_key_name" "$relayer_cli_mnemonic"
|
||||
fund_key "$relayer_cli_key_name" "$BASE_COINS"
|
||||
done
|
||||
fi
|
||||
|
||||
echo "Creating gentx..."
|
||||
COIN=$(echo "$COINS" | cut -d ',' -f1)
|
||||
# Use full validator amount to meet minimum delegation requirement (274890886240)
|
||||
# Match the working init-testnet.sh: 1000000000000000000000snr = 1000000000000000000000000000usnr
|
||||
VALIDATOR_AMOUNT="1000000000000000000000000000$DENOM"
|
||||
$CHAIN_BIN "$CHAIN_GENESIS_CMD" gentx $(jq -r ".genesis[0].name" "$KEYS_CONFIG") "$VALIDATOR_AMOUNT" --keyring-backend="test" --chain-id "$CHAIN_ID" --gas-prices="0$DENOM"
|
||||
# Add additional validator keys if needed
|
||||
if [[ "$FAUCET_ENABLED" == "false" && "$NUM_VALIDATORS" -gt 1 ]]; then
|
||||
for i in $(seq 1 "$NUM_VALIDATORS"); do
|
||||
local val_key_name="${genesis_key_name}-${i}"
|
||||
local val_mnemonic
|
||||
val_mnemonic=$(jq -r ".validators[0].mnemonic" "$KEYS_CONFIG")
|
||||
import_mnemonic "$val_key_name" "$val_mnemonic"
|
||||
fund_key "$val_key_name" "$BASE_COINS"
|
||||
done
|
||||
fi
|
||||
|
||||
echo "Output of gentx"
|
||||
cat "$CHAIN_DIR"/config/gentx/*.json | jq
|
||||
# Create genesis transaction
|
||||
log_info "Creating genesis transaction..."
|
||||
$CHAIN_BIN "$CHAIN_GENESIS_CMD" gentx "$genesis_key_name" "$VALIDATOR_AMOUNT" \
|
||||
--keyring-backend "$KEYRING_BACKEND" \
|
||||
--chain-id "$CHAIN_ID" \
|
||||
--gas-prices "0${DENOM}"
|
||||
|
||||
echo "Running collect-gentxs"
|
||||
log_info "Genesis transaction output:"
|
||||
cat "$CHAIN_DIR/config/gentx"/*.json | jq
|
||||
|
||||
# Collect genesis transactions
|
||||
log_info "Collecting genesis transactions..."
|
||||
$CHAIN_BIN "$CHAIN_GENESIS_CMD" collect-gentxs
|
||||
|
||||
ls "$CHAIN_DIR"/config
|
||||
|
||||
# Generate VRF keypair
|
||||
echo ""
|
||||
echo "Generating VRF keypair..."
|
||||
if ! generate_vrf_key "${CHAIN_DIR}"; then
|
||||
echo "Warning: VRF key generation failed, but continuing..."
|
||||
echo "Note: Multi-validator encryption features may not work without VRF keys"
|
||||
log_info "Generating VRF keypair..."
|
||||
if ! generate_vrf_key "$CHAIN_DIR"; then
|
||||
log_warn "VRF key generation failed, but continuing..."
|
||||
log_warn "Note: Multi-validator encryption features may not work without VRF keys"
|
||||
fi
|
||||
|
||||
log_success "Genesis creation completed"
|
||||
|
||||
Reference in New Issue
Block a user