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 }