arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
Added benchmark
Uma Roy uma.roy.us@gmail.com
Tue, 10 Oct 2023 22:54:16 -0700
commit

90e2f5f1b14c564954fec428ff058abae68c513b

parent

1c0235b35adf12ee1912d601c17c387a028be5e3

3 files changed, 48 insertions(+), 5 deletions(-)

jump to
A goldilocks/.gitignore

@@ -0,0 +1,1 @@

+gnark.pprof
M goldilocks/base.go → goldilocks/base.go

@@ -77,12 +77,14 @@ }

// The chip used for Goldilocks field operations. type GoldilocksApi struct { - api frontend.API + api frontend.API + rangeChecker frontend.Rangechecker } // Creates a new Goldilocks chip. func NewGoldilocksApi(api frontend.API) *GoldilocksApi { - return &GoldilocksApi{api: api} + rangeChecker := rangecheck.New(api) + return &GoldilocksApi{api: api, rangeChecker: rangeChecker} } // Adds two field elements such that x + y = z within the Golidlocks field.

@@ -182,8 +184,7 @@ panic(err)

} quotient := result[0] - rangeCheckNbBits := RANGE_CHECK_NB_BITS - p.api.ToBinary(quotient, rangeCheckNbBits) + p.rangeChecker.Check(quotient, RANGE_CHECK_NB_BITS) remainder := NewVariable(result[1]) p.RangeCheck(remainder)

@@ -205,7 +206,7 @@ panic(err)

} quotient := result[0] - p.api.ToBinary(quotient, int(maxNbBits)) + p.rangeChecker.Check(quotient, int(maxNbBits)) remainder := NewVariable(result[1]) p.RangeCheck(remainder)
M goldilocks/base_test.go → goldilocks/base_test.go

@@ -1,12 +1,16 @@

package goldilocks import ( + "fmt" "math/big" + "os" "testing" "github.com/consensys/gnark-crypto/ecc" "github.com/consensys/gnark/backend" "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/frontend/cs/scs" + "github.com/consensys/gnark/profile" "github.com/consensys/gnark/test" )

@@ -37,6 +41,43 @@ one := big.NewInt(1)

maxValidVal := new(big.Int).Sub(MODULUS, one) witness.X = maxValidVal assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16)) +} + +type TestGoldilocksRangeCheckBenchmarkCircuit struct { + X []frontend.Variable +} + +func (c *TestGoldilocksRangeCheckBenchmarkCircuit) Define(api frontend.API) error { + glApi := NewGoldilocksApi(api) + for _, x := range c.X { + glApi.RangeCheck(NewVariable(x)) + } + return nil +} + +func BenchmarkGoldilocksRangeCheck(b *testing.B) { + var sizes = []int{5, 10, 15} + for i := 0; i < len(sizes); i++ { + var circuit, witness TestGoldilocksRangeCheckBenchmarkCircuit + circuit.X = make([]frontend.Variable, 2<<sizes[i]) + witness.X = make([]frontend.Variable, 2<<sizes[i]) + for j := 0; j < len(circuit.X); j++ { + witness.X[j] = 1 + } + p := profile.Start() + r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), scs.NewBuilder, &circuit) + if err != nil { + fmt.Println("error in building circuit", err) + os.Exit(1) + } + p.Stop() + p.Top() + println("r1cs.GetNbCoefficients(): ", r1cs.GetNbCoefficients()) + println("r1cs.GetNbConstraints(): ", r1cs.GetNbConstraints()) + println("r1cs.GetNbSecretVariables(): ", r1cs.GetNbSecretVariables()) + println("r1cs.GetNbPublicVariables(): ", r1cs.GetNbPublicVariables()) + println("r1cs.GetNbInternalVariables(): ", r1cs.GetNbInternalVariables()) + } } type TestGoldilocksMulAddCircuit struct {