snarkvm_ledger_block/transaction/execution/
bytes.rs1use super::*;
17
18impl<N: Network> FromBytes for Execution<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 execution version"));
26 }
27 let num_transitions = u8::read_le(&mut reader)?;
29 if num_transitions == 0 {
31 return Err(error("Execution (from 'read_le') has no transitions"));
32 }
33 if num_transitions as usize > Transaction::<N>::MAX_TRANSITIONS {
35 return Err(error(format!(
36 "Execution (from 'read_le') has too many transitions ({} > {})",
37 num_transitions,
38 Transaction::<N>::MAX_TRANSITIONS
39 )));
40 }
41 let transitions =
43 (0..num_transitions).map(|_| Transition::read_le(&mut reader)).collect::<IoResult<Vec<_>>>()?;
44 let global_state_root = N::StateRoot::read_le(&mut reader)?;
46 let proof_variant = u8::read_le(&mut reader)?;
48 let proof = match proof_variant {
50 0 => None,
51 1 => Some(Proof::read_le(&mut reader)?),
52 _ => return Err(error(format!("Invalid proof variant '{proof_variant}'"))),
53 };
54 Self::from(transitions.into_iter(), global_state_root, proof).map_err(|e| error(e.to_string()))
56 }
57}
58
59impl<N: Network> ToBytes for Execution<N> {
60 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
62 1u8.write_le(&mut writer)?;
64 (u8::try_from(self.transitions.len()).map_err(|e| error(e.to_string()))?).write_le(&mut writer)?;
66 for transition in self.transitions.values() {
68 transition.write_le(&mut writer)?;
69 }
70 self.global_state_root.write_le(&mut writer)?;
72 match self.proof {
74 None => 0u8.write_le(&mut writer)?,
75 Some(ref proof) => {
76 1u8.write_le(&mut writer)?;
77 proof.write_le(&mut writer)?;
78 }
79 }
80 Ok(())
81 }
82}
83
84#[cfg(test)]
85mod tests {
86 use super::*;
87
88 #[test]
89 fn test_bytes() -> Result<()> {
90 let rng = &mut TestRng::default();
91
92 let expected = crate::transaction::execution::test_helpers::sample_execution(rng, 0);
94
95 let expected_bytes = expected.to_bytes_le()?;
97 assert_eq!(expected, Execution::read_le(&expected_bytes[..])?);
98 Ok(())
99 }
100}