patches bug in sigverify-shreds when identity is hot-swapped (#29802)

Sigverify-shreds discards shreds from node's own leader slots:
https://github.com/solana-labs/solana/blob/6baab92ab/core/src/sigverify_shreds.rs#L153-L154

But if the identity is hot-swapped the pubkey would be wrong since it
is instantiated only once at startup:
https://github.com/solana-labs/solana/blob/6baab92ab/core/src/tvu.rs#L168
This commit is contained in:
behzad nouri 2023-01-21 20:07:41 +00:00 committed by GitHub
parent 272e667cb2
commit d75303f541
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 8 additions and 4 deletions

View File

@ -1,11 +1,12 @@
use { use {
crossbeam_channel::{Receiver, RecvTimeoutError, SendError, Sender}, crossbeam_channel::{Receiver, RecvTimeoutError, SendError, Sender},
solana_gossip::cluster_info::ClusterInfo,
solana_ledger::{ solana_ledger::{
leader_schedule_cache::LeaderScheduleCache, shred, sigverify_shreds::verify_shreds_gpu, leader_schedule_cache::LeaderScheduleCache, shred, sigverify_shreds::verify_shreds_gpu,
}, },
solana_perf::{self, packet::PacketBatch, recycler_cache::RecyclerCache}, solana_perf::{self, packet::PacketBatch, recycler_cache::RecyclerCache},
solana_runtime::{bank::Bank, bank_forks::BankForks}, solana_runtime::{bank::Bank, bank_forks::BankForks},
solana_sdk::{clock::Slot, pubkey::Pubkey}, solana_sdk::{clock::Slot, pubkey::Pubkey, signature::Signer},
std::{ std::{
collections::HashMap, collections::HashMap,
sync::{ sync::{
@ -25,8 +26,7 @@ enum Error {
} }
pub(crate) fn spawn_shred_sigverify( pub(crate) fn spawn_shred_sigverify(
// TODO: Hot swap will change pubkey. cluster_info: Arc<ClusterInfo>,
self_pubkey: Pubkey,
bank_forks: Arc<RwLock<BankForks>>, bank_forks: Arc<RwLock<BankForks>>,
leader_schedule_cache: Arc<LeaderScheduleCache>, leader_schedule_cache: Arc<LeaderScheduleCache>,
shred_fetch_receiver: Receiver<PacketBatch>, shred_fetch_receiver: Receiver<PacketBatch>,
@ -39,6 +39,9 @@ pub(crate) fn spawn_shred_sigverify(
Builder::new() Builder::new()
.name("solShredVerifr".to_string()) .name("solShredVerifr".to_string())
.spawn(move || loop { .spawn(move || loop {
// We can't store the pubkey outside the loop
// because the identity might be hot swapped.
let self_pubkey = cluster_info.keypair().pubkey();
match run_shred_sigverify( match run_shred_sigverify(
&self_pubkey, &self_pubkey,
&bank_forks, &bank_forks,

View File

@ -165,7 +165,7 @@ impl Tvu {
let (verified_sender, verified_receiver) = unbounded(); let (verified_sender, verified_receiver) = unbounded();
let (retransmit_sender, retransmit_receiver) = unbounded(); let (retransmit_sender, retransmit_receiver) = unbounded();
let shred_sigverify = sigverify_shreds::spawn_shred_sigverify( let shred_sigverify = sigverify_shreds::spawn_shred_sigverify(
cluster_info.id(), cluster_info.clone(),
bank_forks.clone(), bank_forks.clone(),
leader_schedule_cache.clone(), leader_schedule_cache.clone(),
fetch_receiver, fetch_receiver,

View File

@ -82,6 +82,7 @@ impl Keypair {
} }
impl Signer for Keypair { impl Signer for Keypair {
#[inline]
fn pubkey(&self) -> Pubkey { fn pubkey(&self) -> Pubkey {
Pubkey::from(self.0.public.to_bytes()) Pubkey::from(self.0.public.to_bytes())
} }