Calculate bench client lamports based on signature fee (#4713)
* use fee calculator to compute max fee * review comments * shellcheck
This commit is contained in:
		@@ -4,6 +4,7 @@ use std::time::Duration;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use clap::{crate_description, crate_name, crate_version, App, Arg, ArgMatches};
 | 
					use clap::{crate_description, crate_name, crate_version, App, Arg, ArgMatches};
 | 
				
			||||||
use solana_drone::drone::DRONE_PORT;
 | 
					use solana_drone::drone::DRONE_PORT;
 | 
				
			||||||
 | 
					use solana_sdk::fee_calculator::FeeCalculator;
 | 
				
			||||||
use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil};
 | 
					use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Holds the configuration for a single run of the benchmark
 | 
					/// Holds the configuration for a single run of the benchmark
 | 
				
			||||||
@@ -20,6 +21,7 @@ pub struct Config {
 | 
				
			|||||||
    pub client_ids_and_stake_file: String,
 | 
					    pub client_ids_and_stake_file: String,
 | 
				
			||||||
    pub write_to_client_file: bool,
 | 
					    pub write_to_client_file: bool,
 | 
				
			||||||
    pub read_from_client_file: bool,
 | 
					    pub read_from_client_file: bool,
 | 
				
			||||||
 | 
					    pub target_lamports_per_signature: u64,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Default for Config {
 | 
					impl Default for Config {
 | 
				
			||||||
@@ -37,6 +39,7 @@ impl Default for Config {
 | 
				
			|||||||
            client_ids_and_stake_file: String::new(),
 | 
					            client_ids_and_stake_file: String::new(),
 | 
				
			||||||
            write_to_client_file: false,
 | 
					            write_to_client_file: false,
 | 
				
			||||||
            read_from_client_file: false,
 | 
					            read_from_client_file: false,
 | 
				
			||||||
 | 
					            target_lamports_per_signature: FeeCalculator::default().target_lamports_per_signature,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -126,6 +129,16 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
 | 
				
			|||||||
                .takes_value(true)
 | 
					                .takes_value(true)
 | 
				
			||||||
                .help("Read client keys and stakes from the YAML file"),
 | 
					                .help("Read client keys and stakes from the YAML file"),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					        .arg(
 | 
				
			||||||
 | 
					            Arg::with_name("target_lamports_per_signature")
 | 
				
			||||||
 | 
					                .long("target-lamports-per-signature")
 | 
				
			||||||
 | 
					                .value_name("LAMPORTS")
 | 
				
			||||||
 | 
					                .takes_value(true)
 | 
				
			||||||
 | 
					                .help(
 | 
				
			||||||
 | 
					                    "The cost in lamports that the cluster will charge for signature \
 | 
				
			||||||
 | 
					                     verification when the cluster is operating at target-signatures-per-slot",
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Parses a clap `ArgMatches` structure into a `Config`
 | 
					/// Parses a clap `ArgMatches` structure into a `Config`
 | 
				
			||||||
@@ -194,5 +207,9 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
 | 
				
			|||||||
        args.client_ids_and_stake_file = s.to_string();
 | 
					        args.client_ids_and_stake_file = s.to_string();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if let Some(v) = matches.value_of("target_lamports_per_signature") {
 | 
				
			||||||
 | 
					        args.target_lamports_per_signature = v.to_string().parse().expect("can't parse lamports");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    args
 | 
					    args
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ use crate::bench::{
 | 
				
			|||||||
    do_bench_tps, generate_and_fund_keypairs, generate_keypairs, Config, NUM_LAMPORTS_PER_ACCOUNT,
 | 
					    do_bench_tps, generate_and_fund_keypairs, generate_keypairs, Config, NUM_LAMPORTS_PER_ACCOUNT,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use solana::gossip_service::{discover_cluster, get_multi_client};
 | 
					use solana::gossip_service::{discover_cluster, get_multi_client};
 | 
				
			||||||
 | 
					use solana_sdk::fee_calculator::FeeCalculator;
 | 
				
			||||||
use solana_sdk::signature::Keypair;
 | 
					use solana_sdk::signature::Keypair;
 | 
				
			||||||
use std::collections::HashMap;
 | 
					use std::collections::HashMap;
 | 
				
			||||||
use std::fs::File;
 | 
					use std::fs::File;
 | 
				
			||||||
@@ -12,6 +13,9 @@ use std::io::prelude::*;
 | 
				
			|||||||
use std::path::Path;
 | 
					use std::path::Path;
 | 
				
			||||||
use std::process::exit;
 | 
					use std::process::exit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Number of signatures for all transactions in ~1 week at ~100K TPS
 | 
				
			||||||
 | 
					pub const NUM_SIGNATURES_FOR_TXS: u64 = 100_000 * 60 * 60 * 24 * 7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn main() {
 | 
					fn main() {
 | 
				
			||||||
    solana_logger::setup();
 | 
					    solana_logger::setup();
 | 
				
			||||||
    solana_metrics::set_panic_hook("bench-tps");
 | 
					    solana_metrics::set_panic_hook("bench-tps");
 | 
				
			||||||
@@ -32,15 +36,21 @@ fn main() {
 | 
				
			|||||||
        client_ids_and_stake_file,
 | 
					        client_ids_and_stake_file,
 | 
				
			||||||
        write_to_client_file,
 | 
					        write_to_client_file,
 | 
				
			||||||
        read_from_client_file,
 | 
					        read_from_client_file,
 | 
				
			||||||
 | 
					        target_lamports_per_signature,
 | 
				
			||||||
    } = cli_config;
 | 
					    } = cli_config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if write_to_client_file {
 | 
					    if write_to_client_file {
 | 
				
			||||||
        let keypairs = generate_keypairs(&id, tx_count as u64 * 2);
 | 
					        let keypairs = generate_keypairs(&id, tx_count as u64 * 2);
 | 
				
			||||||
 | 
					        let num_accounts = keypairs.len() as u64;
 | 
				
			||||||
 | 
					        let max_fee = FeeCalculator::new(target_lamports_per_signature).max_lamports_per_signature;
 | 
				
			||||||
 | 
					        let num_lamports_per_account = (num_accounts - 1 + NUM_SIGNATURES_FOR_TXS * max_fee)
 | 
				
			||||||
 | 
					            / num_accounts
 | 
				
			||||||
 | 
					            + NUM_LAMPORTS_PER_ACCOUNT;
 | 
				
			||||||
        let mut accounts = HashMap::new();
 | 
					        let mut accounts = HashMap::new();
 | 
				
			||||||
        keypairs.iter().for_each(|keypair| {
 | 
					        keypairs.iter().for_each(|keypair| {
 | 
				
			||||||
            accounts.insert(
 | 
					            accounts.insert(
 | 
				
			||||||
                serde_json::to_string(&keypair.to_bytes().to_vec()).unwrap(),
 | 
					                serde_json::to_string(&keypair.to_bytes().to_vec()).unwrap(),
 | 
				
			||||||
                NUM_LAMPORTS_PER_ACCOUNT as u64,
 | 
					                num_lamports_per_account,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -108,6 +108,9 @@ while [[ -n $1 ]]; do
 | 
				
			|||||||
    if [[ $1 = --hashes-per-tick ]]; then
 | 
					    if [[ $1 = --hashes-per-tick ]]; then
 | 
				
			||||||
      genesisOptions="$genesisOptions $1 $2"
 | 
					      genesisOptions="$genesisOptions $1 $2"
 | 
				
			||||||
      shift 2
 | 
					      shift 2
 | 
				
			||||||
 | 
					    elif [[ $1 = --target-lamports-per-signature ]]; then
 | 
				
			||||||
 | 
					      genesisOptions="$genesisOptions $1 $2"
 | 
				
			||||||
 | 
					      shift 2
 | 
				
			||||||
    elif [[ $1 = --deploy-update ]]; then
 | 
					    elif [[ $1 = --deploy-update ]]; then
 | 
				
			||||||
      updatePlatforms="$updatePlatforms $2"
 | 
					      updatePlatforms="$updatePlatforms $2"
 | 
				
			||||||
      shift 2
 | 
					      shift 2
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -115,11 +115,23 @@ local|tar)
 | 
				
			|||||||
        echo "${pubkey}: $stakeNodesInGenesisBlock" >> ./solana-node-stakes/fullnode-stakes.yml
 | 
					        echo "${pubkey}: $stakeNodesInGenesisBlock" >> ./solana-node-stakes/fullnode-stakes.yml
 | 
				
			||||||
      done
 | 
					      done
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lamports_per_signature="42"
 | 
				
			||||||
 | 
					    # shellcheck disable=SC2206 # Do not want to quote $genesisOptions
 | 
				
			||||||
 | 
					    genesis_args=($genesisOptions)
 | 
				
			||||||
 | 
					    for i in "${!genesis_args[@]}"; do
 | 
				
			||||||
 | 
					      if [[ "${genesis_args[$i]}" = --target-lamports-per-signature ]]; then
 | 
				
			||||||
 | 
					        lamports_per_signature="${genesis_args[$((i+1))]}"
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
 | 
					      fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rm -rf ./solana-client-accounts
 | 
					    rm -rf ./solana-client-accounts
 | 
				
			||||||
    mkdir ./solana-client-accounts
 | 
					    mkdir ./solana-client-accounts
 | 
				
			||||||
    for i in $(seq 0 $((numBenchTpsClients-1))); do
 | 
					    for i in $(seq 0 $((numBenchTpsClients-1))); do
 | 
				
			||||||
      # shellcheck disable=SC2086 # Do not want to quote $benchTpsExtraArgs
 | 
					      # shellcheck disable=SC2086 # Do not want to quote $benchTpsExtraArgs
 | 
				
			||||||
      solana-bench-tps --write-client-keys ./solana-client-accounts/bench-tps"$i".yml $benchTpsExtraArgs
 | 
					      solana-bench-tps --write-client-keys ./solana-client-accounts/bench-tps"$i".yml \
 | 
				
			||||||
 | 
					        --target-lamports-per-signature "$lamports_per_signature" $benchTpsExtraArgs
 | 
				
			||||||
      # Skip first line, as it contains header
 | 
					      # Skip first line, as it contains header
 | 
				
			||||||
      tail -n +2 -q ./solana-client-accounts/bench-tps"$i".yml >> ./solana-client-accounts/client-accounts.yml
 | 
					      tail -n +2 -q ./solana-client-accounts/bench-tps"$i".yml >> ./solana-client-accounts/client-accounts.yml
 | 
				
			||||||
      echo "" >> ./solana-client-accounts/client-accounts.yml
 | 
					      echo "" >> ./solana-client-accounts/client-accounts.yml
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user