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 if num_inputs as usize > N::MAX_INPUTS {
39 return Err(error(format!(
40 "Transition (from 'read_le') has too many inputs ({} > {})",
41 num_inputs,
42 N::MAX_INPUTS
43 )));
44 }
45 let mut inputs = Vec::with_capacity(num_inputs as usize);
47 for _ in 0..num_inputs {
48 inputs.push(FromBytes::read_le(&mut reader)?);
50 }
51
52 let num_outputs: u8 = FromBytes::read_le(&mut reader)?;
54 if num_outputs as usize > N::MAX_OUTPUTS {
56 return Err(error(format!(
57 "Transition (from 'read_le') has too many outputs ({} > {})",
58 num_outputs,
59 N::MAX_OUTPUTS
60 )));
61 }
62 let mut outputs = Vec::with_capacity(num_outputs as usize);
64 for _ in 0..num_outputs {
65 outputs.push(FromBytes::read_le(&mut reader)?);
67 }
68
69 let tpk = FromBytes::read_le(&mut reader)?;
71 let tcm = FromBytes::read_le(&mut reader)?;
73 let scm = FromBytes::read_le(&mut reader)?;
75
76 let transition =
78 Self::new(program_id, function_name, inputs, outputs, tpk, tcm, scm).map_err(|e| error(e.to_string()))?;
79 match transition_id == *transition.id() {
81 true => Ok(transition),
82 false => Err(error("Transition ID is incorrect, possible data corruption")),
83 }
84 }
85}
86
87impl<N: Network> ToBytes for Transition<N> {
88 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
90 1u8.write_le(&mut writer)?;
92
93 self.id.write_le(&mut writer)?;
95 self.program_id.write_le(&mut writer)?;
97 self.function_name.write_le(&mut writer)?;
99
100 (u8::try_from(self.inputs.len()).map_err(|e| error(e.to_string()))?).write_le(&mut writer)?;
102 self.inputs.write_le(&mut writer)?;
104
105 (u8::try_from(self.outputs.len()).map_err(|e| error(e.to_string()))?).write_le(&mut writer)?;
107 self.outputs.write_le(&mut writer)?;
109
110 self.tpk.write_le(&mut writer)?;
112 self.tcm.write_le(&mut writer)?;
114 self.scm.write_le(&mut writer)
116 }
117}
118
119#[cfg(test)]
120mod tests {
121 use super::*;
122
123 #[test]
124 fn test_bytes() -> Result<()> {
125 let rng = &mut TestRng::default();
126
127 let expected = crate::transition::test_helpers::sample_transition(rng);
129
130 let expected_bytes = expected.to_bytes_le()?;
132 assert_eq!(expected, Transition::read_le(&expected_bytes[..])?);
133
134 Ok(())
135 }
136}