snarkvm_console_types_field/
from_bits.rs1use super::*;
17
18impl<E: Environment> FromBits for Field<E> {
19 fn from_bits_le(bits_le: &[bool]) -> Result<Self> {
23 let size_in_data_bits = Field::<E>::size_in_data_bits();
25 let size_in_bits = Field::<E>::size_in_bits();
26
27 let num_bits = bits_le.len();
29 if num_bits > size_in_bits {
30 let should_be_zero = bits_le[size_in_bits..].iter().fold(false, |acc, bit| acc | bit);
32 ensure!(!should_be_zero, "The excess bits are not zero.");
34 }
35
36 if num_bits > size_in_data_bits {
38 let field = E::BigInteger::from_bits_le(&bits_le[..size_in_bits])?;
42
43 ensure!(field < E::Field::modulus(), "The field is greater than or equal to the modulus.");
45
46 Ok(Field { field: E::Field::from_bigint(field).ok_or_else(|| anyhow!("Invalid field from bits"))? })
48 } else {
49 let mut sanitized_bits = vec![false; size_in_bits];
51 sanitized_bits[..num_bits].copy_from_slice(bits_le);
54
55 let field = E::Field::from_bigint(E::BigInteger::from_bits_le(&sanitized_bits)?)
57 .ok_or_else(|| anyhow!("Invalid field from bits"))?;
58
59 Ok(Field { field })
61 }
62 }
63
64 fn from_bits_be(bits_be: &[bool]) -> Result<Self> {
66 let mut bits_le = bits_be.to_vec();
69 bits_le.reverse();
70
71 Self::from_bits_le(&bits_le)
72 }
73}
74
75#[cfg(test)]
76mod tests {
77 use super::*;
78 use snarkvm_console_network_environment::Console;
79
80 type CurrentEnvironment = Console;
81
82 const ITERATIONS: usize = 100;
83
84 fn check_from_bits_le() -> Result<()> {
85 let mut rng = TestRng::default();
86
87 for i in 0..ITERATIONS {
88 let expected: Field<CurrentEnvironment> = Uniform::rand(&mut rng);
90 let given_bits = expected.to_bits_le();
91 assert_eq!(Field::<CurrentEnvironment>::size_in_bits(), given_bits.len());
92
93 let candidate = Field::<CurrentEnvironment>::from_bits_le(&given_bits)?;
94 assert_eq!(expected, candidate);
95
96 let candidate = [given_bits, vec![false; i]].concat();
98
99 let candidate = Field::<CurrentEnvironment>::from_bits_le(&candidate)?;
100 assert_eq!(expected, candidate);
101 assert_eq!(Field::<CurrentEnvironment>::size_in_bits(), candidate.to_bits_le().len());
102 }
103 Ok(())
104 }
105
106 fn check_from_bits_be() -> Result<()> {
107 let mut rng = TestRng::default();
108
109 for i in 0..ITERATIONS {
110 let expected: Field<CurrentEnvironment> = Uniform::rand(&mut rng);
112 let given_bits = expected.to_bits_be();
113 assert_eq!(Field::<CurrentEnvironment>::size_in_bits(), given_bits.len());
114
115 let candidate = Field::<CurrentEnvironment>::from_bits_be(&given_bits)?;
116 assert_eq!(expected, candidate);
117
118 let candidate = [vec![false; i], given_bits].concat();
120
121 let candidate = Field::<CurrentEnvironment>::from_bits_be(&candidate)?;
122 assert_eq!(expected, candidate);
123 assert_eq!(Field::<CurrentEnvironment>::size_in_bits(), candidate.to_bits_be().len());
124 }
125 Ok(())
126 }
127
128 #[test]
129 fn test_from_bits_le() -> Result<()> {
130 check_from_bits_le()
131 }
132
133 #[test]
134 fn test_from_bits_be() -> Result<()> {
135 check_from_bits_be()
136 }
137}