snarkvm_console_program/data/literal/
from_bits.rs1use super::*;
17
18impl<N: Network> Literal<N> {
19 pub fn from_bits_le(variant: u8, bits_le: &[bool]) -> Result<Self> {
21 let literal = bits_le;
22 let literal = match variant {
23 0 => Literal::Address(Address::new(Group::from_x_coordinate(Field::<N>::from_bits_le(literal)?)?)),
24 1 => match bits_le.len() {
25 1 => Literal::Boolean(Boolean::new(literal[0])),
26 _ => bail!("Expected a boolean literal, but found a list of {} bits.", bits_le.len()),
27 },
28 2 => Literal::Field(Field::from_bits_le(literal)?),
29 3 => Literal::Group(Group::from_bits_le(literal)?),
30 4 => Literal::I8(I8::from_bits_le(literal)?),
31 5 => Literal::I16(I16::from_bits_le(literal)?),
32 6 => Literal::I32(I32::from_bits_le(literal)?),
33 7 => Literal::I64(I64::from_bits_le(literal)?),
34 8 => Literal::I128(I128::from_bits_le(literal)?),
35 9 => Literal::U8(U8::from_bits_le(literal)?),
36 10 => Literal::U16(U16::from_bits_le(literal)?),
37 11 => Literal::U32(U32::from_bits_le(literal)?),
38 12 => Literal::U64(U64::from_bits_le(literal)?),
39 13 => Literal::U128(U128::from_bits_le(literal)?),
40 14 => Literal::Scalar(Scalar::from_bits_le(literal)?),
41 15 => Literal::Signature(Box::new(Signature::from_bits_le(literal)?)),
42 16 => {
43 let buffer = Vec::<u8>::from_bits_le(literal)?;
44 match buffer.len() <= N::MAX_STRING_BYTES as usize {
45 true => {
46 let string = String::from_utf8(buffer).map_err(|e| error(format!("{e}")))?;
47 Self::String(StringType::new(&string))
48 }
49 false => bail!("String literal exceeds maximum length of {} bytes.", N::MAX_STRING_BYTES),
50 }
51 }
52 17 => Literal::Identifier(Box::new(IdentifierLiteral::from_bits_le(literal)?)),
53 18.. => bail!("Failed to initialize literal variant {variant} from bits (LE)"),
54 };
55 Ok(literal)
56 }
57
58 pub fn from_bits_be(variant: u8, bits_be: &[bool]) -> Result<Self> {
60 let literal = bits_be;
61 let literal = match variant {
62 0 => Literal::Address(Address::new(Group::from_x_coordinate(Field::from_bits_be(literal)?)?)),
63 1 => match bits_be.len() {
64 1 => Literal::Boolean(Boolean::new(literal[0])),
65 _ => bail!("Expected a boolean literal, but found a list of {} bits.", bits_be.len()),
66 },
67 2 => Literal::Field(Field::from_bits_be(literal)?),
68 3 => Literal::Group(Group::from_bits_be(literal)?),
69 4 => Literal::I8(I8::from_bits_be(literal)?),
70 5 => Literal::I16(I16::from_bits_be(literal)?),
71 6 => Literal::I32(I32::from_bits_be(literal)?),
72 7 => Literal::I64(I64::from_bits_be(literal)?),
73 8 => Literal::I128(I128::from_bits_be(literal)?),
74 9 => Literal::U8(U8::from_bits_be(literal)?),
75 10 => Literal::U16(U16::from_bits_be(literal)?),
76 11 => Literal::U32(U32::from_bits_be(literal)?),
77 12 => Literal::U64(U64::from_bits_be(literal)?),
78 13 => Literal::U128(U128::from_bits_be(literal)?),
79 14 => Literal::Scalar(Scalar::from_bits_be(literal)?),
80 15 => Literal::Signature(Box::new(Signature::from_bits_be(literal)?)),
81 16 => {
82 let buffer = Vec::<u8>::from_bits_be(literal)?;
83 match buffer.len() <= N::MAX_STRING_BYTES as usize {
84 true => {
85 let string = String::from_utf8(buffer).map_err(|e| error(format!("{e}")))?;
86 Self::String(StringType::new(&string))
87 }
88 false => bail!("String literal exceeds maximum length of {} bytes.", N::MAX_STRING_BYTES),
89 }
90 }
91 17 => Literal::Identifier(Box::new(IdentifierLiteral::from_bits_be(literal)?)),
92 18.. => bail!("Failed to initialize literal variant {variant} from bits (BE)"),
93 };
94 Ok(literal)
95 }
96}
97
98#[cfg(test)]
99mod tests {
100 use super::*;
101 use snarkvm_console_network::MainnetV0;
102
103 type CurrentNetwork = MainnetV0;
104
105 const ITERATIONS: u32 = 1000;
106
107 fn check_serialization(expected: Literal<CurrentNetwork>) -> Result<()> {
108 println!("{expected}");
109 assert_eq!(expected, Literal::from_bits_le(expected.variant(), &expected.to_bits_le())?);
110 assert_eq!(expected, Literal::from_bits_be(expected.variant(), &expected.to_bits_be())?);
111 Ok(())
112 }
113
114 #[test]
115 fn test_from_bits() -> Result<()> {
116 let rng = &mut TestRng::default();
117
118 for _ in 0..ITERATIONS {
119 let private_key = snarkvm_console_account::PrivateKey::<CurrentNetwork>::new(rng)?;
120
121 check_serialization(Literal::<CurrentNetwork>::Address(Address::try_from(private_key)?))?;
123 check_serialization(Literal::<CurrentNetwork>::Boolean(Boolean::new(Uniform::rand(rng))))?;
125 check_serialization(Literal::<CurrentNetwork>::Field(Uniform::rand(rng)))?;
127 check_serialization(Literal::<CurrentNetwork>::Group(Uniform::rand(rng)))?;
129 check_serialization(Literal::<CurrentNetwork>::I8(I8::new(Uniform::rand(rng))))?;
131 check_serialization(Literal::<CurrentNetwork>::I16(I16::new(Uniform::rand(rng))))?;
133 check_serialization(Literal::<CurrentNetwork>::I32(I32::new(Uniform::rand(rng))))?;
135 check_serialization(Literal::<CurrentNetwork>::I64(I64::new(Uniform::rand(rng))))?;
137 check_serialization(Literal::<CurrentNetwork>::I128(I128::new(Uniform::rand(rng))))?;
139 check_serialization(Literal::<CurrentNetwork>::U8(U8::new(Uniform::rand(rng))))?;
141 check_serialization(Literal::<CurrentNetwork>::U16(U16::new(Uniform::rand(rng))))?;
143 check_serialization(Literal::<CurrentNetwork>::U32(U32::new(Uniform::rand(rng))))?;
145 check_serialization(Literal::<CurrentNetwork>::U64(U64::new(Uniform::rand(rng))))?;
147 check_serialization(Literal::<CurrentNetwork>::U128(U128::new(Uniform::rand(rng))))?;
149 check_serialization(Literal::<CurrentNetwork>::Scalar(Uniform::rand(rng)))?;
151 check_serialization(Literal::sample(LiteralType::Signature, rng))?;
153 let string = rng.next_string(CurrentNetwork::MAX_STRING_BYTES / 4, false);
156 check_serialization(Literal::<CurrentNetwork>::String(StringType::new(&string)))?;
157 }
158 Ok(())
159 }
160}