arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/goldilocks/base_test.go
goldilocks/base_test.goRaw
  1package goldilocks
  2
  3import (
  4	"fmt"
  5	"math/big"
  6	"os"
  7	"testing"
  8
  9	"github.com/consensys/gnark-crypto/ecc"
 10	"github.com/consensys/gnark/backend"
 11	"github.com/consensys/gnark/frontend"
 12	"github.com/consensys/gnark/frontend/cs/scs"
 13	"github.com/consensys/gnark/profile"
 14	"github.com/consensys/gnark/test"
 15)
 16
 17type TestGoldilocksRangeCheckCircuit struct {
 18	X frontend.Variable
 19}
 20
 21func (c *TestGoldilocksRangeCheckCircuit) Define(api frontend.API) error {
 22	glApi := NewGoldilocksApi(api)
 23	glApi.RangeCheck(NewVariable(c.X))
 24	return nil
 25}
 26func TestGoldilocksRangeCheck(t *testing.T) {
 27	assert := test.NewAssert(t)
 28
 29	var circuit, witness TestGoldilocksRangeCheckCircuit
 30
 31	witness.X = 1
 32	assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoSerializationChecks())
 33
 34	witness.X = 0
 35	assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoSerializationChecks())
 36
 37	witness.X = MODULUS
 38	assert.ProverFailed(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoSerializationChecks())
 39
 40	one := big.NewInt(1)
 41	maxValidVal := new(big.Int).Sub(MODULUS, one)
 42	witness.X = maxValidVal
 43	assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16))
 44}
 45
 46type TestGoldilocksRangeCheckBenchmarkCircuit struct {
 47	X []frontend.Variable
 48}
 49
 50func (c *TestGoldilocksRangeCheckBenchmarkCircuit) Define(api frontend.API) error {
 51	glApi := NewGoldilocksApi(api)
 52	for _, x := range c.X {
 53		glApi.RangeCheck(NewVariable(x))
 54	}
 55	return nil
 56}
 57
 58func BenchmarkGoldilocksRangeCheck(b *testing.B) {
 59	var sizes = []int{5, 10, 15}
 60	for i := 0; i < len(sizes); i++ {
 61		var circuit, witness TestGoldilocksRangeCheckBenchmarkCircuit
 62		circuit.X = make([]frontend.Variable, 2<<sizes[i])
 63		witness.X = make([]frontend.Variable, 2<<sizes[i])
 64		for j := 0; j < len(circuit.X); j++ {
 65			witness.X[j] = 1
 66		}
 67		p := profile.Start()
 68		r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), scs.NewBuilder, &circuit)
 69		if err != nil {
 70			fmt.Println("error in building circuit", err)
 71			os.Exit(1)
 72		}
 73		p.Stop()
 74		p.Top()
 75		println("r1cs.GetNbCoefficients(): ", r1cs.GetNbCoefficients())
 76		println("r1cs.GetNbConstraints(): ", r1cs.GetNbConstraints())
 77		println("r1cs.GetNbSecretVariables(): ", r1cs.GetNbSecretVariables())
 78		println("r1cs.GetNbPublicVariables(): ", r1cs.GetNbPublicVariables())
 79		println("r1cs.GetNbInternalVariables(): ", r1cs.GetNbInternalVariables())
 80	}
 81}
 82
 83type TestGoldilocksMulAddCircuit struct {
 84	X, Y, Z        frontend.Variable
 85	ExpectedResult frontend.Variable
 86}
 87
 88func (c *TestGoldilocksMulAddCircuit) Define(api frontend.API) error {
 89	glApi := NewGoldilocksApi(api)
 90	calculateValue := glApi.MulAdd(NewVariable(c.X), NewVariable(c.Y), NewVariable(c.Z))
 91	api.AssertIsEqual(calculateValue.Limb, c.ExpectedResult)
 92	return nil
 93}
 94
 95func TestGoldilocksMulAdd(t *testing.T) {
 96	assert := test.NewAssert(t)
 97
 98	var circuit, witness TestGoldilocksMulAddCircuit
 99
100	witness.X = 1
101	witness.Y = 2
102	witness.Z = 3
103	witness.ExpectedResult = 5
104	assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoFuzzing())
105
106	bigOperand := new(big.Int).SetUint64(9223372036854775808)
107	expectedValue, _ := new(big.Int).SetString("18446744068340842500", 10)
108
109	witness.X = bigOperand
110	witness.Y = bigOperand
111	witness.Z = 3
112	witness.ExpectedResult = expectedValue
113	assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoFuzzing())
114}