1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
use snarkvm_fields::{FieldParameters, PrimeField, ToConstraintField};
use snarkvm_r1cs::{errors::SynthesisError, ConstraintSystem};
use crate::{
bits::{Boolean, ToBitsBEGadget},
fields::FpGadget,
integers::int::*,
traits::{alloc::AllocGadget, eq::EqGadget, integers::Integer},
};
macro_rules! alloc_input_fe {
($($gadget: ident)*) => ($(
impl $gadget {
pub fn alloc_input_fe<F, CS>(mut cs: CS, value: <$gadget as Integer>::IntegerType) -> Result<Self, SynthesisError>
where
F: PrimeField,
CS: ConstraintSystem<F>,
{
let value_bytes = value.to_le_bytes();
let field_elements: Vec<F> = ToConstraintField::<F>::to_field_elements(&value_bytes[..]).unwrap();
let max_size = 8 * (F::Parameters::CAPACITY / 8) as usize;
let mut allocated_bits = Vec::new();
for (i, field_element) in field_elements.into_iter().enumerate() {
let fe = FpGadget::alloc_input(&mut cs.ns(|| format!("Field element {}", i)), || Ok(field_element))?;
let mut fe_bits = fe.to_bits_be(cs.ns(|| format!("Convert fe to bits {}", i)))?;
fe_bits.reverse();
allocated_bits.extend_from_slice(&fe_bits[0..max_size]);
}
for (i, bit) in allocated_bits.iter().skip(<$gadget as Integer>::SIZE).enumerate() {
bit.enforce_equal(&mut cs.ns(|| format!("bit {} is false", i + <$gadget as Integer>::SIZE)), &Boolean::constant(false))?;
}
let bits = allocated_bits[0..<$gadget as Integer>::SIZE].to_vec();
Ok(Self {
bits,
value: Some(value),
})
}
}
)*)
}
alloc_input_fe!(Int8 Int16 Int32 Int64 Int128);