github.com/consensys/gnark@v0.11.0/internal/backend/circuits/boolean.go (about) 1 package circuits 2 3 import ( 4 "github.com/consensys/gnark/frontend" 5 ) 6 7 type checkAssertIsBooleanCircuit struct { 8 A, B, C, D frontend.Variable 9 } 10 11 func (circuit *checkAssertIsBooleanCircuit) Define(api frontend.API) error { 12 13 // simple variable 14 api.AssertIsBoolean(circuit.C) 15 16 // linear expression ADD 17 api.AssertIsBoolean(api.Add(circuit.A, circuit.B)) 18 19 // linear expression SUB 20 api.AssertIsBoolean(api.Sub(circuit.A, circuit.B)) 21 22 // mul by constant 23 api.AssertIsBoolean(api.Mul(circuit.D, 2)) 24 25 return nil 26 } 27 28 func init() { 29 30 good := []frontend.Circuit{ 31 &checkAssertIsBooleanCircuit{ 32 A: (0), 33 B: (0), 34 C: (1), 35 D: (0), 36 }, 37 &checkAssertIsBooleanCircuit{ 38 A: (0), 39 B: (0), 40 C: (0), 41 D: (0), 42 }, 43 &checkAssertIsBooleanCircuit{ 44 A: (1), 45 B: (0), 46 C: (1), 47 D: (0), 48 }, 49 &checkAssertIsBooleanCircuit{ 50 A: (1), 51 B: (0), 52 C: (0), 53 D: (0), 54 }, 55 } 56 57 bad := []frontend.Circuit{ 58 &checkAssertIsBooleanCircuit{ 59 A: (1), 60 B: (1), 61 C: (0), 62 D: (0), 63 }, 64 &checkAssertIsBooleanCircuit{ 65 A: (0), 66 B: (1), 67 C: (0), 68 D: (0), 69 }, 70 &checkAssertIsBooleanCircuit{ 71 A: (0), 72 B: (0), 73 C: (3), 74 D: (0), 75 }, 76 &checkAssertIsBooleanCircuit{ 77 A: (1), 78 B: (0), 79 C: (3), 80 D: (0), 81 }, 82 &checkAssertIsBooleanCircuit{ 83 A: (1), 84 B: (0), 85 C: (0), 86 D: (1), 87 }, 88 } 89 90 addNewEntry("assert_boolean", &checkAssertIsBooleanCircuit{}, good, bad, nil) 91 }