from_bits.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<E: Environment, I: IntegerType> FromBits for Integer<E, I> { 22 /// Initializes a new integer from a list of **little-endian** bits. 23 fn from_bits_le(bits_le: &[bool]) -> Result<Self> { 24 Ok(Self::new(I::from_bits_le(bits_le)?)) 25 } 26 27 /// Initializes a new integer from a list of **big-endian** bits. 28 fn from_bits_be(bits_be: &[bool]) -> Result<Self> { 29 Ok(Self::new(I::from_bits_be(bits_be)?)) 30 } 31 } 32 33 #[cfg(test)] 34 mod tests { 35 use super::*; 36 use alphavm_console_network_environment::Console; 37 38 type CurrentEnvironment = Console; 39 40 const ITERATIONS: usize = 100; 41 42 fn check_from_bits_le<I: IntegerType>(rng: &mut TestRng) -> Result<()> { 43 for i in 0..ITERATIONS { 44 // Sample a random value. 45 let expected: I = Uniform::rand(rng); 46 47 let expected = Integer::<CurrentEnvironment, I>::new(expected); 48 let given_bits = expected.to_bits_le(); 49 assert_eq!(Integer::<CurrentEnvironment, I>::size_in_bits(), given_bits.len()); 50 51 let candidate = Integer::<CurrentEnvironment, I>::from_bits_le(&given_bits)?; 52 assert_eq!(expected, candidate); 53 54 // Add excess zero bits. 55 let candidate = [given_bits, vec![false; i]].concat(); 56 57 let candidate = Integer::<CurrentEnvironment, I>::from_bits_le(&candidate)?; 58 assert_eq!(expected, candidate); 59 assert_eq!(Integer::<CurrentEnvironment, I>::size_in_bits(), candidate.to_bits_le().len()); 60 } 61 Ok(()) 62 } 63 64 fn check_from_bits_be<I: IntegerType>(rng: &mut TestRng) -> Result<()> { 65 for i in 0..ITERATIONS { 66 // Sample a random value. 67 let expected: I = Uniform::rand(rng); 68 69 let expected = Integer::<CurrentEnvironment, I>::new(expected); 70 let given_bits = expected.to_bits_be(); 71 assert_eq!(Integer::<CurrentEnvironment, I>::size_in_bits(), given_bits.len()); 72 73 let candidate = Integer::<CurrentEnvironment, I>::from_bits_be(&given_bits)?; 74 assert_eq!(expected, candidate); 75 76 // Add excess zero bits. 77 let candidate = [vec![false; i], given_bits].concat(); 78 79 let candidate = Integer::<CurrentEnvironment, I>::from_bits_be(&candidate)?; 80 assert_eq!(expected, candidate); 81 assert_eq!(Integer::<CurrentEnvironment, I>::size_in_bits(), candidate.to_bits_be().len()); 82 } 83 Ok(()) 84 } 85 86 #[test] 87 fn test_from_bits_le() -> Result<()> { 88 let mut rng = TestRng::default(); 89 90 check_from_bits_le::<u8>(&mut rng)?; 91 check_from_bits_le::<u16>(&mut rng)?; 92 check_from_bits_le::<u32>(&mut rng)?; 93 check_from_bits_le::<u64>(&mut rng)?; 94 check_from_bits_le::<u128>(&mut rng)?; 95 96 check_from_bits_le::<i8>(&mut rng)?; 97 check_from_bits_le::<i16>(&mut rng)?; 98 check_from_bits_le::<i32>(&mut rng)?; 99 check_from_bits_le::<i64>(&mut rng)?; 100 check_from_bits_le::<i128>(&mut rng)?; 101 102 Ok(()) 103 } 104 105 #[test] 106 fn test_from_bits_be() -> Result<()> { 107 let mut rng = TestRng::default(); 108 109 check_from_bits_be::<u8>(&mut rng)?; 110 check_from_bits_be::<u16>(&mut rng)?; 111 check_from_bits_be::<u32>(&mut rng)?; 112 check_from_bits_be::<u64>(&mut rng)?; 113 check_from_bits_be::<u128>(&mut rng)?; 114 115 check_from_bits_be::<i8>(&mut rng)?; 116 check_from_bits_be::<i16>(&mut rng)?; 117 check_from_bits_be::<i32>(&mut rng)?; 118 check_from_bits_be::<i64>(&mut rng)?; 119 check_from_bits_be::<i128>(&mut rng)?; 120 121 Ok(()) 122 } 123 }