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
use crate::constraint_system::StandardComposer;
use crate::constraint_system::Variable;
use dusk_bls12_381::Scalar;
impl StandardComposer {
pub fn boolean_gate(&mut self, a: Variable) -> Variable {
self.w_l.push(a);
self.w_r.push(a);
self.w_o.push(a);
self.w_4.push(self.zero_var);
self.q_m.push(Scalar::one());
self.q_l.push(Scalar::zero());
self.q_r.push(Scalar::zero());
self.q_o.push(-Scalar::one());
self.q_c.push(Scalar::zero());
self.q_4.push(Scalar::zero());
self.q_arith.push(Scalar::one());
self.q_range.push(Scalar::zero());
self.q_logic.push(Scalar::zero());
self.q_ecc.push(Scalar::zero());
self.public_inputs.push(Scalar::zero());
self.perm
.add_variables_to_map(a, a, a, self.zero_var, self.n);
self.n += 1;
a
}
}
#[cfg(test)]
mod tests {
use super::super::helper::*;
use dusk_bls12_381::Scalar;
#[test]
fn test_correct_bool_gate() {
let res = gadget_tester(
|composer| {
let zero = composer.add_input(Scalar::zero());
let one = composer.add_input(Scalar::one());
composer.boolean_gate(zero);
composer.boolean_gate(one);
},
32,
);
assert!(res.is_ok())
}
#[test]
fn test_incorrect_bool_gate() {
let res = gadget_tester(
|composer| {
let zero = composer.add_input(Scalar::from(5));
let one = composer.add_input(Scalar::one());
composer.boolean_gate(zero);
composer.boolean_gate(one);
},
32,
);
assert!(res.is_err())
}
}