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 := New(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 := New(api)
 52	for _, x := range c.X {
 53		glApi.RangeCheck(NewVariable(x))
 54		glApi.Reduce(NewVariable(x))
 55
 56	}
 57	return nil
 58}
 59
 60func BenchmarkGoldilocksRangeCheck(b *testing.B) {
 61	var sizes = []int{5, 10, 15}
 62	for i := 0; i < len(sizes); i++ {
 63		var circuit, witness TestGoldilocksRangeCheckBenchmarkCircuit
 64		circuit.X = make([]frontend.Variable, 2<<sizes[i])
 65		witness.X = make([]frontend.Variable, 2<<sizes[i])
 66		for j := 0; j < len(circuit.X); j++ {
 67			witness.X[j] = 1
 68		}
 69		p := profile.Start()
 70		r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), scs.NewBuilder, &circuit)
 71		if err != nil {
 72			fmt.Println("error in building circuit", err)
 73			os.Exit(1)
 74		}
 75		p.Stop()
 76		p.Top()
 77		println("r1cs.GetNbCoefficients(): ", r1cs.GetNbCoefficients())
 78		println("r1cs.GetNbConstraints(): ", r1cs.GetNbConstraints())
 79		println("r1cs.GetNbSecretVariables(): ", r1cs.GetNbSecretVariables())
 80		println("r1cs.GetNbPublicVariables(): ", r1cs.GetNbPublicVariables())
 81		println("r1cs.GetNbInternalVariables(): ", r1cs.GetNbInternalVariables())
 82	}
 83}
 84
 85type TestGoldilocksMulAddCircuit struct {
 86	X, Y, Z        frontend.Variable
 87	ExpectedResult frontend.Variable
 88}
 89
 90func (c *TestGoldilocksMulAddCircuit) Define(api frontend.API) error {
 91	glApi := New(api)
 92	calculateValue := glApi.MulAdd(NewVariable(c.X), NewVariable(c.Y), NewVariable(c.Z))
 93	api.AssertIsEqual(calculateValue.Limb, c.ExpectedResult)
 94	return nil
 95}
 96
 97func TestGoldilocksMulAdd(t *testing.T) {
 98	assert := test.NewAssert(t)
 99
100	var circuit, witness TestGoldilocksMulAddCircuit
101
102	witness.X = 1
103	witness.Y = 2
104	witness.Z = 3
105	witness.ExpectedResult = 5
106	assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoFuzzing())
107
108	bigOperand := new(big.Int).SetUint64(9223372036854775808)
109	expectedValue, _ := new(big.Int).SetString("18446744068340842500", 10)
110
111	witness.X = bigOperand
112	witness.Y = bigOperand
113	witness.Z = 3
114	witness.ExpectedResult = expectedValue
115	assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoFuzzing())
116}