snarkvm_ledger_narwhal_batch_certificate/
bytes.rs1use super::*;
17
18impl<N: Network> FromBytes for BatchCertificate<N> {
19 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
21 let version = u8::read_le(&mut reader)?;
23 if version != 1 {
25 return Err(error("Invalid batch certificate version"));
26 }
27
28 let batch_header = BatchHeader::read_le(&mut reader)?;
30 let num_signatures = u16::read_le(&mut reader)?;
32 if num_signatures > Self::max_signatures().map_err(error)? {
34 return Err(error(format!(
35 "Number of signatures ({num_signatures}) exceeds the maximum ({})",
36 Self::max_signatures().map_err(error)?
37 )));
38 }
39 let mut signature_bytes = vec![0u8; num_signatures as usize * Signature::<N>::size_in_bytes()];
41 reader.read_exact(&mut signature_bytes)?;
42 let signatures = cfg_chunks!(signature_bytes, Signature::<N>::size_in_bytes())
44 .map(Signature::read_le)
45 .collect::<Result<IndexSet<_>, _>>()?;
46 Self::from(batch_header, signatures).map_err(error)
48 }
49}
50
51impl<N: Network> ToBytes for BatchCertificate<N> {
52 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
54 1u8.write_le(&mut writer)?;
56 self.batch_header.write_le(&mut writer)?;
58 u16::try_from(self.signatures.len()).map_err(error)?.write_le(&mut writer)?;
60 for signature in self.signatures.iter() {
62 signature.write_le(&mut writer)?;
64 }
65 Ok(())
66 }
67}
68
69#[cfg(test)]
70mod tests {
71 use super::*;
72
73 #[test]
74 fn test_bytes() {
75 let rng = &mut TestRng::default();
76
77 for expected in crate::test_helpers::sample_batch_certificates(rng) {
78 let expected_bytes = expected.to_bytes_le().unwrap();
80 assert_eq!(expected, BatchCertificate::read_le(&expected_bytes[..]).unwrap());
81 }
82 }
83}