snarkvm_ledger_coinbase/helpers/epoch_challenge/
bytes.rs1use super::*;
16
17impl<N: Network> FromBytes for EpochChallenge<N> {
18 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
20 let epoch_number = FromBytes::read_le(&mut reader)?;
22 let epoch_block_hash = FromBytes::read_le(&mut reader)?;
24 let degree = FromBytes::read_le(&mut reader)?;
26 Self::new(epoch_number, epoch_block_hash, degree).map_err(|e| error(e.to_string()))
28 }
29}
30
31impl<N: Network> ToBytes for EpochChallenge<N> {
32 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
34 self.epoch_number.write_le(&mut writer)?;
36 self.epoch_block_hash.write_le(&mut writer)?;
38 self.degree().write_le(&mut writer)
40 }
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46 use console::network::Testnet3;
47
48 use rand::RngCore;
49
50 type CurrentNetwork = Testnet3;
51
52 const ITERATIONS: usize = 100;
53
54 #[test]
55 fn test_bytes() {
56 let mut rng = TestRng::default();
57
58 for _ in 0..ITERATIONS {
59 let degree: u16 = rng.gen(); let expected = EpochChallenge::<CurrentNetwork>::new(rng.next_u32(), rng.gen(), degree as u32).unwrap();
62
63 let expected_bytes = expected.to_bytes_le().unwrap();
65 let candidate = EpochChallenge::read_le(&expected_bytes[..]).unwrap();
66 assert_eq!(expected.epoch_number(), candidate.epoch_number());
67 assert_eq!(expected.epoch_block_hash(), candidate.epoch_block_hash());
68 assert_eq!(expected.degree(), candidate.degree());
69 assert_eq!(expected, candidate);
70
71 assert!(EpochChallenge::<CurrentNetwork>::read_le(&expected_bytes[1..]).is_err());
72 }
73 }
74}