diff --git a/bench-exchange/src/bench.rs b/bench-exchange/src/bench.rs index f146b0953f..8a0438b560 100644 --- a/bench-exchange/src/bench.rs +++ b/bench-exchange/src/bench.rs @@ -449,7 +449,7 @@ fn swapper( } account_group = (account_group + 1) % account_groups as usize; - let (blockhash, _fee_calculator) = client + let (blockhash, _fee_calculator, _last_valid_slot) = client .get_recent_blockhash_with_commitment(CommitmentConfig::recent()) .expect("Failed to get blockhash"); let to_swap_txs: Vec<_> = to_swap @@ -577,7 +577,7 @@ fn trader( } account_group = (account_group + 1) % account_groups as usize; - let (blockhash, _fee_calculator) = client + let (blockhash, _fee_calculator, _last_valid_slot) = client .get_recent_blockhash_with_commitment(CommitmentConfig::recent()) .expect("Failed to get blockhash"); @@ -776,7 +776,7 @@ pub fn fund_keys(client: &T, source: &Keypair, dests: &[Arc] to_fund_txs.len(), ); - let (blockhash, _fee_calculator) = client + let (blockhash, _fee_calculator, _last_valid_slot) = client .get_recent_blockhash_with_commitment(CommitmentConfig::recent()) .expect("blockhash"); to_fund_txs.par_iter_mut().for_each(|(k, tx)| { @@ -868,7 +868,7 @@ pub fn create_token_accounts( let mut retries = 0; while !to_create_txs.is_empty() { - let (blockhash, _fee_calculator) = client + let (blockhash, _fee_calculator, _last_valid_slot) = client .get_recent_blockhash_with_commitment(CommitmentConfig::recent()) .expect("Failed to get blockhash"); to_create_txs @@ -997,7 +997,7 @@ pub fn airdrop_lamports( let mut tries = 0; loop { - let (blockhash, _fee_calculator) = client + let (blockhash, _fee_calculator, _last_valid_slot) = client .get_recent_blockhash_with_commitment(CommitmentConfig::recent()) .expect("Failed to get blockhash"); match request_airdrop_transaction(&faucet_addr, &id.pubkey(), amount_to_drop, blockhash) { diff --git a/bench-tps/src/bench.rs b/bench-tps/src/bench.rs index 9d033059a7..d60d7eea90 100644 --- a/bench-tps/src/bench.rs +++ b/bench-tps/src/bench.rs @@ -55,7 +55,9 @@ type LibraKeys = (Keypair, Pubkey, Pubkey, Vec); fn get_recent_blockhash(client: &T) -> (Hash, FeeCalculator) { loop { match client.get_recent_blockhash_with_commitment(CommitmentConfig::recent()) { - Ok((blockhash, fee_calculator)) => return (blockhash, fee_calculator), + Ok((blockhash, fee_calculator, _last_valid_slot)) => { + return (blockhash, fee_calculator) + } Err(err) => { info!("Couldn't get recent blockhash: {:?}", err); sleep(Duration::from_secs(1)); diff --git a/client/src/thin_client.rs b/client/src/thin_client.rs index 48d1db9708..d6ae8c4a95 100644 --- a/client/src/thin_client.rs +++ b/client/src/thin_client.rs @@ -9,7 +9,7 @@ use log::*; use solana_sdk::{ account::Account, client::{AsyncClient, Client, SyncClient}, - clock::MAX_PROCESSING_AGE, + clock::{Slot, MAX_PROCESSING_AGE}, commitment_config::CommitmentConfig, epoch_info::EpochInfo, fee_calculator::{FeeCalculator, FeeRateGovernor}, @@ -390,13 +390,15 @@ impl SyncClient for ThinClient { } fn get_recent_blockhash(&self) -> TransportResult<(Hash, FeeCalculator)> { - self.get_recent_blockhash_with_commitment(CommitmentConfig::default()) + let (blockhash, fee_calculator, _last_valid_slot) = + self.get_recent_blockhash_with_commitment(CommitmentConfig::default())?; + Ok((blockhash, fee_calculator)) } fn get_recent_blockhash_with_commitment( &self, commitment_config: CommitmentConfig, - ) -> TransportResult<(Hash, FeeCalculator)> { + ) -> TransportResult<(Hash, FeeCalculator, Slot)> { let index = self.optimizer.experiment(); let now = Instant::now(); let recent_blockhash = @@ -404,7 +406,7 @@ impl SyncClient for ThinClient { match recent_blockhash { Ok(Response { value, .. }) => { self.optimizer.report(index, duration_as_ms(&now.elapsed())); - Ok((value.0, value.1)) + Ok((value.0, value.1, value.2)) } Err(e) => { self.optimizer.report(index, std::u64::MAX); diff --git a/local-cluster/src/cluster_tests.rs b/local-cluster/src/cluster_tests.rs index f0d886dda0..b385c9b36e 100644 --- a/local-cluster/src/cluster_tests.rs +++ b/local-cluster/src/cluster_tests.rs @@ -57,7 +57,7 @@ pub fn spend_and_verify_all_nodes( .poll_get_balance_with_commitment(&funding_keypair.pubkey(), CommitmentConfig::recent()) .expect("balance in source"); assert!(bal > 0); - let (blockhash, _fee_calculator) = client + let (blockhash, _fee_calculator, _last_valid_slot) = client .get_recent_blockhash_with_commitment(CommitmentConfig::recent()) .unwrap(); let mut transaction = @@ -103,7 +103,7 @@ pub fn send_many_transactions( .poll_get_balance_with_commitment(&funding_keypair.pubkey(), CommitmentConfig::recent()) .expect("balance in source"); assert!(bal > 0); - let (blockhash, _fee_calculator) = client + let (blockhash, _fee_calculator, _last_valid_slot) = client .get_recent_blockhash_with_commitment(CommitmentConfig::recent()) .unwrap(); let transfer_amount = thread_rng().gen_range(1, max_tokens_per_transfer); @@ -242,7 +242,7 @@ pub fn kill_entry_and_spend_and_verify_rest( } let random_keypair = Keypair::new(); - let (blockhash, _fee_calculator) = client + let (blockhash, _fee_calculator, _last_valid_slot) = client .get_recent_blockhash_with_commitment(CommitmentConfig::recent()) .unwrap(); let mut transaction = system_transaction::transfer( diff --git a/local-cluster/src/local_cluster.rs b/local-cluster/src/local_cluster.rs index 7c04f8f4c0..013f77cf74 100644 --- a/local-cluster/src/local_cluster.rs +++ b/local-cluster/src/local_cluster.rs @@ -365,7 +365,7 @@ impl LocalCluster { lamports: u64, ) -> u64 { trace!("getting leader blockhash"); - let (blockhash, _fee_calculator) = client + let (blockhash, _fee_calculator, _last_valid_slot) = client .get_recent_blockhash_with_commitment(CommitmentConfig::recent()) .unwrap(); let mut tx = diff --git a/local-cluster/tests/local_cluster.rs b/local-cluster/tests/local_cluster.rs index 386ad73472..92620f913b 100644 --- a/local-cluster/tests/local_cluster.rs +++ b/local-cluster/tests/local_cluster.rs @@ -597,7 +597,7 @@ fn generate_frozen_account_panic(mut cluster: LocalCluster, frozen_account: Arc< let mut i = 0; while !solana_runtime::accounts_db::FROZEN_ACCOUNT_PANIC.load(Ordering::Relaxed) { // Transfer from frozen account - let (blockhash, _fee_calculator) = client + let (blockhash, _fee_calculator, _last_valid_slot) = client .get_recent_blockhash_with_commitment(CommitmentConfig::recent()) .unwrap(); client diff --git a/runtime/src/bank_client.rs b/runtime/src/bank_client.rs index 3b2eb6b7f4..3e04ab152f 100644 --- a/runtime/src/bank_client.rs +++ b/runtime/src/bank_client.rs @@ -134,8 +134,13 @@ impl SyncClient for BankClient { fn get_recent_blockhash_with_commitment( &self, _commitment_config: CommitmentConfig, - ) -> Result<(Hash, FeeCalculator)> { - Ok(self.bank.last_blockhash_with_fee_calculator()) + ) -> Result<(Hash, FeeCalculator, u64)> { + let (blockhash, fee_calculator) = self.bank.last_blockhash_with_fee_calculator(); + let last_valid_slot = self + .bank + .get_blockhash_last_valid_slot(&blockhash) + .expect("bank blockhash queue should contain blockhash"); + Ok((blockhash, fee_calculator, last_valid_slot)) } fn get_fee_calculator_for_blockhash(&self, blockhash: &Hash) -> Result> { diff --git a/sdk/src/client.rs b/sdk/src/client.rs index 42675e7f56..c305766933 100644 --- a/sdk/src/client.rs +++ b/sdk/src/client.rs @@ -70,7 +70,7 @@ pub trait SyncClient { fn get_recent_blockhash_with_commitment( &self, commitment_config: CommitmentConfig, - ) -> Result<(Hash, FeeCalculator)>; + ) -> Result<(Hash, FeeCalculator, Slot)>; /// Get `Some(FeeCalculator)` associated with `blockhash` if it is still in /// the BlockhashQueue`, otherwise `None` diff --git a/tokens/src/commands.rs b/tokens/src/commands.rs index c5b5f453c9..025bce8963 100644 --- a/tokens/src/commands.rs +++ b/tokens/src/commands.rs @@ -160,7 +160,7 @@ fn distribute_tokens( let fee_payer_pubkey = args.fee_payer.pubkey(); let message = Message::new_with_payer(&instructions, Some(&fee_payer_pubkey)); match client.send_message(message, &signers) { - Ok(transaction) => { + Ok((transaction, _last_valid_slot)) => { db::set_transaction_info( db, &allocation.recipient.parse().unwrap(), @@ -411,7 +411,7 @@ use tempfile::{tempdir, NamedTempFile}; pub fn test_process_distribute_tokens_with_client(client: C, sender_keypair: Keypair) { let thin_client = ThinClient::new(client, false); let fee_payer = Keypair::new(); - let transaction = thin_client + let (transaction, _last_valid_slot) = thin_client .transfer(sol_to_lamports(1.0), &sender_keypair, &fee_payer.pubkey()) .unwrap(); thin_client @@ -486,7 +486,7 @@ pub fn test_process_distribute_tokens_with_client(client: C, sender_k pub fn test_process_distribute_stake_with_client(client: C, sender_keypair: Keypair) { let thin_client = ThinClient::new(client, false); let fee_payer = Keypair::new(); - let transaction = thin_client + let (transaction, _last_valid_slot) = thin_client .transfer(sol_to_lamports(1.0), &sender_keypair, &fee_payer.pubkey()) .unwrap(); thin_client diff --git a/tokens/src/thin_client.rs b/tokens/src/thin_client.rs index c1eab4b33d..ed26eda841 100644 --- a/tokens/src/thin_client.rs +++ b/tokens/src/thin_client.rs @@ -3,6 +3,8 @@ use solana_runtime::bank_client::BankClient; use solana_sdk::{ account::Account, client::{AsyncClient, SyncClient}, + clock::Slot, + commitment_config::CommitmentConfig, fee_calculator::FeeCalculator, hash::Hash, message::Message, @@ -26,7 +28,7 @@ pub trait Client { signatures: &[Signature], ) -> Result>>; fn get_balance1(&self, pubkey: &Pubkey) -> Result; - fn get_recent_blockhash1(&self) -> Result<(Hash, FeeCalculator)>; + fn get_fees1(&self) -> Result<(Hash, FeeCalculator, Slot)>; fn get_account1(&self, pubkey: &Pubkey) -> Result>; } @@ -55,9 +57,11 @@ impl Client for RpcClient { .map_err(|e| TransportError::Custom(e.to_string())) } - fn get_recent_blockhash1(&self) -> Result<(Hash, FeeCalculator)> { - self.get_recent_blockhash() - .map_err(|e| TransportError::Custom(e.to_string())) + fn get_fees1(&self) -> Result<(Hash, FeeCalculator, Slot)> { + let result = self + .get_recent_blockhash_with_commitment(CommitmentConfig::default()) + .map_err(|e| TransportError::Custom(e.to_string()))?; + Ok(result.value) } fn get_account1(&self, pubkey: &Pubkey) -> Result> { @@ -95,8 +99,8 @@ impl Client for BankClient { self.get_balance(pubkey) } - fn get_recent_blockhash1(&self) -> Result<(Hash, FeeCalculator)> { - self.get_recent_blockhash() + fn get_fees1(&self) -> Result<(Hash, FeeCalculator, Slot)> { + self.get_recent_blockhash_with_commitment(CommitmentConfig::default()) } fn get_account1(&self, pubkey: &Pubkey) -> Result> { @@ -135,14 +139,19 @@ impl ThinClient { self.client.get_signature_statuses1(signatures) } - pub fn send_message(&self, message: Message, signers: &S) -> Result { + pub fn send_message( + &self, + message: Message, + signers: &S, + ) -> Result<(Transaction, Slot)> { if self.dry_run { - return Ok(Transaction::new_unsigned(message)); + return Ok((Transaction::new_unsigned(message), std::u64::MAX)); } - let (blockhash, _fee_caluclator) = self.get_recent_blockhash()?; + let (blockhash, _fee_caluclator, last_valid_slot) = self.get_fees()?; + let transaction = Transaction::new(signers, message, blockhash); self.send_transaction(transaction.clone())?; - Ok(transaction) + Ok((transaction, last_valid_slot)) } pub fn transfer( @@ -150,15 +159,15 @@ impl ThinClient { lamports: u64, sender_keypair: &S, to_pubkey: &Pubkey, - ) -> Result { + ) -> Result<(Transaction, u64)> { let create_instruction = system_instruction::transfer(&sender_keypair.pubkey(), &to_pubkey, lamports); let message = Message::new(&[create_instruction]); self.send_message(message, &[sender_keypair]) } - pub fn get_recent_blockhash(&self) -> Result<(Hash, FeeCalculator)> { - self.client.get_recent_blockhash1() + pub fn get_fees(&self) -> Result<(Hash, FeeCalculator, Slot)> { + self.client.get_fees1() } pub fn get_balance(&self, pubkey: &Pubkey) -> Result {