Skip to content

Instantly share code, notes, and snippets.

@ripatel-fd
Last active January 19, 2024 13:42
Show Gist options
  • Save ripatel-fd/894c33a0a1aba3352bf3799a746fac75 to your computer and use it in GitHub Desktop.
Save ripatel-fd/894c33a0a1aba3352bf3799a746fac75 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
BINDIR=./target/debug
TESTDIR=./gen-ledger
FAUCET_KEYPAIR="$TESTDIR"/bootstrap/faucet-keypair.json
CONFIG="$TESTDIR"/config.yml
VALIDATOR_CNT=4
BOOTSTRAP_RPC="http://127.0.0.1:8899"
BOOTSTRAP_GOSSIP="127.0.0.1:8000"
WARMUP_SLOT=20
clean () {
rm -rf "$TESTDIR"
}
launch_validator () {
VALIDATOR_DIR="$TESTDIR"/validator-"$1"
mkdir -p "$VALIDATOR_DIR"
#cp "$TESTDIR"/bootstrap/snapshot-* "$VALIDATOR_DIR"/
cp "$TESTDIR"/bootstrap/genesis* "$VALIDATOR_DIR"/
# Create keys
IDENTITY="$VALIDATOR_DIR"/identity.json
VOTE_ACCOUNT="$VALIDATOR_DIR"/vote-account.json
STAKE_ACCOUNT="$VALIDATOR_DIR"/stake-account.json
"$BINDIR"/solana-keygen new --no-passphrase -so "$IDENTITY"
"$BINDIR"/solana-keygen new --no-passphrase -so "$VOTE_ACCOUNT"
"$BINDIR"/solana-keygen new --no-passphrase -so "$STAKE_ACCOUNT"
IDENTITY_ADDR="$("$BINDIR"/solana-keygen pubkey "$IDENTITY")"
VOTE_ACCOUNT_ADDR="$("$BINDIR"/solana-keygen pubkey "$VOTE_ACCOUNT")"
# Fund identity key
"$BINDIR"/solana \
--keypair "$FAUCET_KEYPAIR" \
--url "$BOOTSTRAP_RPC" \
transfer \
--allow-unfunded-recipient \
"$IDENTITY_ADDR" \
1000
# Create vote account
"$BINDIR"/solana \
--keypair "$IDENTITY" \
--url "$BOOTSTRAP_RPC" \
create-vote-account \
--allow-unsafe-authorized-withdrawer \
"$VOTE_ACCOUNT" \
"$IDENTITY" \
"$IDENTITY"
# Create stake account
"$BINDIR"/solana \
--keypair "$FAUCET_KEYPAIR" \
--url "$BOOTSTRAP_RPC" \
create-stake-account \
"$STAKE_ACCOUNT" \
5000000
# Delegate stake
"$BINDIR"/solana \
--keypair "$FAUCET_KEYPAIR" \
--url "$BOOTSTRAP_RPC" \
delegate-stake \
"$STAKE_ACCOUNT" \
"$VOTE_ACCOUNT_ADDR" \
--force
# Launch new validator
"$BINDIR"/solana-validator \
--identity "$IDENTITY" \
--vote-account "$VOTE_ACCOUNT" \
--ledger "$VALIDATOR_DIR" \
--dynamic-port-range $((8020 + $i * 40))-$((8040 + $i * 40)) \
--entrypoint "$BOOTSTRAP_GOSSIP" \
--log "$VALIDATOR_DIR"/validator.log \
&
}
run () {
clean
# Kill child processes on exit
trap 'trap - SIGTERM && kill -- -$$' SIGINT SIGTERM EXIT
# Create bootstrap validator
BOOTSTRAP_DIR="$TESTDIR"/bootstrap
mkdir -p "$BOOTSTRAP_DIR"
"$BINDIR"/solana-test-validator \
--ledger "$BOOTSTRAP_DIR" \
--bind-address 127.0.0.1 \
--dynamic-port-range 8000-8200 \
--rpc-port 8899 \
--faucet-port 9900 \
--faucet-sol 1000000000 \
--reset \
--quiet \
--slots-per-epoch 120 \
&
# Create Solana CLI config
cat <<EOF > "$CONFIG"
json_rpc_url: http://127.0.0.1:8899
websocket_url: ws://127.0.0.1:8900
keypair_path: "$(pwd)/$LEDGER_DIR/faucet-keypair.json"
EOF
# Wait until bootstrap validator responds to requests
echo "Waiting for bootstrap to come online"
until
"$BINDIR"/solana -C "$CONFIG" slot 2>/dev/null
do sleep 0.1
done
echo "Connected to bootstrap"
# Wait until bootstrap validator root warmup slot
echo "Waiting for validator to root slot $WARMUP_SLOT"
until
[[ $("$BINDIR"/solana -C "$CONFIG" slot --commitment finalized 2>/dev/null) -gt "$WARMUP_SLOT" ]]
do sleep 0.1
done
# Create snapshot at slot 1
"$BINDIR"/solana-ledger-tool \
--ledger "$BOOTSTRAP_DIR" \
create-snapshot "$WARMUP_SLOT"
echo "Created snapshot"
# Join validators
for i in $(seq 1 "$VALIDATOR_CNT"); do
echo "Launching validator $i"
launch_validator $i
done
echo "Waiting for user input ..."
sleep infinity
}
case "$1" in
run)
run
;;
clean)
clean
;;
*)
echo "Usage: $0 <run|clean>"
exit 1
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment