From c2fc0f2418382cd04d9fc4dbeb499734aa5a09ba Mon Sep 17 00:00:00 2001 From: sakridge Date: Wed, 31 Jul 2019 16:10:55 -0700 Subject: [PATCH] Plumb libra accounts to genesis (#5333) * Plumb move_loader to genesis * Remove core dependency on genesis-programs --- Cargo.lock | 4 +- bench-tps/Cargo.toml | 2 + bench-tps/src/bench.rs | 116 +++++++++++++++++++---------------- bench-tps/src/main.rs | 16 ++++- core/Cargo.toml | 2 - core/src/lib.rs | 1 + core/src/local_cluster.rs | 3 +- runtime/src/genesis_utils.rs | 3 +- 8 files changed, 82 insertions(+), 65 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 00a0c178b..4c5a862c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3062,9 +3062,7 @@ dependencies = [ "solana-client 0.18.0-pre0", "solana-drone 0.18.0-pre0", "solana-ed25519-dalek 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-genesis-programs 0.18.0-pre0", "solana-kvstore 0.18.0-pre0", - "solana-librapay-api 0.18.0-pre0", "solana-logger 0.18.0-pre0", "solana-measure 0.18.0-pre0", "solana-merkle-tree 0.18.0-pre0", @@ -3146,6 +3144,8 @@ dependencies = [ "solana-logger 0.18.0-pre0", "solana-measure 0.18.0-pre0", "solana-metrics 0.18.0-pre0", + "solana-move-loader-api 0.18.0-pre0", + "solana-move-loader-program 0.18.0-pre0", "solana-netutil 0.18.0-pre0", "solana-runtime 0.18.0-pre0", "solana-sdk 0.18.0-pre0", diff --git a/bench-tps/Cargo.toml b/bench-tps/Cargo.toml index daf945211..17764e944 100644 --- a/bench-tps/Cargo.toml +++ b/bench-tps/Cargo.toml @@ -26,6 +26,8 @@ solana-measure = { path = "../measure", version = "0.18.0-pre0" } solana-netutil = { path = "../netutil", version = "0.18.0-pre0" } solana-runtime = { path = "../runtime", version = "0.18.0-pre0" } solana-sdk = { path = "../sdk", version = "0.18.0-pre0" } +solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.18.0-pre0" } +solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.18.0-pre0" } [features] cuda = ["solana/cuda"] diff --git a/bench-tps/src/bench.rs b/bench-tps/src/bench.rs index 976d91a7b..f7821ded5 100644 --- a/bench-tps/src/bench.rs +++ b/bench-tps/src/bench.rs @@ -6,6 +6,7 @@ use rayon::prelude::*; use solana::gen_keys::GenKeys; use solana_client::perf_utils::{sample_txs, SampleStats}; use solana_drone::drone::request_airdrop_transaction; +use solana_librapay_api::{create_genesis, upload_mint_program, upload_payment_program}; use solana_measure::measure::Measure; use solana_metrics::datapoint_info; use solana_sdk::client::Client; @@ -65,12 +66,14 @@ impl Default for Config { } } +type LibraKeys = (Keypair, Pubkey, Pubkey, Vec); + pub fn do_bench_tps( clients: Vec, config: Config, gen_keypairs: Vec, keypair0_balance: u64, - libra_args: Option<(&Pubkey, &Pubkey, Vec)>, + libra_args: Option, ) -> u64 where T: 'static + Client + Send + Sync, @@ -276,7 +279,7 @@ fn generate_move_txs( .collect() } -fn generate_solana_txs( +fn generate_system_txs( source: &[Keypair], dest: &[Keypair], reclaim: bool, @@ -306,24 +309,30 @@ fn generate_txs( dest: &[Keypair], threads: usize, reclaim: bool, - libra_args: &Option<(&Pubkey, &Pubkey, Vec)>, + libra_args: &Option, ) { let tx_count = source.len(); println!("Signing transactions... {} (reclaim={})", tx_count, reclaim); let signing_start = Instant::now(); - let transactions = if let Some((libra_pay_program_id, libra_mint_id, libra_keys)) = libra_args { + let transactions = if let Some(( + libra_genesis_keypair, + libra_pay_program_id, + _libra_mint_program_id, + libra_keys, + )) = libra_args + { generate_move_txs( source, dest, reclaim, &libra_keys, libra_pay_program_id, - libra_mint_id, + &libra_genesis_keypair.pubkey(), blockhash, ) } else { - generate_solana_txs(source, dest, reclaim, blockhash) + generate_system_txs(source, dest, reclaim, blockhash) }; let duration = signing_start.elapsed(); @@ -719,7 +728,13 @@ fn fund_move_keys( let create_len = 8; let mut funding_time = Measure::start("funding_time"); for (i, keys) in keypairs.chunks(create_len).enumerate() { + if client.get_balance(&keys[0].pubkey()).unwrap_or(0) > 0 { + // already created these accounts. + break; + } + let mut tx_send = Measure::start("poll"); + let pubkeys: Vec<_> = keys.iter().map(|k| k.pubkey()).collect(); let tx = librapay_transaction::create_accounts(funding_key, &pubkeys, 1, blockhash); let ser_size = bincode::serialized_size(&tx).unwrap(); @@ -761,6 +776,17 @@ fn fund_move_keys( let sig = client .async_send_transaction(tx.clone()) .expect("create_account in generate_and_fund_keypairs"); + + let mut poll_time = Measure::start("poll_start"); + let poll_status = client.poll_for_signature(&sig); + poll_time.stop(); + info!( + "i: {} poll: {:?} time: {}ms", + i, + poll_status, + poll_time.as_ms() + ); + sigs.push((sig, key)); if i % 50 == 0 { @@ -785,7 +811,7 @@ fn fund_move_keys( times = 0; loop { let balance = librapay_transaction::get_libra_balance(client, &key.pubkey()).unwrap(); - if amount != balance { + if balance < amount { info!("i: {} balance: {} times: {}", i, balance, times); times += 1; sleep(Duration::from_secs(1)); @@ -806,8 +832,8 @@ pub fn generate_and_fund_keypairs( funding_key: &Keypair, tx_count: usize, lamports_per_account: u64, - libra_keys: Option<(&Pubkey, &Pubkey, &Arc)>, -) -> Result<(Vec, Option>, u64)> { + use_move: bool, +) -> Result<(Vec, Option, u64)> { info!("Creating {} keypairs...", tx_count * 2); let (mut keypairs, extra) = generate_keypairs(funding_key, tx_count as u64 * 2); info!("Get lamports..."); @@ -826,14 +852,24 @@ pub fn generate_and_fund_keypairs( lamports_per_account - last_keypair_balance + fee_calculator.max_lamports_per_signature; let extra_fees = extra * fee_calculator.max_lamports_per_signature; let mut total = account_desired_balance * (1 + keypairs.len() as u64) + extra_fees; - if libra_keys.is_some() { + if use_move { total *= 2; } + + println!("Previous key balance: {} max_fee: {} lamports_per_account: {} extra: {} desired_balance: {} total: {}", + last_keypair_balance, fee_calculator.max_lamports_per_signature, lamports_per_account, extra, + account_desired_balance, total + ); + if client.get_balance(&funding_key.pubkey()).unwrap_or(0) < total { airdrop_lamports(client, &drone_addr.unwrap(), funding_key, total)?; } - if let Some((libra_pay_program_id, libra_mint_program_id, libra_mint_key)) = libra_keys { + if use_move { + let libra_genesis_keypair = create_genesis(&funding_key, client, 1_000_000); + let libra_mint_program_id = upload_mint_program(&funding_key, client); + let libra_pay_program_id = upload_payment_program(&funding_key, client); + // Generate another set of keypairs for move accounts. // Still fund the solana ones which will be used for fees. let seed = [0u8; 32]; @@ -844,11 +880,16 @@ pub fn generate_and_fund_keypairs( funding_key, &move_keypairs, total / 2, + &libra_pay_program_id, + &libra_mint_program_id, + &libra_genesis_keypair, + ); + move_keypairs_ret = Some(( + libra_genesis_keypair, libra_pay_program_id, libra_mint_program_id, - libra_mint_key, - ); - move_keypairs_ret = Some(move_keypairs); + move_keypairs, + )); // Give solana keys half and move keys half the lamports. total /= 2; @@ -872,13 +913,13 @@ pub fn generate_and_fund_keypairs( #[cfg(test)] mod tests { + use super::*; use solana::cluster_info::FULLNODE_PORT_RANGE; use solana::local_cluster::{ClusterConfig, LocalCluster}; use solana::validator::ValidatorConfig; use solana_client::thin_client::create_client; use solana_drone::drone::run_local_drone; - use solana_librapay_api::{create_genesis, upload_mint_program, upload_payment_program}; use solana_runtime::bank::Bank; use solana_runtime::bank_client::BankClient; use solana_sdk::client::SyncClient; @@ -908,6 +949,7 @@ mod tests { node_stakes: vec![999_990; NUM_NODES], cluster_lamports: 200_000_000, validator_configs: vec![ValidatorConfig::default(); NUM_NODES], + native_instruction_processors: vec![solana_move_loader_program!()], ..ClusterConfig::default() }); @@ -923,57 +965,23 @@ mod tests { FULLNODE_PORT_RANGE, ); - let (libra_genesis_keypair, libra_mint_id, libra_pay_program_id) = if config.use_move { - let libra_genesis_keypair = create_genesis(&drone_keypair, &client, 1_000_000); - let libra_mint_id = upload_mint_program(&drone_keypair, &client); - let libra_pay_program_id = upload_payment_program(&drone_keypair, &client); - ( - Arc::new(libra_genesis_keypair), - libra_mint_id, - libra_pay_program_id, - ) - } else { - ( - Arc::new(Keypair::new()), - Pubkey::default(), - Pubkey::default(), - ) - }; - let (addr_sender, addr_receiver) = channel(); run_local_drone(drone_keypair, addr_sender, None); let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap(); let lamports_per_account = 100; - let libra_keys = if config.use_move { - Some(( - &libra_pay_program_id, - &libra_mint_id, - &libra_genesis_keypair, - )) - } else { - None - }; - let (keypairs, move_keypairs, _keypair_balance) = generate_and_fund_keypairs( &client, Some(drone_addr), &config.id, config.tx_count, lamports_per_account, - libra_keys, + config.use_move, ) .unwrap(); - let libra_mint_pubkey = libra_genesis_keypair.pubkey(); - let move_args = if let Some(keypairs) = move_keypairs { - Some((&libra_pay_program_id, &libra_mint_pubkey, keypairs)) - } else { - None - }; - - let total = do_bench_tps(vec![client], config, keypairs, 0, move_args); + let total = do_bench_tps(vec![client], config, keypairs, 0, move_keypairs); assert!(total > 100); } @@ -1008,7 +1016,7 @@ mod tests { config.duration = Duration::from_secs(5); let (keypairs, _move_keypairs, _keypair_balance) = - generate_and_fund_keypairs(&clients[0], None, &config.id, config.tx_count, 20, None) + generate_and_fund_keypairs(&clients[0], None, &config.id, config.tx_count, 20, false) .unwrap(); do_bench_tps(clients, config, keypairs, 0, None); @@ -1023,7 +1031,7 @@ mod tests { let lamports = 20; let (keypairs, _move_keypairs, _keypair_balance) = - generate_and_fund_keypairs(&client, None, &id, tx_count, lamports, None).unwrap(); + generate_and_fund_keypairs(&client, None, &id, tx_count, lamports, false).unwrap(); for kp in &keypairs { assert_eq!(client.get_balance(&kp.pubkey()).unwrap(), lamports); @@ -1041,7 +1049,7 @@ mod tests { let lamports = 20; let (keypairs, _move_keypairs, _keypair_balance) = - generate_and_fund_keypairs(&client, None, &id, tx_count, lamports, None).unwrap(); + generate_and_fund_keypairs(&client, None, &id, tx_count, lamports, false).unwrap(); let max_fee = client .get_recent_blockhash() diff --git a/bench-tps/src/main.rs b/bench-tps/src/main.rs index 2fa1a8a53..c520239a1 100644 --- a/bench-tps/src/main.rs +++ b/bench-tps/src/main.rs @@ -1,3 +1,7 @@ +#[cfg(test)] +#[macro_use] +extern crate solana_move_loader_program; + mod bench; mod cli; @@ -79,7 +83,7 @@ fn main() { exit(1); } - let (keypairs, _move_keypairs, keypair_balance) = if read_from_client_file { + let (keypairs, move_keypairs, keypair_balance) = if read_from_client_file && !use_move { let path = Path::new(&client_ids_and_stake_file); let file = File::open(path).unwrap(); @@ -104,7 +108,7 @@ fn main() { &id, tx_count, NUM_LAMPORTS_PER_ACCOUNT, - None, + use_move, ) .unwrap_or_else(|e| { eprintln!("Error could not fund keys: {:?}", e); @@ -122,5 +126,11 @@ fn main() { use_move, }; - do_bench_tps(vec![client], config, keypairs, keypair_balance, None); + do_bench_tps( + vec![client], + config, + keypairs, + keypair_balance, + move_keypairs, + ); } diff --git a/core/Cargo.toml b/core/Cargo.toml index 70fc0a1e7..de693a7be 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -52,7 +52,6 @@ solana-chacha-sys = { path = "../chacha-sys", version = "0.18.0-pre0" } solana-client = { path = "../client", version = "0.18.0-pre0" } solana-drone = { path = "../drone", version = "0.18.0-pre0" } solana-ed25519-dalek = "0.2.0" -solana-genesis-programs = { path = "../genesis_programs", version = "0.18.0-pre0" } solana-kvstore = { path = "../kvstore", version = "0.18.0-pre0", optional = true } solana-logger = { path = "../logger", version = "0.18.0-pre0" } solana-merkle-tree = { path = "../merkle-tree", version = "0.18.0-pre0" } @@ -66,7 +65,6 @@ solana-storage-api = { path = "../programs/storage_api", version = "0.18.0-pre0" solana-storage-program = { path = "../programs/storage_program", version = "0.18.0-pre0" } solana-vote-api = { path = "../programs/vote_api", version = "0.18.0-pre0" } solana-vote-signer = { path = "../vote-signer", version = "0.18.0-pre0" } -solana-librapay-api = { path = "../programs/librapay_api", version = "0.18.0-pre0" } sys-info = "0.5.7" tokio = "0.1" tokio-codec = "0.1" diff --git a/core/src/lib.rs b/core/src/lib.rs index 063a65ff1..9b83c84d5 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -76,6 +76,7 @@ pub mod window_service; #[macro_use] extern crate solana_budget_program; +#[macro_use] extern crate solana_storage_program; #[cfg(test)] diff --git a/core/src/local_cluster.rs b/core/src/local_cluster.rs index f4e1733c5..0ffe31800 100644 --- a/core/src/local_cluster.rs +++ b/core/src/local_cluster.rs @@ -156,10 +156,9 @@ impl LocalCluster { genesis_block .native_instruction_processors .extend_from_slice(&config.native_instruction_processors); - genesis_block .native_instruction_processors - .extend_from_slice(&solana_genesis_programs::get()); + .push(solana_storage_program!()); let storage_keypair = Keypair::new(); genesis_block.accounts.push(( diff --git a/runtime/src/genesis_utils.rs b/runtime/src/genesis_utils.rs index 427f9caaa..9bbe1a07e 100644 --- a/runtime/src/genesis_utils.rs +++ b/runtime/src/genesis_utils.rs @@ -1,4 +1,3 @@ -//use solana_programs::get_default_native_instruction_processors; use solana_sdk::{ account::Account, fee_calculator::FeeCalculator, @@ -67,7 +66,7 @@ pub fn create_genesis_block_with_leader( ), ), ]) - // Bare minimum + // Bare minimum program set .native_instruction_processors(&[ solana_bpf_loader_program!(), solana_vote_program!(),