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  }