diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index c0ff5eec0c892c..21c48305498923 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -837,6 +837,10 @@ pub mod ed25519_precompile_verify_strict { solana_sdk::declare_id!("ed9tNscbWLYBooxWA7FE2B5KHWs8A6sxfY8EzezEcoo"); } +pub mod verify_retransmitter_signature { + solana_sdk::declare_id!("BZ5g4hRbu5hLQQBdPyo2z9icGyJ8Khiyj3QS6dhWijTb"); +} + lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ @@ -1041,6 +1045,7 @@ lazy_static! { (zk_elgamal_proof_program_enabled::id(), "Enable ZkElGamalProof program SIMD-0153"), (move_stake_and_move_lamports_ixs::id(), "Enable MoveStake and MoveLamports stake program instructions #1610"), (ed25519_precompile_verify_strict::id(), "Use strict verification in ed25519 precompile SIMD-0152"), + (verify_retransmitter_signature::id(), "Verify retransmitter signature #1840"), /*************** ADD NEW FEATURES HERE ***************/ ] .iter() diff --git a/turbine/src/sigverify_shreds.rs b/turbine/src/sigverify_shreds.rs index 88eaecd006764d..320b95ac24188e 100644 --- a/turbine/src/sigverify_shreds.rs +++ b/turbine/src/sigverify_shreds.rs @@ -1,6 +1,6 @@ use { crate::{ - cluster_nodes::{self, ClusterNodesCache}, + cluster_nodes::{self, check_feature_activation, ClusterNodesCache}, retransmit_stage::RetransmitStage, }, crossbeam_channel::{Receiver, RecvTimeoutError, SendError, Sender}, @@ -19,6 +19,7 @@ use { }, solana_sdk::{ clock::Slot, + feature_set, pubkey::Pubkey, signature::{Keypair, Signer}, }, @@ -201,6 +202,19 @@ fn run_shred_sigverify( stats .num_invalid_retransmitter .fetch_add(1, Ordering::Relaxed); + if shred::layout::get_slot(shred) + .map(|slot| { + check_feature_activation( + &feature_set::verify_retransmitter_signature::id(), + slot, + &root_bank, + ) + }) + .unwrap_or_default() + { + packet.meta_mut().set_discard(true); + return; + } } // We can ignore Error::InvalidShredVariant because that // basically means that the shred is of a variant which