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 }