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,
fec_set_index.unwrap(),
);
Shredder::sign_shred(keypair, &mut shred);
shred.sign(keypair);
state.data_shreds_buffer.push(shred.clone());
let mut shreds = make_coding_shreds(
keypair,

View File

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

View File

@ -69,10 +69,7 @@ impl SigVerifier for ShredSigVerifier {
pub mod tests {
use {
super::*,
solana_ledger::{
genesis_utils::create_genesis_config_with_leader,
shred::{Shred, Shredder},
},
solana_ledger::{genesis_utils::create_genesis_config_with_leader, shred::Shred},
solana_perf::packet::Packet,
solana_runtime::bank::Bank,
solana_sdk::signature::{Keypair, Signer},
@ -95,7 +92,7 @@ pub mod tests {
let mut batches = [PacketBatch::default(), PacketBatch::default()];
let keypair = Keypair::new();
Shredder::sign_shred(&keypair, &mut shred);
shred.sign(&keypair);
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].meta.size = shred.payload.len();
@ -111,7 +108,7 @@ pub mod tests {
0,
0xc0de,
);
Shredder::sign_shred(&keypair, &mut shred);
shred.sign(&keypair);
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].meta.size = shred.payload.len();
@ -145,7 +142,7 @@ pub mod tests {
0,
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].meta.size = shred.payload.len();
@ -161,7 +158,7 @@ pub mod tests {
0xc0de,
);
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].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
let (common, coding) = Shredder::new_coding_shred_header(
let (common, coding) = Shred::new_coding_shred_header(
5, // slot
5, // index
5, // fec_set_index
@ -886,7 +886,7 @@ mod test {
);
let mut coding_shred =
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
assert!(should_retransmit_and_persist(
&coding_shred,
@ -959,7 +959,7 @@ mod test {
std::net::{IpAddr, Ipv4Addr},
};
solana_logger::setup();
let (common, coding) = Shredder::new_coding_shred_header(
let (common, coding) = Shred::new_coding_shred_header(
5, // slot
5, // index
5, // fec_set_index

View File

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

View File

@ -367,6 +367,33 @@ impl Shred {
.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(
slot: Slot,
index: u32,
@ -376,7 +403,7 @@ impl Shred {
position: u16,
version: u16,
) -> Self {
let (header, coding_header) = Shredder::new_coding_shred_header(
let (header, coding_header) = Self::new_coding_shred_header(
slot,
index,
fec_set_index,
@ -580,6 +607,13 @@ impl Shred {
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] {
hashv(&[
&self.slot().to_le_bytes(),
@ -776,7 +810,7 @@ impl Shredder {
self.version,
fec_set_index.unwrap(),
);
Shredder::sign_shred(keypair, &mut shred);
shred.sign(keypair);
shred
};
let data_shreds: Vec<Shred> = PAR_THREAD_POOL.with(|thread_pool| {
@ -846,7 +880,7 @@ impl Shredder {
PAR_THREAD_POOL.with(|thread_pool| {
thread_pool.borrow().install(|| {
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)
}
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
pub fn generate_coding_shreds(
data: &[Shred],
@ -1992,7 +1992,7 @@ pub mod tests {
assert_eq!(None, get_shred_slot_index_type(&packet, &mut stats));
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
2, // index
10, // fec_set_index

View File

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