#!/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 && false else false fi } 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 } kill_node_and_exit() { kill_node exit } trap 'kill_node_and_exit' INT TERM ERR wallet() { ( set -x $solana_cli --keypair "$identity_keypair_path" --url "$rpc_url" "$@" ) } setup_validator_accounts() { declare node_lamports=$1 if ! wallet show-vote-account "$voting_keypair_path"; then if ((airdrops_enabled)); then echo "Adding $node_lamports to validator identity account:" wallet airdrop "$node_lamports" lamports || return $? fi echo "Creating validator vote account" wallet create-vote-account "$voting_keypair_path" "$identity_keypair_path" 1 --commission 127 || return $? fi echo "Validator vote account configured" if ! wallet show-storage-account "$storage_keypair_path"; then echo "Creating validator storage account" wallet create-validator-storage-account "$identity_keypair_path" "$storage_keypair_path" || return $? fi echo "Validator storage account configured" echo "Validator identity account balance:" wallet balance --lamports || return $? return 0 } while true; do rpc_url=$($solana_gossip get-rpc-url --entrypoint "$gossip_entrypoint") [[ -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" setup_validator_accounts "$node_lamports" echo "$PS4$program ${args[*]}" $program "${args[@]}" & pid=$! echo "pid: $pid" if ((no_restart)); then wait "$pid" exit $? fi secs_to_next_genesis_poll=60 while true; do if [[ -z $pid ]] || ! kill -0 "$pid"; then [[ -z $pid ]] || wait "$pid" echo "############## validator exited, restarting ##############" break fi sleep 1 if ((poll_for_new_genesis_block && --secs_to_next_genesis_poll == 0)); then echo "Polling for new genesis block..." if new_genesis_block; then echo "############## New genesis detected, restarting ##############" ( set -x rm -rf "$ledger_dir" ) break fi secs_to_next_genesis_poll=60 fi done kill_node # give the cluster time to come back up ( set -x sleep 60 ) done