snarkvm_synthesizer_program/finalize/
bytes.rs1use super::*;
17
18impl<N: Network, Command: CommandTrait<N>> FromBytes for FinalizeCore<N, Command> {
19 #[inline]
21 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
22 let name = Identifier::<N>::read_le(&mut reader)?;
24
25 let num_inputs = u16::read_le(&mut reader)?;
27 if num_inputs > u16::try_from(N::MAX_INPUTS).map_err(error)? {
28 return Err(error(format!("Failed to deserialize finalize: too many inputs ({num_inputs})")));
29 }
30 let mut inputs = Vec::with_capacity(num_inputs as usize);
31 for _ in 0..num_inputs {
32 inputs.push(Input::read_le(&mut reader)?);
33 }
34
35 let num_commands = u16::read_le(&mut reader)?;
37 if num_commands.is_zero() {
38 return Err(error("Failed to deserialize finalize: needs at least one command".to_string()));
39 }
40 if num_commands > u16::try_from(N::MAX_COMMANDS).map_err(error)? {
41 return Err(error(format!("Failed to deserialize finalize: too many commands ({num_commands})")));
42 }
43 let mut commands = Vec::with_capacity(num_commands as usize);
44 for _ in 0..num_commands {
45 commands.push(Command::read_le(&mut reader)?);
46 }
47
48 let mut finalize = Self::new(name);
50 inputs.into_iter().try_for_each(|input| finalize.add_input(input)).map_err(error)?;
51 commands.into_iter().try_for_each(|command| finalize.add_command(command)).map_err(error)?;
52
53 Ok(finalize)
54 }
55}
56
57impl<N: Network, Command: CommandTrait<N>> ToBytes for FinalizeCore<N, Command> {
58 #[inline]
60 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
61 self.name.write_le(&mut writer)?;
63
64 let num_inputs = self.inputs.len();
66 match num_inputs <= N::MAX_INPUTS {
67 true => u16::try_from(num_inputs).map_err(error)?.write_le(&mut writer)?,
68 false => return Err(error(format!("Failed to write {num_inputs} inputs as bytes"))),
69 }
70
71 for input in self.inputs.iter() {
73 input.write_le(&mut writer)?;
74 }
75
76 let num_commands = self.commands.len();
78 match 0 < num_commands && num_commands <= N::MAX_COMMANDS {
79 true => u16::try_from(num_commands).map_err(error)?.write_le(&mut writer)?,
80 false => return Err(error(format!("Failed to write {num_commands} commands as bytes"))),
81 }
82
83 for command in self.commands.iter() {
85 command.write_le(&mut writer)?;
86 }
87
88 Ok(())
89 }
90}
91
92#[cfg(test)]
93mod tests {
94 use super::*;
95 use crate::Finalize;
96 use console::network::MainnetV0;
97
98 type CurrentNetwork = MainnetV0;
99
100 #[test]
101 fn test_finalize_bytes() -> Result<()> {
102 let finalize_string = r"
103finalize main:
104 input r0 as field.public;
105 input r1 as field.public;
106 add r0 r1 into r2;
107 add r0 r1 into r3;
108 add r0 r1 into r4;
109 add r0 r1 into r5;
110 add r0 r1 into r6;
111 add r0 r1 into r7;
112 add r0 r1 into r8;
113 add r0 r1 into r9;
114 add r0 r1 into r10;
115 add r0 r1 into r11;
116 get accounts[r0] into r12;
117 get accounts[r1] into r13;";
118
119 let expected = Finalize::<CurrentNetwork>::from_str(finalize_string)?;
120 let expected_bytes = expected.to_bytes_le()?;
121 println!("String size: {:?}, Bytecode size: {:?}", finalize_string.as_bytes().len(), expected_bytes.len());
122
123 let candidate = Finalize::<CurrentNetwork>::from_bytes_le(&expected_bytes)?;
124 assert_eq!(expected.to_string(), candidate.to_string());
125 assert_eq!(expected_bytes, candidate.to_bytes_le()?);
126 Ok(())
127 }
128}