Last active
January 19, 2024 13:42
-
-
Save ripatel-fd/894c33a0a1aba3352bf3799a746fac75 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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