#!/usr/bin/env bash # # Start a validator # here=$(dirname "$0") # shellcheck source=multinode-demo/common.sh source "$here"/common.sh usage() { if [[ -n $1 ]]; then echo "$*" echo fi cat </dev/null 2>&1 } set -e PS4="$(basename "$0"): " pid= kill_node() { # Note: do not echo anything from this function to ensure $pid is actually # killed when stdout/stderr are redirected set +ex if [[ -n $pid ]]; then declare _pid=$pid pid= kill "$_pid" || true wait "$_pid" || true fi exit } kill_node_and_exit() { kill_node exit } trap 'kill_node_and_exit' INT TERM ERR if ((reset_ledger)); then echo "Resetting ledger..." ( set -x rm -rf "$ledger_dir" ) fi wallet() { ( set -x $solana_wallet --keypair "$identity_keypair_path" --url "$rpc_url" "$@" ) } setup_validator_accounts() { declare node_lamports=$1 if ((airdrops_enabled)); then echo "Adding $node_lamports to validator identity account:" ( declare fees=100 # TODO: No hardcoded transaction fees, fetch the current cluster fees wallet airdrop $((node_lamports+fees)) ) || return $? else echo "Validator identity account balance:" wallet balance || return $? fi if ! wallet show-vote-account "$vote_pubkey"; then echo "Creating validator vote account" wallet create-vote-account "$vote_pubkey" "$identity_pubkey" 1 --commission 127 || return $? fi echo "Validator vote account configured" if ! wallet show-storage-account "$storage_pubkey"; then echo "Creating validator storage account" wallet create-validator-storage-account "$identity_pubkey" "$storage_pubkey" || return $? fi echo "Validator storage account configured" return 0 } while true; do if new_genesis_block; then # If the genesis block has changed remove the now stale ledger and start all # over again ( set -x rm -rf "$ledger_dir" ) fi if [[ ! -f "$ledger_dir"/.genesis ]]; then echo "Fetching ledger from $rpc_url/genesis.tgz..." SECONDS= mkdir -p "$ledger_dir" while ! curl -f "$rpc_url"/genesis.tgz -o "$ledger_dir"/genesis.tgz; do echo "Genesis ledger fetch failed" sleep 5 done echo "Fetched genesis ledger in $SECONDS seconds" ( set -x cd "$ledger_dir" tar -zxf genesis.tgz touch .genesis ) ( if ((boot_from_snapshot)); then SECONDS= echo "Fetching state snapshot $rpc_url/snapshot.tgz..." mkdir -p "$snapshot_dir" if ! curl -f "$rpc_url"/snapshot.tgz -o "$snapshot_dir"/snapshot.tgz; then echo "State snapshot fetch failed" rm -f "$snapshot_dir"/snapshot.tgz exit 0 # None fatal fi echo "Fetched snapshot in $SECONDS seconds" SECONDS= ( set -x cd "$snapshot_dir" tar -zxf snapshot.tgz rm snapshot.tgz ) echo "Extracted snapshot in $SECONDS seconds" fi ) fi [[ -r "$identity_keypair_path" ]] || $solana_keygen new -o "$identity_keypair_path" [[ -r "$voting_keypair_path" ]] || $solana_keygen new -o "$voting_keypair_path" [[ -r "$storage_keypair_path" ]] || $solana_keygen new -o "$storage_keypair_path" vote_pubkey=$($solana_keygen pubkey "$voting_keypair_path") storage_pubkey=$($solana_keygen pubkey "$storage_keypair_path") identity_pubkey=$($solana_keygen pubkey "$identity_keypair_path") export SOLANA_METRICS_HOST_ID="$identity_pubkey" setup_validator_accounts "$node_lamports" cat <