Skip to main content

snarkvm_console_program/data/literal/
bytes.rs

1// Copyright (c) 2019-2026 Provable Inc.
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 Literal<N> {
19    /// Reads the literal from a buffer.
20    fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
21        let index = u16::read_le(&mut reader)?;
22        let literal = match index {
23            0 => Self::Address(Address::read_le(&mut reader)?),
24            1 => Self::Boolean(Boolean::read_le(&mut reader)?),
25            2 => Self::Field(Field::read_le(&mut reader)?),
26            3 => Self::Group(Group::read_le(&mut reader)?),
27            4 => Self::I8(I8::read_le(&mut reader)?),
28            5 => Self::I16(I16::read_le(&mut reader)?),
29            6 => Self::I32(I32::read_le(&mut reader)?),
30            7 => Self::I64(I64::read_le(&mut reader)?),
31            8 => Self::I128(I128::read_le(&mut reader)?),
32            9 => Self::U8(U8::read_le(&mut reader)?),
33            10 => Self::U16(U16::read_le(&mut reader)?),
34            11 => Self::U32(U32::read_le(&mut reader)?),
35            12 => Self::U64(U64::read_le(&mut reader)?),
36            13 => Self::U128(U128::read_le(&mut reader)?),
37            14 => Self::Scalar(Scalar::read_le(&mut reader)?),
38            15 => Self::Signature(Box::new(Signature::read_le(&mut reader)?)),
39            16 => Self::String(StringType::read_le(&mut reader)?),
40            17 => Self::Identifier(Box::new(IdentifierLiteral::read_le(&mut reader)?)),
41            18.. => return Err(error(format!("Failed to decode literal variant {index}"))),
42        };
43        Ok(literal)
44    }
45}
46
47impl<N: Network> ToBytes for Literal<N> {
48    /// Writes the literal to a buffer.
49    fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
50        type Size = u16;
51        match self {
52            Self::Address(primitive) => {
53                (0 as Size).write_le(&mut writer)?;
54                primitive.write_le(&mut writer)
55            }
56            Self::Boolean(primitive) => {
57                (1 as Size).write_le(&mut writer)?;
58                primitive.write_le(&mut writer)
59            }
60            Self::Field(primitive) => {
61                (2 as Size).write_le(&mut writer)?;
62                primitive.write_le(&mut writer)
63            }
64            Self::Group(primitive) => {
65                (3 as Size).write_le(&mut writer)?;
66                primitive.write_le(&mut writer)
67            }
68            Self::I8(primitive) => {
69                (4 as Size).write_le(&mut writer)?;
70                primitive.write_le(&mut writer)
71            }
72            Self::I16(primitive) => {
73                (5 as Size).write_le(&mut writer)?;
74                primitive.write_le(&mut writer)
75            }
76            Self::I32(primitive) => {
77                (6 as Size).write_le(&mut writer)?;
78                primitive.write_le(&mut writer)
79            }
80            Self::I64(primitive) => {
81                (7 as Size).write_le(&mut writer)?;
82                primitive.write_le(&mut writer)
83            }
84            Self::I128(primitive) => {
85                (8 as Size).write_le(&mut writer)?;
86                primitive.write_le(&mut writer)
87            }
88            Self::U8(primitive) => {
89                (9 as Size).write_le(&mut writer)?;
90                primitive.write_le(&mut writer)
91            }
92            Self::U16(primitive) => {
93                (10 as Size).write_le(&mut writer)?;
94                primitive.write_le(&mut writer)
95            }
96            Self::U32(primitive) => {
97                (11 as Size).write_le(&mut writer)?;
98                primitive.write_le(&mut writer)
99            }
100            Self::U64(primitive) => {
101                (12 as Size).write_le(&mut writer)?;
102                primitive.write_le(&mut writer)
103            }
104            Self::U128(primitive) => {
105                (13 as Size).write_le(&mut writer)?;
106                primitive.write_le(&mut writer)
107            }
108            Self::Scalar(primitive) => {
109                (14 as Size).write_le(&mut writer)?;
110                primitive.write_le(&mut writer)
111            }
112            Self::Signature(primitive) => {
113                (15 as Size).write_le(&mut writer)?;
114                primitive.write_le(&mut writer)
115            }
116            Self::String(primitive) => {
117                (16 as Size).write_le(&mut writer)?;
118                primitive.write_le(&mut writer)
119            }
120            Self::Identifier(primitive) => {
121                (17 as Size).write_le(&mut writer)?;
122                primitive.write_le(&mut writer)
123            }
124        }
125    }
126}
127
128#[cfg(test)]
129mod tests {
130    use super::*;
131    use snarkvm_console_network::MainnetV0;
132
133    type CurrentNetwork = MainnetV0;
134
135    const ITERATIONS: u32 = 1000;
136
137    fn check_bytes(expected: Literal<CurrentNetwork>) -> Result<()> {
138        // Check the byte representation.
139        let expected_bytes = expected.to_bytes_le()?;
140        assert_eq!(expected, Literal::read_le(&expected_bytes[..])?);
141        Ok(())
142    }
143
144    #[test]
145    fn test_bytes() -> Result<()> {
146        let rng = &mut TestRng::default();
147
148        for _ in 0..ITERATIONS {
149            let private_key = snarkvm_console_account::PrivateKey::<CurrentNetwork>::new(rng)?;
150
151            // Address
152            check_bytes(Literal::<CurrentNetwork>::Address(Address::try_from(private_key)?))?;
153            // Boolean
154            check_bytes(Literal::<CurrentNetwork>::Boolean(Boolean::new(Uniform::rand(rng))))?;
155            // Field
156            check_bytes(Literal::<CurrentNetwork>::Field(Uniform::rand(rng)))?;
157            // Group
158            check_bytes(Literal::<CurrentNetwork>::Group(Uniform::rand(rng)))?;
159            // I8
160            check_bytes(Literal::<CurrentNetwork>::I8(I8::new(Uniform::rand(rng))))?;
161            // I16
162            check_bytes(Literal::<CurrentNetwork>::I16(I16::new(Uniform::rand(rng))))?;
163            // I32
164            check_bytes(Literal::<CurrentNetwork>::I32(I32::new(Uniform::rand(rng))))?;
165            // I64
166            check_bytes(Literal::<CurrentNetwork>::I64(I64::new(Uniform::rand(rng))))?;
167            // I128
168            check_bytes(Literal::<CurrentNetwork>::I128(I128::new(Uniform::rand(rng))))?;
169            // U8
170            check_bytes(Literal::<CurrentNetwork>::U8(U8::new(Uniform::rand(rng))))?;
171            // U16
172            check_bytes(Literal::<CurrentNetwork>::U16(U16::new(Uniform::rand(rng))))?;
173            // U32
174            check_bytes(Literal::<CurrentNetwork>::U32(U32::new(Uniform::rand(rng))))?;
175            // U64
176            check_bytes(Literal::<CurrentNetwork>::U64(U64::new(Uniform::rand(rng))))?;
177            // U128
178            check_bytes(Literal::<CurrentNetwork>::U128(U128::new(Uniform::rand(rng))))?;
179            // Scalar
180            check_bytes(Literal::<CurrentNetwork>::Scalar(Uniform::rand(rng)))?;
181            // Signature
182            check_bytes(Literal::sample(LiteralType::Signature, rng))?;
183            // String
184            check_bytes(Literal::<CurrentNetwork>::String(StringType::rand(rng)))?;
185            // Identifier
186            check_bytes(Literal::<CurrentNetwork>::Identifier(Box::new(Uniform::rand(rng))))?;
187        }
188        Ok(())
189    }
190}