From e43a63494413dbd1823e116c9f31cefc985d5d78 Mon Sep 17 00:00:00 2001 From: Pankaj Garg Date: Tue, 18 Jun 2019 14:44:53 -0700 Subject: [PATCH] Calculate bench client lamports based on signature fee (#4713) * use fee calculator to compute max fee * review comments * shellcheck --- bench-tps/src/cli.rs | 17 +++++++++++++++++ bench-tps/src/main.rs | 12 +++++++++++- net/net.sh | 3 +++ net/remote/remote-node.sh | 14 +++++++++++++- 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/bench-tps/src/cli.rs b/bench-tps/src/cli.rs index ab12c171b..085f7f5a1 100644 --- a/bench-tps/src/cli.rs +++ b/bench-tps/src/cli.rs @@ -4,6 +4,7 @@ use std::time::Duration; use clap::{crate_description, crate_name, crate_version, App, Arg, ArgMatches}; use solana_drone::drone::DRONE_PORT; +use solana_sdk::fee_calculator::FeeCalculator; use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil}; /// 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 write_to_client_file: bool, pub read_from_client_file: bool, + pub target_lamports_per_signature: u64, } impl Default for Config { @@ -37,6 +39,7 @@ impl Default for Config { client_ids_and_stake_file: String::new(), write_to_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) .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` @@ -194,5 +207,9 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config { 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 } diff --git a/bench-tps/src/main.rs b/bench-tps/src/main.rs index a804db4c0..ae6f5e782 100644 --- a/bench-tps/src/main.rs +++ b/bench-tps/src/main.rs @@ -5,6 +5,7 @@ use crate::bench::{ 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_sdk::fee_calculator::FeeCalculator; use solana_sdk::signature::Keypair; use std::collections::HashMap; use std::fs::File; @@ -12,6 +13,9 @@ use std::io::prelude::*; use std::path::Path; 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() { solana_logger::setup(); solana_metrics::set_panic_hook("bench-tps"); @@ -32,15 +36,21 @@ fn main() { client_ids_and_stake_file, write_to_client_file, read_from_client_file, + target_lamports_per_signature, } = cli_config; if write_to_client_file { 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(); keypairs.iter().for_each(|keypair| { accounts.insert( serde_json::to_string(&keypair.to_bytes().to_vec()).unwrap(), - NUM_LAMPORTS_PER_ACCOUNT as u64, + num_lamports_per_account, ); }); diff --git a/net/net.sh b/net/net.sh index 413953399..5a6fc8bc7 100755 --- a/net/net.sh +++ b/net/net.sh @@ -108,6 +108,9 @@ while [[ -n $1 ]]; do if [[ $1 = --hashes-per-tick ]]; then genesisOptions="$genesisOptions $1 $2" shift 2 + elif [[ $1 = --target-lamports-per-signature ]]; then + genesisOptions="$genesisOptions $1 $2" + shift 2 elif [[ $1 = --deploy-update ]]; then updatePlatforms="$updatePlatforms $2" shift 2 diff --git a/net/remote/remote-node.sh b/net/remote/remote-node.sh index c5f017ed0..aeb885c31 100755 --- a/net/remote/remote-node.sh +++ b/net/remote/remote-node.sh @@ -115,11 +115,23 @@ local|tar) echo "${pubkey}: $stakeNodesInGenesisBlock" >> ./solana-node-stakes/fullnode-stakes.yml done 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 mkdir ./solana-client-accounts for i in $(seq 0 $((numBenchTpsClients-1))); do # 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 tail -n +2 -q ./solana-client-accounts/bench-tps"$i".yml >> ./solana-client-accounts/client-accounts.yml echo "" >> ./solana-client-accounts/client-accounts.yml