snarkvm_ledger_committee/
bytes.rs1use super::*;
17
18impl<N: Network> FromBytes for Committee<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 committee version"));
26 }
27
28 let id = Field::read_le(&mut reader)?;
30 let starting_round = u64::read_le(&mut reader)?;
32 let num_members = u16::read_le(&mut reader)?;
34 if num_members > Self::max_committee_size().map_err(error)? {
36 return Err(error(format!(
37 "Committee cannot exceed {} members, found {num_members}",
38 Self::max_committee_size().map_err(error)?,
39 )));
40 }
41
42 let member_byte_size = Address::<N>::size_in_bytes() + 8 + 1 + 1;
44 let mut member_bytes = vec![0u8; num_members as usize * member_byte_size];
46 reader.read_exact(&mut member_bytes)?;
47 let members = cfg_chunks!(member_bytes, member_byte_size)
49 .map(|mut bytes| {
50 let member = Address::<N>::read_le(&mut bytes)?;
52 let stake = u64::read_le(&mut bytes)?;
54 let is_open = bool::read_le(&mut bytes)?;
56 let commission = u8::read_le(&mut bytes)?;
58 Ok((member, (stake, is_open, commission)))
60 })
61 .collect::<Result<IndexMap<_, _>, std::io::Error>>()?;
62
63 let total_stake = u64::read_le(&mut reader)?;
65 let committee = Self::new(starting_round, members).map_err(|e| error(e.to_string()))?;
67 if committee.id() != id {
69 return Err(error("Invalid committee ID during deserialization"));
70 }
71 match committee.total_stake() == total_stake {
73 true => Ok(committee),
74 false => Err(error("Invalid total stake in committee during deserialization")),
75 }
76 }
77}
78
79impl<N: Network> ToBytes for Committee<N> {
80 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
82 1u8.write_le(&mut writer)?;
84 self.id().write_le(&mut writer)?;
86 self.starting_round.write_le(&mut writer)?;
88 u16::try_from(self.members.len()).map_err(|e| error(e.to_string()))?.write_le(&mut writer)?;
90 for (address, (stake, is_open, commission)) in &self.members {
92 address.write_le(&mut writer)?;
94 stake.write_le(&mut writer)?;
96 is_open.write_le(&mut writer)?;
98 commission.write_le(&mut writer)?;
100 }
101 self.total_stake.write_le(&mut writer)
103 }
104}
105
106#[cfg(test)]
107mod tests {
108 use super::*;
109
110 #[test]
111 fn test_bytes() {
112 let rng = &mut TestRng::default();
113
114 for expected in crate::test_helpers::sample_committees(rng) {
115 let expected_bytes = expected.to_bytes_le().unwrap();
117 assert_eq!(expected, Committee::read_le(&expected_bytes[..]).unwrap());
118 }
119 }
120}