moves sign_shred and new_coding_shred_header out of Shredder (#24487)

This commit is contained in:
behzad nouri 2022-04-19 20:00:05 +00:00 committed by GitHub
parent abf2b0e9c0
commit 705ea53353
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 55 additions and 61 deletions

View File

@ -83,7 +83,7 @@ impl StandardBroadcastRun {
self.shred_version, self.shred_version,
fec_set_index.unwrap(), fec_set_index.unwrap(),
); );
Shredder::sign_shred(keypair, &mut shred); shred.sign(keypair);
state.data_shreds_buffer.push(shred.clone()); state.data_shreds_buffer.push(shred.clone());
let mut shreds = make_coding_shreds( let mut shreds = make_coding_shreds(
keypair, keypair,

View File

@ -52,10 +52,7 @@ pub fn nonce(buf: &[u8]) -> Option<Nonce> {
mod test { mod test {
use { use {
super::*, super::*,
solana_ledger::{ solana_ledger::{shred::Shred, sigverify_shreds::verify_shred_cpu},
shred::{Shred, Shredder},
sigverify_shreds::verify_shred_cpu,
},
solana_sdk::{ solana_sdk::{
packet::PacketFlags, packet::PacketFlags,
signature::{Keypair, Signer}, signature::{Keypair, Signer},
@ -81,7 +78,7 @@ mod test {
); );
assert_eq!(shred.slot(), slot); assert_eq!(shred.slot(), slot);
let keypair = Keypair::new(); let keypair = Keypair::new();
Shredder::sign_shred(&keypair, &mut shred); shred.sign(&keypair);
trace!("signature {}", shred.common_header.signature); trace!("signature {}", shred.common_header.signature);
let nonce = 9; let nonce = 9;
let mut packet = repair_response_packet_from_bytes( let mut packet = repair_response_packet_from_bytes(

View File

@ -69,10 +69,7 @@ impl SigVerifier for ShredSigVerifier {
pub mod tests { pub mod tests {
use { use {
super::*, super::*,
solana_ledger::{ solana_ledger::{genesis_utils::create_genesis_config_with_leader, shred::Shred},
genesis_utils::create_genesis_config_with_leader,
shred::{Shred, Shredder},
},
solana_perf::packet::Packet, solana_perf::packet::Packet,
solana_runtime::bank::Bank, solana_runtime::bank::Bank,
solana_sdk::signature::{Keypair, Signer}, solana_sdk::signature::{Keypair, Signer},
@ -95,7 +92,7 @@ pub mod tests {
let mut batches = [PacketBatch::default(), PacketBatch::default()]; let mut batches = [PacketBatch::default(), PacketBatch::default()];
let keypair = Keypair::new(); let keypair = Keypair::new();
Shredder::sign_shred(&keypair, &mut shred); shred.sign(&keypair);
batches[0].packets.resize(1, Packet::default()); batches[0].packets.resize(1, Packet::default());
batches[0].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload); batches[0].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
batches[0].packets[0].meta.size = shred.payload.len(); batches[0].packets[0].meta.size = shred.payload.len();
@ -111,7 +108,7 @@ pub mod tests {
0, 0,
0xc0de, 0xc0de,
); );
Shredder::sign_shred(&keypair, &mut shred); shred.sign(&keypair);
batches[1].packets.resize(1, Packet::default()); batches[1].packets.resize(1, Packet::default());
batches[1].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload); batches[1].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
batches[1].packets[0].meta.size = shred.payload.len(); batches[1].packets[0].meta.size = shred.payload.len();
@ -145,7 +142,7 @@ pub mod tests {
0, 0,
0xc0de, 0xc0de,
); );
Shredder::sign_shred(&leader_keypair, &mut shred); shred.sign(&leader_keypair);
batches[0].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload); batches[0].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
batches[0].packets[0].meta.size = shred.payload.len(); batches[0].packets[0].meta.size = shred.payload.len();
@ -161,7 +158,7 @@ pub mod tests {
0xc0de, 0xc0de,
); );
let wrong_keypair = Keypair::new(); let wrong_keypair = Keypair::new();
Shredder::sign_shred(&wrong_keypair, &mut shred); shred.sign(&wrong_keypair);
batches[0].packets[1].data[0..shred.payload.len()].copy_from_slice(&shred.payload); batches[0].packets[1].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
batches[0].packets[1].meta.size = shred.payload.len(); batches[0].packets[1].meta.size = shred.payload.len();

View File

@ -875,7 +875,7 @@ mod test {
)); ));
// coding shreds don't contain parent slot information, test that slot >= root // coding shreds don't contain parent slot information, test that slot >= root
let (common, coding) = Shredder::new_coding_shred_header( let (common, coding) = Shred::new_coding_shred_header(
5, // slot 5, // slot
5, // index 5, // index
5, // fec_set_index 5, // fec_set_index
@ -886,7 +886,7 @@ mod test {
); );
let mut coding_shred = let mut coding_shred =
Shred::new_empty_from_header(common, DataShredHeader::default(), coding); Shred::new_empty_from_header(common, DataShredHeader::default(), coding);
Shredder::sign_shred(&leader_keypair, &mut coding_shred); coding_shred.sign(&leader_keypair);
// shred.slot() > root, shred continues // shred.slot() > root, shred continues
assert!(should_retransmit_and_persist( assert!(should_retransmit_and_persist(
&coding_shred, &coding_shred,
@ -959,7 +959,7 @@ mod test {
std::net::{IpAddr, Ipv4Addr}, std::net::{IpAddr, Ipv4Addr},
}; };
solana_logger::setup(); solana_logger::setup();
let (common, coding) = Shredder::new_coding_shred_header( let (common, coding) = Shred::new_coding_shred_header(
5, // slot 5, // slot
5, // index 5, // index
5, // fec_set_index 5, // fec_set_index

View File

@ -5977,7 +5977,7 @@ pub mod tests {
let blockstore = Blockstore::open(ledger_path.path()).unwrap(); let blockstore = Blockstore::open(ledger_path.path()).unwrap();
let slot = 1; let slot = 1;
let (shred, coding) = Shredder::new_coding_shred_header( let (shred, coding) = Shred::new_coding_shred_header(
slot, 11, // index slot, 11, // index
11, // fec_set_index 11, // fec_set_index
11, // num_data_shreds 11, // num_data_shreds
@ -6034,7 +6034,7 @@ pub mod tests {
let last_root = RwLock::new(0); let last_root = RwLock::new(0);
let slot = 1; let slot = 1;
let (mut shred, coding) = Shredder::new_coding_shred_header( let (mut shred, coding) = Shred::new_coding_shred_header(
slot, 11, // index slot, 11, // index
11, // fec_set_index 11, // fec_set_index
11, // num_data_shreds 11, // num_data_shreds

View File

@ -367,6 +367,33 @@ impl Shred {
.ok_or(ShredError::InvalidPayload) .ok_or(ShredError::InvalidPayload)
} }
pub fn new_coding_shred_header(
slot: Slot,
index: u32,
fec_set_index: u32,
num_data_shreds: u16,
num_coding_shreds: u16,
position: u16,
version: u16,
) -> (ShredCommonHeader, CodingShredHeader) {
let header = ShredCommonHeader {
shred_type: ShredType::Code,
index,
slot,
version,
fec_set_index,
..ShredCommonHeader::default()
};
(
header,
CodingShredHeader {
num_data_shreds,
num_coding_shreds,
position,
},
)
}
pub fn new_empty_coding( pub fn new_empty_coding(
slot: Slot, slot: Slot,
index: u32, index: u32,
@ -376,7 +403,7 @@ impl Shred {
position: u16, position: u16,
version: u16, version: u16,
) -> Self { ) -> Self {
let (header, coding_header) = Shredder::new_coding_shred_header( let (header, coding_header) = Self::new_coding_shred_header(
slot, slot,
index, index,
fec_set_index, fec_set_index,
@ -580,6 +607,13 @@ impl Shred {
self.common_header.signature self.common_header.signature
} }
pub fn sign(&mut self, keypair: &Keypair) {
let signature = keypair.sign_message(&self.payload[SIZE_OF_SIGNATURE..]);
bincode::serialize_into(&mut self.payload[..SIZE_OF_SIGNATURE], &signature)
.expect("Failed to generate serialized signature");
self.common_header.signature = signature;
}
pub fn seed(&self, leader_pubkey: Pubkey) -> [u8; 32] { pub fn seed(&self, leader_pubkey: Pubkey) -> [u8; 32] {
hashv(&[ hashv(&[
&self.slot().to_le_bytes(), &self.slot().to_le_bytes(),
@ -776,7 +810,7 @@ impl Shredder {
self.version, self.version,
fec_set_index.unwrap(), fec_set_index.unwrap(),
); );
Shredder::sign_shred(keypair, &mut shred); shred.sign(keypair);
shred shred
}; };
let data_shreds: Vec<Shred> = PAR_THREAD_POOL.with(|thread_pool| { let data_shreds: Vec<Shred> = PAR_THREAD_POOL.with(|thread_pool| {
@ -846,7 +880,7 @@ impl Shredder {
PAR_THREAD_POOL.with(|thread_pool| { PAR_THREAD_POOL.with(|thread_pool| {
thread_pool.borrow().install(|| { thread_pool.borrow().install(|| {
coding_shreds.par_iter_mut().for_each(|coding_shred| { coding_shreds.par_iter_mut().for_each(|coding_shred| {
Shredder::sign_shred(keypair, coding_shred); coding_shred.sign(keypair);
}) })
}) })
}); });
@ -857,40 +891,6 @@ impl Shredder {
Ok(coding_shreds) Ok(coding_shreds)
} }
pub fn sign_shred(signer: &Keypair, shred: &mut Shred) {
let signature = signer.sign_message(&shred.payload[SIZE_OF_SIGNATURE..]);
bincode::serialize_into(&mut shred.payload[..SIZE_OF_SIGNATURE], &signature)
.expect("Failed to generate serialized signature");
shred.common_header.signature = signature;
}
pub fn new_coding_shred_header(
slot: Slot,
index: u32,
fec_set_index: u32,
num_data_shreds: u16,
num_coding_shreds: u16,
position: u16,
version: u16,
) -> (ShredCommonHeader, CodingShredHeader) {
let header = ShredCommonHeader {
shred_type: ShredType::Code,
index,
slot,
version,
fec_set_index,
..ShredCommonHeader::default()
};
(
header,
CodingShredHeader {
num_data_shreds,
num_coding_shreds,
position,
},
)
}
/// Generates coding shreds for the data shreds in the current FEC set /// Generates coding shreds for the data shreds in the current FEC set
pub fn generate_coding_shreds( pub fn generate_coding_shreds(
data: &[Shred], data: &[Shred],
@ -1992,7 +1992,7 @@ pub mod tests {
assert_eq!(None, get_shred_slot_index_type(&packet, &mut stats)); assert_eq!(None, get_shred_slot_index_type(&packet, &mut stats));
assert_eq!(1, stats.index_out_of_bounds); assert_eq!(1, stats.index_out_of_bounds);
let (header, coding_header) = Shredder::new_coding_shred_header( let (header, coding_header) = Shred::new_coding_shred_header(
8, // slot 8, // slot
2, // index 2, // index
10, // fec_set_index 10, // fec_set_index

View File

@ -459,7 +459,7 @@ pub fn sign_shreds_gpu(
pub mod tests { pub mod tests {
use { use {
super::*, super::*,
crate::shred::{Shred, Shredder, SIZE_OF_DATA_SHRED_PAYLOAD}, crate::shred::{Shred, SIZE_OF_DATA_SHRED_PAYLOAD},
solana_sdk::signature::{Keypair, Signer}, solana_sdk::signature::{Keypair, Signer},
}; };
@ -479,7 +479,7 @@ pub mod tests {
); );
assert_eq!(shred.slot(), slot); assert_eq!(shred.slot(), slot);
let keypair = Keypair::new(); let keypair = Keypair::new();
Shredder::sign_shred(&keypair, &mut shred); shred.sign(&keypair);
trace!("signature {}", shred.common_header.signature); trace!("signature {}", shred.common_header.signature);
packet.data[0..shred.payload.len()].copy_from_slice(&shred.payload); packet.data[0..shred.payload.len()].copy_from_slice(&shred.payload);
packet.meta.size = shred.payload.len(); packet.meta.size = shred.payload.len();
@ -524,7 +524,7 @@ pub mod tests {
0xc0de, 0xc0de,
); );
let keypair = Keypair::new(); let keypair = Keypair::new();
Shredder::sign_shred(&keypair, &mut shred); shred.sign(&keypair);
batches[0].packets.resize(1, Packet::default()); batches[0].packets.resize(1, Packet::default());
batches[0].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload); batches[0].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
batches[0].packets[0].meta.size = shred.payload.len(); batches[0].packets[0].meta.size = shred.payload.len();
@ -579,7 +579,7 @@ pub mod tests {
0xc0de, 0xc0de,
); );
let keypair = Keypair::new(); let keypair = Keypair::new();
Shredder::sign_shred(&keypair, &mut shred); shred.sign(&keypair);
batches[0].packets.resize(1, Packet::default()); batches[0].packets.resize(1, Packet::default());
batches[0].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload); batches[0].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
batches[0].packets[0].meta.size = shred.payload.len(); batches[0].packets[0].meta.size = shred.payload.len();