snarkvm_console_program/request/
bytes.rs

1// Copyright 2024 Aleo Network Foundation
2// This file is part of the snarkVM library.
3
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at:
7
8// http://www.apache.org/licenses/LICENSE-2.0
9
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16use super::*;
17
18impl<N: Network> FromBytes for Request<N> {
19    /// Reads the request from a buffer.
20    fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
21        // Read the version.
22        let version = u8::read_le(&mut reader)?;
23        // Ensure the version is valid.
24        if version != 1 {
25            return Err(error("Invalid request version"));
26        }
27
28        // Read the signer.
29        let signer = FromBytes::read_le(&mut reader)?;
30        // Read the network ID.
31        let network_id = FromBytes::read_le(&mut reader)?;
32        // Read the program ID.
33        let program_id = FromBytes::read_le(&mut reader)?;
34        // Read the function name.
35        let function_name = FromBytes::read_le(&mut reader)?;
36
37        // Read the number of inputs.
38        let inputs_len = u16::read_le(&mut reader)?;
39        // Read the input IDs.
40        let input_ids = (0..inputs_len).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
41        // Read the inputs.
42        let inputs = (0..inputs_len).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
43
44        // Read the signature.
45        let signature = FromBytes::read_le(&mut reader)?;
46        // Read the tag secret key.
47        let sk_tag = FromBytes::read_le(&mut reader)?;
48        // Read the transition view key.
49        let tvk = FromBytes::read_le(&mut reader)?;
50        // Read the transition commitment.
51        let tcm = FromBytes::read_le(&mut reader)?;
52        // Read the signer commitment.
53        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    /// Writes the request to a buffer.
73    fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
74        // Write the version.
75        1u8.write_le(&mut writer)?;
76
77        // Write the signer.
78        self.signer.write_le(&mut writer)?;
79        // Write the network ID.
80        self.network_id.write_le(&mut writer)?;
81        // Write the program ID.
82        self.program_id.write_le(&mut writer)?;
83        // Write the function name.
84        self.function_name.write_le(&mut writer)?;
85
86        // Ensure the input IDs and inputs are the same length.
87        if self.input_ids.len() != self.inputs.len() {
88            return Err(error("Invalid request: mismatching number of input IDs and inputs"));
89        }
90
91        // Write the number of inputs.
92        u16::try_from(self.input_ids.len())
93            .or_halt_with::<N>("Request inputs length exceeds u16")
94            .write_le(&mut writer)?;
95        // Write the input IDs.
96        for input_id in &self.input_ids {
97            input_id.write_le(&mut writer)?;
98        }
99        // Write the inputs.
100        for input in &self.inputs {
101            input.write_le(&mut writer)?;
102        }
103
104        // Write the signature.
105        self.signature.write_le(&mut writer)?;
106        // Write the tag secret key.
107        self.sk_tag.write_le(&mut writer)?;
108        // Write the transition view key.
109        self.tvk.write_le(&mut writer)?;
110        // Write the transition commitment.
111        self.tcm.write_le(&mut writer)?;
112        // Write the signer commitment.
113        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            // Check the byte representation.
127            let expected_bytes = expected.to_bytes_le().unwrap();
128            assert_eq!(expected, Request::read_le(&expected_bytes[..]).unwrap());
129        }
130    }
131}