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 {
25 return Err(error("Invalid request 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 ({} > {})",
43 inputs_len,
44 N::MAX_INPUTS
45 )));
46 }
47 let input_ids = (0..inputs_len).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
49 let inputs = (0..inputs_len).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
51
52 let signature = FromBytes::read_le(&mut reader)?;
54 let sk_tag = FromBytes::read_le(&mut reader)?;
56 let tvk = FromBytes::read_le(&mut reader)?;
58 let tcm = FromBytes::read_le(&mut reader)?;
60 let scm = FromBytes::read_le(&mut reader)?;
62
63 Ok(Self::from((
64 signer,
65 network_id,
66 program_id,
67 function_name,
68 input_ids,
69 inputs,
70 signature,
71 sk_tag,
72 tvk,
73 tcm,
74 scm,
75 )))
76 }
77}
78
79impl<N: Network> ToBytes for Request<N> {
80 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
82 1u8.write_le(&mut writer)?;
84
85 self.signer.write_le(&mut writer)?;
87 self.network_id.write_le(&mut writer)?;
89 self.program_id.write_le(&mut writer)?;
91 self.function_name.write_le(&mut writer)?;
93
94 if self.input_ids.len() != self.inputs.len() {
96 return Err(error("Invalid request: mismatching number of input IDs and inputs"));
97 }
98
99 u16::try_from(self.input_ids.len())
101 .or_halt_with::<N>("Request inputs length exceeds u16")
102 .write_le(&mut writer)?;
103 for input_id in &self.input_ids {
105 input_id.write_le(&mut writer)?;
106 }
107 for input in &self.inputs {
109 input.write_le(&mut writer)?;
110 }
111
112 self.signature.write_le(&mut writer)?;
114 self.sk_tag.write_le(&mut writer)?;
116 self.tvk.write_le(&mut writer)?;
118 self.tcm.write_le(&mut writer)?;
120 self.scm.write_le(&mut writer)
122 }
123}
124
125#[cfg(test)]
126mod tests {
127 use super::*;
128
129 #[test]
130 fn test_bytes() {
131 let mut rng = TestRng::default();
132
133 for expected in test_helpers::sample_requests(&mut rng).into_iter() {
134 let expected_bytes = expected.to_bytes_le().unwrap();
136 assert_eq!(expected, Request::read_le(&expected_bytes[..]).unwrap());
137 }
138 }
139}