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 let input_ids = (0..inputs_len).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
41 let inputs = (0..inputs_len).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
43
44 let signature = FromBytes::read_le(&mut reader)?;
46 let sk_tag = FromBytes::read_le(&mut reader)?;
48 let tvk = FromBytes::read_le(&mut reader)?;
50 let tcm = FromBytes::read_le(&mut reader)?;
52 let scm = FromBytes::read_le(&mut reader)?;
54
55 Ok(Self::from((
56 signer,
57 network_id,
58 program_id,
59 function_name,
60 input_ids,
61 inputs,
62 signature,
63 sk_tag,
64 tvk,
65 tcm,
66 scm,
67 )))
68 }
69}
70
71impl<N: Network> ToBytes for Request<N> {
72 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
74 1u8.write_le(&mut writer)?;
76
77 self.signer.write_le(&mut writer)?;
79 self.network_id.write_le(&mut writer)?;
81 self.program_id.write_le(&mut writer)?;
83 self.function_name.write_le(&mut writer)?;
85
86 if self.input_ids.len() != self.inputs.len() {
88 return Err(error("Invalid request: mismatching number of input IDs and inputs"));
89 }
90
91 u16::try_from(self.input_ids.len())
93 .or_halt_with::<N>("Request inputs length exceeds u16")
94 .write_le(&mut writer)?;
95 for input_id in &self.input_ids {
97 input_id.write_le(&mut writer)?;
98 }
99 for input in &self.inputs {
101 input.write_le(&mut writer)?;
102 }
103
104 self.signature.write_le(&mut writer)?;
106 self.sk_tag.write_le(&mut writer)?;
108 self.tvk.write_le(&mut writer)?;
110 self.tcm.write_le(&mut writer)?;
112 self.scm.write_le(&mut writer)
114 }
115}
116
117#[cfg(test)]
118mod tests {
119 use super::*;
120
121 #[test]
122 fn test_bytes() {
123 let mut rng = TestRng::default();
124
125 for expected in test_helpers::sample_requests(&mut rng).into_iter() {
126 let expected_bytes = expected.to_bytes_le().unwrap();
128 assert_eq!(expected, Request::read_le(&expected_bytes[..]).unwrap());
129 }
130 }
131}