/ console / program / src / data / literal / bytes.rs
bytes.rs
  1  // Copyright (c) 2025-2026 ACDC Network
  2  // This file is part of the alphavm library.
  3  //
  4  // Alpha Chain | Delta Chain Protocol
  5  // International Monetary Graphite.
  6  //
  7  // Derived from Aleo (https://aleo.org) and ProvableHQ (https://provable.com).
  8  // They built world-class ZK infrastructure. We installed the EASY button.
  9  // Their cryptography: elegant. Our modifications: bureaucracy-compatible.
 10  // Original brilliance: theirs. Robert's Rules: ours. Bugs: definitely ours.
 11  //
 12  // Original Aleo/ProvableHQ code subject to Apache 2.0 https://www.apache.org/licenses/LICENSE-2.0
 13  // All modifications and new work: CC0 1.0 Universal Public Domain Dedication.
 14  // No rights reserved. No permission required. No warranty. No refunds.
 15  //
 16  // https://creativecommons.org/publicdomain/zero/1.0/
 17  // SPDX-License-Identifier: CC0-1.0
 18  
 19  use super::*;
 20  
 21  impl<N: Network> FromBytes for Literal<N> {
 22      /// Reads the literal from a buffer.
 23      fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
 24          let index = u16::read_le(&mut reader)?;
 25          let literal = match index {
 26              0 => Self::Address(Address::read_le(&mut reader)?),
 27              1 => Self::Boolean(Boolean::read_le(&mut reader)?),
 28              2 => Self::Field(Field::read_le(&mut reader)?),
 29              3 => Self::Group(Group::read_le(&mut reader)?),
 30              4 => Self::I8(I8::read_le(&mut reader)?),
 31              5 => Self::I16(I16::read_le(&mut reader)?),
 32              6 => Self::I32(I32::read_le(&mut reader)?),
 33              7 => Self::I64(I64::read_le(&mut reader)?),
 34              8 => Self::I128(I128::read_le(&mut reader)?),
 35              9 => Self::U8(U8::read_le(&mut reader)?),
 36              10 => Self::U16(U16::read_le(&mut reader)?),
 37              11 => Self::U32(U32::read_le(&mut reader)?),
 38              12 => Self::U64(U64::read_le(&mut reader)?),
 39              13 => Self::U128(U128::read_le(&mut reader)?),
 40              14 => Self::Scalar(Scalar::read_le(&mut reader)?),
 41              15 => Self::Signature(Box::new(Signature::read_le(&mut reader)?)),
 42              16 => Self::String(StringType::read_le(&mut reader)?),
 43              17.. => return Err(error(format!("Failed to decode literal variant {index}"))),
 44          };
 45          Ok(literal)
 46      }
 47  }
 48  
 49  impl<N: Network> ToBytes for Literal<N> {
 50      /// Writes the literal to a buffer.
 51      fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
 52          type Size = u16;
 53          match self {
 54              Self::Address(primitive) => {
 55                  (0 as Size).write_le(&mut writer)?;
 56                  primitive.write_le(&mut writer)
 57              }
 58              Self::Boolean(primitive) => {
 59                  (1 as Size).write_le(&mut writer)?;
 60                  primitive.write_le(&mut writer)
 61              }
 62              Self::Field(primitive) => {
 63                  (2 as Size).write_le(&mut writer)?;
 64                  primitive.write_le(&mut writer)
 65              }
 66              Self::Group(primitive) => {
 67                  (3 as Size).write_le(&mut writer)?;
 68                  primitive.write_le(&mut writer)
 69              }
 70              Self::I8(primitive) => {
 71                  (4 as Size).write_le(&mut writer)?;
 72                  primitive.write_le(&mut writer)
 73              }
 74              Self::I16(primitive) => {
 75                  (5 as Size).write_le(&mut writer)?;
 76                  primitive.write_le(&mut writer)
 77              }
 78              Self::I32(primitive) => {
 79                  (6 as Size).write_le(&mut writer)?;
 80                  primitive.write_le(&mut writer)
 81              }
 82              Self::I64(primitive) => {
 83                  (7 as Size).write_le(&mut writer)?;
 84                  primitive.write_le(&mut writer)
 85              }
 86              Self::I128(primitive) => {
 87                  (8 as Size).write_le(&mut writer)?;
 88                  primitive.write_le(&mut writer)
 89              }
 90              Self::U8(primitive) => {
 91                  (9 as Size).write_le(&mut writer)?;
 92                  primitive.write_le(&mut writer)
 93              }
 94              Self::U16(primitive) => {
 95                  (10 as Size).write_le(&mut writer)?;
 96                  primitive.write_le(&mut writer)
 97              }
 98              Self::U32(primitive) => {
 99                  (11 as Size).write_le(&mut writer)?;
100                  primitive.write_le(&mut writer)
101              }
102              Self::U64(primitive) => {
103                  (12 as Size).write_le(&mut writer)?;
104                  primitive.write_le(&mut writer)
105              }
106              Self::U128(primitive) => {
107                  (13 as Size).write_le(&mut writer)?;
108                  primitive.write_le(&mut writer)
109              }
110              Self::Scalar(primitive) => {
111                  (14 as Size).write_le(&mut writer)?;
112                  primitive.write_le(&mut writer)
113              }
114              Self::Signature(primitive) => {
115                  (15 as Size).write_le(&mut writer)?;
116                  primitive.write_le(&mut writer)
117              }
118              Self::String(primitive) => {
119                  (16 as Size).write_le(&mut writer)?;
120                  primitive.write_le(&mut writer)
121              }
122          }
123      }
124  }
125  
126  #[cfg(test)]
127  mod tests {
128      use super::*;
129      use alphavm_console_network::MainnetV0;
130  
131      type CurrentNetwork = MainnetV0;
132  
133      const ITERATIONS: u32 = 1000;
134  
135      fn check_bytes(expected: Literal<CurrentNetwork>) -> Result<()> {
136          // Check the byte representation.
137          let expected_bytes = expected.to_bytes_le()?;
138          assert_eq!(expected, Literal::read_le(&expected_bytes[..])?);
139          Ok(())
140      }
141  
142      #[test]
143      fn test_bytes() -> Result<()> {
144          let rng = &mut TestRng::default();
145  
146          for _ in 0..ITERATIONS {
147              let private_key = alphavm_console_account::PrivateKey::<CurrentNetwork>::new(rng)?;
148  
149              // Address
150              check_bytes(Literal::<CurrentNetwork>::Address(Address::try_from(private_key)?))?;
151              // Boolean
152              check_bytes(Literal::<CurrentNetwork>::Boolean(Boolean::new(Uniform::rand(rng))))?;
153              // Field
154              check_bytes(Literal::<CurrentNetwork>::Field(Uniform::rand(rng)))?;
155              // Group
156              check_bytes(Literal::<CurrentNetwork>::Group(Uniform::rand(rng)))?;
157              // I8
158              check_bytes(Literal::<CurrentNetwork>::I8(I8::new(Uniform::rand(rng))))?;
159              // I16
160              check_bytes(Literal::<CurrentNetwork>::I16(I16::new(Uniform::rand(rng))))?;
161              // I32
162              check_bytes(Literal::<CurrentNetwork>::I32(I32::new(Uniform::rand(rng))))?;
163              // I64
164              check_bytes(Literal::<CurrentNetwork>::I64(I64::new(Uniform::rand(rng))))?;
165              // I128
166              check_bytes(Literal::<CurrentNetwork>::I128(I128::new(Uniform::rand(rng))))?;
167              // U8
168              check_bytes(Literal::<CurrentNetwork>::U8(U8::new(Uniform::rand(rng))))?;
169              // U16
170              check_bytes(Literal::<CurrentNetwork>::U16(U16::new(Uniform::rand(rng))))?;
171              // U32
172              check_bytes(Literal::<CurrentNetwork>::U32(U32::new(Uniform::rand(rng))))?;
173              // U64
174              check_bytes(Literal::<CurrentNetwork>::U64(U64::new(Uniform::rand(rng))))?;
175              // U128
176              check_bytes(Literal::<CurrentNetwork>::U128(U128::new(Uniform::rand(rng))))?;
177              // Scalar
178              check_bytes(Literal::<CurrentNetwork>::Scalar(Uniform::rand(rng)))?;
179              // Signature
180              check_bytes(Literal::sample(LiteralType::Signature, rng))?;
181              // String
182              check_bytes(Literal::<CurrentNetwork>::String(StringType::rand(rng)))?;
183          }
184          Ok(())
185      }
186  }