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  }