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}