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  }