github.com/consensys/gnark@v0.11.0/internal/backend/circuits/range.go (about) 1 package circuits 2 3 import ( 4 "github.com/consensys/gnark/frontend" 5 ) 6 7 const bound = 44 8 9 type rangeCheckConstantCircuit struct { 10 X frontend.Variable 11 Y frontend.Variable `gnark:",public"` 12 } 13 14 func (circuit *rangeCheckConstantCircuit) Define(api frontend.API) error { 15 c1 := api.Mul(circuit.X, circuit.Y) 16 c2 := api.Mul(c1, circuit.Y) 17 c3 := api.Add(circuit.X, circuit.Y) 18 api.AssertIsLessOrEqual(c3, bound) // c3 is from a linear expression only 19 api.AssertIsLessOrEqual(c2, bound) 20 return nil 21 } 22 23 func rangeCheckConstant() { 24 var circuit, good, bad rangeCheckConstantCircuit 25 26 good.X = (4) 27 good.Y = (2) 28 29 bad.X = (11) 30 bad.Y = (4) 31 32 addEntry("range_constant", &circuit, &good, &bad, nil) 33 } 34 35 type rangeCheckCircuit struct { 36 X frontend.Variable 37 Y, Bound frontend.Variable `gnark:",public"` 38 } 39 40 func (circuit *rangeCheckCircuit) Define(api frontend.API) error { 41 c1 := api.Mul(circuit.X, circuit.Y) 42 c2 := api.Mul(c1, circuit.Y) 43 c3 := api.Add(circuit.X, circuit.Y) 44 api.AssertIsLessOrEqual(c2, circuit.Bound) 45 api.AssertIsLessOrEqual(c3, circuit.Bound) // c3 is from a linear expression only 46 47 return nil 48 } 49 50 func rangeCheck() { 51 52 var circuit, good, bad rangeCheckCircuit 53 54 good.X = (4) 55 good.Y = (2) 56 good.Bound = (bound) 57 58 bad.X = (11) 59 bad.Y = (4) 60 bad.Bound = (bound) 61 62 addEntry("range", &circuit, &good, &bad, nil) 63 } 64 65 func init() { 66 rangeCheckConstant() 67 rangeCheck() 68 }