github.com/consensys/gnark@v0.11.0/internal/backend/circuits/orxorandmul.go (about) 1 package circuits 2 3 import ( 4 "github.com/consensys/gnark/frontend" 5 ) 6 7 // circuit designed to test if plonk compiler recognizes 8 // correctly constraints of the form a*b=c where a is 9 // marked as boolean constraint, but the constraint doesn't exist 10 // (it's the case for the result of a XOR, OR, AND for instance) 11 type orXoAndMulCircuit struct { 12 A, B frontend.Variable 13 } 14 15 func (circuit *orXoAndMulCircuit) Define(api frontend.API) error { 16 17 a := api.Xor(circuit.A, circuit.B) 18 b := api.Mul(a, circuit.A) 19 20 c := api.Or(circuit.A, circuit.B) 21 d := api.Mul(c, circuit.A) 22 23 e := api.Or(circuit.A, circuit.B) 24 f := api.Mul(e, circuit.A) 25 26 api.AssertIsBoolean(b) 27 api.AssertIsBoolean(d) 28 api.AssertIsBoolean(f) 29 30 return nil 31 } 32 33 func init() { 34 35 good := []frontend.Circuit{ 36 &orXoAndMulCircuit{ 37 A: (1), 38 B: (1), 39 }, 40 &orXoAndMulCircuit{ 41 A: (1), 42 B: (0), 43 }, 44 &orXoAndMulCircuit{ 45 A: (0), 46 B: (1), 47 }, 48 } 49 50 bad := []frontend.Circuit{ 51 &orXoAndMulCircuit{ 52 A: (0), 53 B: (2), 54 }, 55 &orXoAndMulCircuit{ 56 A: (2), 57 B: (0), 58 }, 59 &orXoAndMulCircuit{ 60 A: (1), 61 B: (2), 62 }, 63 } 64 65 addNewEntry("orXoAndMulCircuit", &orXoAndMulCircuit{}, good, bad, nil) 66 }