snarkvm_console_program/request/
bytes.rs1use super::*;
17
18impl<N: Network> FromBytes for Request<N> {
19 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
21 let version = u8::read_le(&mut reader)?;
23 if version != 1 && version != 2 {
25 return Err(error(format!("Invalid request version: {version}")));
26 }
27
28 let signer = FromBytes::read_le(&mut reader)?;
30 let network_id = FromBytes::read_le(&mut reader)?;
32 let program_id = FromBytes::read_le(&mut reader)?;
34 let function_name = FromBytes::read_le(&mut reader)?;
36
37 let inputs_len = u16::read_le(&mut reader)?;
39 if inputs_len as usize > N::MAX_INPUTS {
41 return Err(error(format!(
42 "Request (from 'read_le') has too many inputs ({inputs_len} > {})",
43 N::MAX_INPUTS
44 )));
45 }
46 let input_ids = (0..inputs_len).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
48 let inputs = (0..inputs_len).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
50
51 let signature = FromBytes::read_le(&mut reader)?;
53 let sk_tag = FromBytes::read_le(&mut reader)?;
55 let tvk = FromBytes::read_le(&mut reader)?;
57 let tcm = FromBytes::read_le(&mut reader)?;
59 let scm = FromBytes::read_le(&mut reader)?;
61
62 let is_dynamic = match version {
64 1 => false,
65 2 => bool::read_le(&mut reader)?,
66 _ => unreachable!(),
68 };
69
70 Ok(Self::from((
71 signer,
72 network_id,
73 program_id,
74 function_name,
75 input_ids,
76 inputs,
77 signature,
78 sk_tag,
79 tvk,
80 tcm,
81 scm,
82 is_dynamic,
83 )))
84 }
85}
86
87impl<N: Network> ToBytes for Request<N> {
88 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
90 2u8.write_le(&mut writer)?;
93 self.signer.write_le(&mut writer)?;
95 self.network_id.write_le(&mut writer)?;
97 self.program_id.write_le(&mut writer)?;
99 self.function_name.write_le(&mut writer)?;
101
102 if self.input_ids.len() != self.inputs.len() {
104 return Err(error("Invalid request: mismatching number of input IDs and inputs"));
105 }
106
107 u16::try_from(self.input_ids.len())
109 .or_halt_with::<N>("Request inputs length exceeds u16")
110 .write_le(&mut writer)?;
111 for input_id in &self.input_ids {
113 input_id.write_le(&mut writer)?;
114 }
115 for input in &self.inputs {
117 input.write_le(&mut writer)?;
118 }
119
120 self.signature.write_le(&mut writer)?;
122 self.sk_tag.write_le(&mut writer)?;
124 self.tvk.write_le(&mut writer)?;
126 self.tcm.write_le(&mut writer)?;
128 self.scm.write_le(&mut writer)?;
130
131 self.is_dynamic.write_le(&mut writer)?;
133
134 Ok(())
135 }
136}
137
138#[cfg(test)]
139mod tests {
140 use super::*;
141
142 #[test]
143 fn test_bytes() {
144 let mut rng = TestRng::default();
145
146 for expected in test_helpers::sample_requests(&mut rng).into_iter() {
147 let expected_bytes = expected.to_bytes_le().unwrap();
149 assert_eq!(expected, Request::read_le(&expected_bytes[..]).unwrap());
150 }
151 }
152}