diff --git a/core/src/banking_stage.rs b/core/src/banking_stage.rs index bb323d7df3..f3662fa0b5 100644 --- a/core/src/banking_stage.rs +++ b/core/src/banking_stage.rs @@ -50,6 +50,7 @@ use solana_sdk::{ use solana_transaction_status::token_balances::{ collect_token_balances, TransactionTokenBalancesSet, }; +use solana_vote_program::vote_transaction; use std::{ borrow::Cow, cmp, @@ -1025,12 +1026,16 @@ impl BankingStage { msgs: &Packets, transaction_indexes: &[usize], libsecp256k1_0_5_upgrade_enabled: bool, + votes_only: bool, ) -> (Vec>, Vec) { transaction_indexes .iter() .filter_map(|tx_index| { let p = &msgs.packets[*tx_index]; let tx: Transaction = limited_deserialize(&p.data[0..p.meta.size]).ok()?; + if votes_only && vote_transaction::parse_vote_transaction(&tx).is_none() { + return None; + } tx.verify_precompiles(libsecp256k1_0_5_upgrade_enabled) .ok()?; let message_bytes = Self::packet_message(p)?; @@ -1097,6 +1102,7 @@ impl BankingStage { msgs, &packet_indexes, bank.libsecp256k1_0_5_upgrade_enabled(), + bank.vote_only_bank(), ); packet_conversion_time.stop(); @@ -1168,6 +1174,7 @@ impl BankingStage { msgs, &transaction_indexes, bank.libsecp256k1_0_5_upgrade_enabled(), + false, ); let tx_count = transaction_to_packet_indexes.len(); diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index d73f879e10..057733ac47 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -1227,12 +1227,15 @@ impl ReplayStage { poh_slot, parent_slot, root_slot ); + let root_distance = poh_slot - root_slot; + let tpu_bank = Self::new_bank_from_parent_with_notify( &parent, poh_slot, root_slot, my_pubkey, subscriptions, + root_distance > 500, ); let tpu_bank = bank_forks.write().unwrap().insert(tpu_bank); @@ -2489,6 +2492,7 @@ impl ReplayStage { forks.root(), &leader, subscriptions, + false, ); let empty: Vec = vec![]; Self::update_fork_propagated_threshold_from_votes( @@ -2515,9 +2519,10 @@ impl ReplayStage { root_slot: u64, leader: &Pubkey, subscriptions: &Arc, + vote_only_bank: bool, ) -> Bank { subscriptions.notify_slot(slot, parent.slot(), root_slot); - Bank::new_from_parent(parent, leader, slot) + Bank::new_from_parent_with_vote_only(parent, leader, slot, vote_only_bank) } fn record_rewards(bank: &Bank, rewards_recorder_sender: &Option) { diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index fac876a082..a0506ec422 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -912,6 +912,8 @@ pub struct Bank { pub drop_callback: RwLock, pub freeze_started: AtomicBool, + + vote_only_bank: bool, } impl Default for BlockhashQueue { @@ -1012,7 +1014,22 @@ impl Bank { /// Create a new bank that points to an immutable checkpoint of another bank. pub fn new_from_parent(parent: &Arc, collector_id: &Pubkey, slot: Slot) -> Self { - Self::_new_from_parent(parent, collector_id, slot, &mut null_tracer()) + Self::_new_from_parent(parent, collector_id, slot, &mut null_tracer(), false) + } + + pub fn new_from_parent_with_vote_only( + parent: &Arc, + collector_id: &Pubkey, + slot: Slot, + vote_only_bank: bool, + ) -> Self { + Self::_new_from_parent( + parent, + collector_id, + slot, + &mut null_tracer(), + vote_only_bank, + ) } pub fn new_from_parent_with_tracer( @@ -1021,7 +1038,13 @@ impl Bank { slot: Slot, reward_calc_tracer: impl FnMut(&RewardCalculationEvent), ) -> Self { - Self::_new_from_parent(parent, collector_id, slot, &mut Some(reward_calc_tracer)) + Self::_new_from_parent( + parent, + collector_id, + slot, + &mut Some(reward_calc_tracer), + false, + ) } fn _new_from_parent( @@ -1029,6 +1052,7 @@ impl Bank { collector_id: &Pubkey, slot: Slot, reward_calc_tracer: &mut Option, + vote_only_bank: bool, ) -> Self { parent.freeze(); assert_ne!(slot, parent.slot()); @@ -1074,6 +1098,7 @@ impl Bank { fee_calculator: fee_rate_governor.create_fee_calculator(), fee_rate_governor, capitalization: AtomicU64::new(parent.capitalization()), + vote_only_bank, inflation: parent.inflation.clone(), transaction_count: AtomicU64::new(parent.transaction_count()), transaction_error_count: AtomicU64::new(0), @@ -1170,6 +1195,10 @@ impl Bank { *self.drop_callback.write().unwrap() = OptionalDropCallback(callback); } + pub fn vote_only_bank(&self) -> bool { + self.vote_only_bank + } + /// Like `new_from_parent` but additionally: /// * Doesn't assume that the parent is anywhere near `slot`, parent could be millions of slots /// in the past @@ -1265,6 +1294,7 @@ impl Bank { feature_set: new(), drop_callback: RwLock::new(OptionalDropCallback(None)), freeze_started: AtomicBool::new(fields.hash != Hash::default()), + vote_only_bank: false, }; bank.finish_init(genesis_config, additional_builtins);