Step 1 - Create the required keypairs

mkdir solana-private-chain && cd solana-private-chain

# Bootstrap validator keypairs
solana-keygen new --outfile bootstrap-validator-keypair.json --no-bip39-passphrase
solana-keygen new --outfile bootstrap-vote-keypair.json --no-bip39-passphrase
solana-keygen new --outfile bootstrap-stake-keypair.json --no-bip39-passphrase

# Second validator keypairs
solana-keygen new --outfile validator2-keypair.json --no-bip39-passphrase
solana-keygen new --outfile vote2-keypair.json --no-bip39-passphrase
solana-keygen new --outfile stake2-keypair.json --no-bip39-passphrase

# Third validator keypairs
solana-keygen new --outfile validator3-keypair.json --no-bip39-passphrase
solana-keygen new --outfile vote3-keypair.json --no-bip39-passphrase
solana-keygen new --outfile stake3-keypair.json --no-bip39-passphrase

# Treasury keypair (for initial funds)
solana-keygen new --outfile treasury-keypair.json --no-bip39-passphrase

Step 2 - Create the Primordial Accounts File

cat > primordial-accounts.yaml << EOF
$(solana-keygen pubkey treasury-keypair.json):
  balance: 10000000000000000
  owner: 11111111111111111111111111111111
  executable: false
  data: ""
EOF

Step 3 - Create the genesis block

solana-genesis \
  --cluster-type mainnet-beta \
  --ledger genesis-ledger \
  --bootstrap-validator \
    bootstrap-validator-keypair.json \
    bootstrap-vote-keypair.json \
    bootstrap-stake-keypair.json \
  --bootstrap-validator \
    validator2-keypair.json \
    vote2-keypair.json \
    stake2-keypair.json \
  --bootstrap-validator \
    validator3-keypair.json \
    vote3-keypair.json \
    stake3-keypair.json \
  --bootstrap-stake-authorized-pubkey $(solana-keygen pubkey bootstrap-stake-keypair.json) \
  --bootstrap-validator-lamports 1000000000000000 \
  --bootstrap-validator-stake-lamports 100000000000000 \
  --primordial-accounts-file primordial-accounts.yaml \
  --hashes-per-tick auto \
  --slots-per-epoch 432000 \
  --target-lamports-per-signature 5000 \
  --inflation full \
  --rent-burn-percentage 100 \
  --faucet-lamports 100

Step 4 - start the bootstrap validator

agave-validator  \
  --identity bootstrap-validator-keypair.json \
  --vote-account bootstrap-vote-keypair.json \
  --authorized-voter bootstrap-stake-keypair.json \
  --ledger genesis-ledger \
  --rpc-port 8899 \
  --rpc-bind-address 0.0.0.0 \
  --dynamic-port-range 8000-8020 \
  --gossip-port 8001 \
  --enable-rpc-transaction-history \
  --enable-extended-tx-metadata-storage \
  --limit-ledger-size 200000000 \
  --log bootstrap-validator.log

Step 5 - start validator #2

agave-validator \
	--identity validator2-keypair.json \
  --vote-account vote2-keypair.json \
  --authorized-voter stake2-keypair.json \
  --ledger validator2-ledger \
  --entrypoint 127.0.0.1:8001 \
  --rpc-port 8900 \
  --dynamic-port-range 8021-8040 \
  --gossip-port 8022 \
  --enable-rpc-transaction-history \
  --limit-ledger-size 200000000 \
  --log validator-2.log

Step 6 - start validator #3

agave-validator \
  --identity validator3-keypair.json \
  --vote-account vote3-keypair.json \
  --authorized-voter stake3-keypair.json \
  --ledger validator3-ledger \
  --entrypoint 127.0.0.1:8001 \
  --rpc-port 8901 \
  --dynamic-port-range 8041-8060 \
  --gossip-port 8043 \
  --enable-rpc-transaction-history \
  --limit-ledger-size 200000000 \
  --log validator-3.log