gnark-plonky2-verifier/goldilocks/base_test.go
goldilocks/base_test.goRaw
1package goldilocks
2
3import (
4 "math/big"
5 "testing"
6
7 "github.com/consensys/gnark-crypto/ecc"
8 "github.com/consensys/gnark/backend"
9 "github.com/consensys/gnark/frontend"
10 "github.com/consensys/gnark/test"
11)
12
13type TestGoldilocksRangeCheckCircuit struct {
14 X frontend.Variable
15}
16
17func (c *TestGoldilocksRangeCheckCircuit) Define(api frontend.API) error {
18 chip := NewChip(api)
19 chip.RangeCheck(NewVariable(c.X))
20 return nil
21}
22func TestGoldilocksRangeCheck(t *testing.T) {
23 assert := test.NewAssert(t)
24
25 var circuit, witness TestGoldilocksRangeCheckCircuit
26
27 witness.X = 1
28 assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoSerializationChecks())
29
30 witness.X = 0
31 assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoSerializationChecks())
32
33 witness.X = MODULUS
34 assert.ProverFailed(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoSerializationChecks())
35
36 one := big.NewInt(1)
37 maxValidVal := new(big.Int).Sub(MODULUS, one)
38 witness.X = maxValidVal
39 assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16))
40}
41
42type TestGoldilocksMulAddCircuit struct {
43 X, Y, Z frontend.Variable
44 ExpectedResult frontend.Variable
45}
46
47func (c *TestGoldilocksMulAddCircuit) Define(api frontend.API) error {
48 chip := NewChip(api)
49 calculateValue := chip.MulAdd(NewVariable(c.X), NewVariable(c.Y), NewVariable(c.Z))
50 api.AssertIsEqual(calculateValue.Limb, c.ExpectedResult)
51 return nil
52}
53
54func TestGoldilocksMulAdd(t *testing.T) {
55 assert := test.NewAssert(t)
56
57 var circuit, witness TestGoldilocksMulAddCircuit
58
59 witness.X = 1
60 witness.Y = 2
61 witness.Z = 3
62 witness.ExpectedResult = 5
63 assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoFuzzing())
64
65 bigOperand := new(big.Int).SetUint64(9223372036854775808)
66 expectedValue, _ := new(big.Int).SetString("18446744068340842500", 10)
67
68 witness.X = bigOperand
69 witness.Y = bigOperand
70 witness.Z = 3
71 witness.ExpectedResult = expectedValue
72 assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoFuzzing())
73}