snarkvm_ledger_block/transition/
bytes.rs1use super::*;
17
18impl<N: Network> FromBytes for Transition<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 transition version"));
26 }
27
28 let transition_id = N::TransitionID::read_le(&mut reader)?;
30 let program_id = FromBytes::read_le(&mut reader)?;
32 let function_name = FromBytes::read_le(&mut reader)?;
34
35 let num_inputs: u8 = FromBytes::read_le(&mut reader)?;
37 let mut inputs = Vec::with_capacity(num_inputs as usize);
39 for _ in 0..num_inputs {
40 inputs.push(FromBytes::read_le(&mut reader)?);
42 }
43
44 let num_outputs: u8 = FromBytes::read_le(&mut reader)?;
46 let mut outputs = Vec::with_capacity(num_outputs as usize);
48 for _ in 0..num_outputs {
49 outputs.push(FromBytes::read_le(&mut reader)?);
51 }
52
53 let tpk = FromBytes::read_le(&mut reader)?;
55 let tcm = FromBytes::read_le(&mut reader)?;
57 let scm = FromBytes::read_le(&mut reader)?;
59
60 let transition =
62 Self::new(program_id, function_name, inputs, outputs, tpk, tcm, scm).map_err(|e| error(e.to_string()))?;
63 match transition_id == *transition.id() {
65 true => Ok(transition),
66 false => Err(error("Transition ID is incorrect, possible data corruption")),
67 }
68 }
69}
70
71impl<N: Network> ToBytes for Transition<N> {
72 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
74 1u8.write_le(&mut writer)?;
76
77 self.id.write_le(&mut writer)?;
79 self.program_id.write_le(&mut writer)?;
81 self.function_name.write_le(&mut writer)?;
83
84 (u8::try_from(self.inputs.len()).map_err(|e| error(e.to_string()))?).write_le(&mut writer)?;
86 self.inputs.write_le(&mut writer)?;
88
89 (u8::try_from(self.outputs.len()).map_err(|e| error(e.to_string()))?).write_le(&mut writer)?;
91 self.outputs.write_le(&mut writer)?;
93
94 self.tpk.write_le(&mut writer)?;
96 self.tcm.write_le(&mut writer)?;
98 self.scm.write_le(&mut writer)
100 }
101}
102
103#[cfg(test)]
104mod tests {
105 use super::*;
106
107 #[test]
108 fn test_bytes() -> Result<()> {
109 let rng = &mut TestRng::default();
110
111 let expected = crate::transition::test_helpers::sample_transition(rng);
113
114 let expected_bytes = expected.to_bytes_le()?;
116 assert_eq!(expected, Transition::read_le(&expected_bytes[..])?);
117
118 Ok(())
119 }
120}