#!/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 "$state_dir" rm -rf "$ledger_config_dir" ) fi 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_config_dir" "$state_dir" "$configured_flag" ) fi if [[ ! -f "$ledger_config_dir"/.ok ]]; then echo "Fetching ledger from $rpc_url/genesis.tgz..." SECONDS= mkdir -p "$ledger_config_dir" while ! curl -f "$rpc_url"/genesis.tgz -o "$ledger_config_dir"/genesis.tgz; do echo "Genesis ledger fetch failed" sleep 5 done echo "Fetched genesis ledger in $SECONDS seconds" ( set -x cd "$ledger_config_dir" tar -zxf genesis.tgz touch .ok ) ( if ((boot_from_snapshot)); then SECONDS= echo "Fetching state snapshot $rpc_url/snapshot.tgz..." mkdir -p "$state_dir" if ! curl -f "$rpc_url"/snapshot.tgz -o "$state_dir"/snapshot.tgz; then echo "State snapshot fetch failed" rm -f "$state_dir"/snapshot.tgz exit 0 # None fatal fi echo "Fetched snapshot in $SECONDS seconds" SECONDS= ( set -x cd "$state_dir" tar -zxf snapshot.tgz rm snapshot.tgz ) echo "Extracted snapshot in $SECONDS seconds" fi ) fi vote_pubkey=$($solana_keygen pubkey "$voting_keypair_path") storage_pubkey=$($solana_keygen pubkey "$storage_keypair_path") setup_validator_accounts "$node_lamports" cat <