github.com/consensys/gnark@v0.11.0/internal/backend/circuits/commit.go (about)

     1  package circuits
     2  
     3  import (
     4  	"github.com/consensys/gnark-crypto/ecc"
     5  	"github.com/consensys/gnark-crypto/ecc/bn254"
     6  	"github.com/consensys/gnark/frontend"
     7  )
     8  
     9  type commitCircuit struct {
    10  	Public frontend.Variable `gnark:",public"`
    11  	X      frontend.Variable
    12  }
    13  
    14  func (circuit *commitCircuit) Define(api frontend.API) error {
    15  	api.AssertIsDifferent(circuit.Public, 0)
    16  	commitment, err := api.(frontend.Committer).Commit(circuit.X, circuit.Public, 5)
    17  	if err != nil {
    18  		return err
    19  	}
    20  	api.AssertIsDifferent(commitment, 0)
    21  	a := api.Mul(circuit.X, circuit.X)
    22  	for i := 0; i < 10; i++ {
    23  		a = api.Mul(a, circuit.X)
    24  	}
    25  	c := api.Add(a, circuit.X)
    26  	api.AssertIsDifferent(c, a)
    27  	return nil
    28  }
    29  
    30  type noCommitCircuit struct {
    31  	Public frontend.Variable `gnark:",public"`
    32  	X      frontend.Variable
    33  }
    34  
    35  func (circuit *noCommitCircuit) Define(api frontend.API) error {
    36  	api.AssertIsDifferent(circuit.Public, 0)
    37  	a := api.Mul(circuit.X, circuit.X)
    38  	for i := 0; i < 10; i++ {
    39  		a = api.Mul(a, circuit.X)
    40  	}
    41  	c := api.Add(a, circuit.X)
    42  	api.AssertIsDifferent(c, a)
    43  	return nil
    44  }
    45  
    46  func init() {
    47  	// need to have separate test cases as the hash-to-field for PLONK and Groth16 verifiers are different
    48  	addEntry(
    49  		"commit",
    50  		&commitCircuit{}, &commitCircuit{Public: 16, X: 3}, &commitCircuit{Public: 0, X: 4},
    51  		[]ecc.ID{bn254.ID})
    52  	addEntry(
    53  		"no_commit",
    54  		&noCommitCircuit{}, &noCommitCircuit{Public: 16, X: 3}, &noCommitCircuit{Public: 0, X: 4},
    55  		[]ecc.ID{bn254.ID})
    56  }