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 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 := NewGoldilocksApi(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}