gnark-plonky2-verifier/verifier/verifier_test.go
verifier/verifier_test.goRaw
1package verifier_test
2
3import (
4 "testing"
5
6 "github.com/consensys/gnark-crypto/ecc"
7 "github.com/consensys/gnark/backend"
8 "github.com/consensys/gnark/frontend"
9 "github.com/consensys/gnark/std/math/emulated"
10 "github.com/consensys/gnark/test"
11 "github.com/succinctlabs/gnark-plonky2-verifier/field"
12 "github.com/succinctlabs/gnark-plonky2-verifier/verifier"
13 "github.com/succinctlabs/gnark-plonky2-verifier/verifier/common"
14 "github.com/succinctlabs/gnark-plonky2-verifier/verifier/utils"
15)
16
17type TestVerifierCircuit struct {
18 Proof common.Proof
19 PublicInputs []field.F `gnark:",public"`
20
21 verifierChip *verifier.VerifierChip `gnark:"-"`
22 plonky2CircuitName string `gnark:"-"`
23}
24
25func (c *TestVerifierCircuit) Define(api frontend.API) error {
26 circuitDirname := "./data/" + c.plonky2CircuitName + "/"
27 commonCircuitData := utils.DeserializeCommonCircuitData(circuitDirname + "common_circuit_data.json")
28 verifierOnlyCircuitData := utils.DeserializeVerifierOnlyCircuitData(circuitDirname + "verifier_only_circuit_data.json")
29
30 c.verifierChip = verifier.NewVerifierChip(api, commonCircuitData)
31
32 c.verifierChip.Verify(c.Proof, c.PublicInputs, verifierOnlyCircuitData, commonCircuitData)
33
34 return nil
35}
36
37func TestStepVerifier(t *testing.T) {
38 assert := test.NewAssert(t)
39
40 testCase := func() {
41 plonky2Circuit := "step"
42 proofWithPis := utils.DeserializeProofWithPublicInputs("./data/" + plonky2Circuit + "/proof_with_public_inputs.json")
43 circuit := TestVerifierCircuit{
44 plonky2CircuitName: plonky2Circuit,
45 Proof: proofWithPis.Proof,
46 PublicInputs: proofWithPis.PublicInputs,
47 }
48
49 proofWithPis2 := utils.DeserializeProofWithPublicInputs("./data/" + plonky2Circuit + "/proof_with_public_inputs.json")
50 witness := TestVerifierCircuit{
51 plonky2CircuitName: plonky2Circuit,
52 Proof: proofWithPis2.Proof,
53 PublicInputs: proofWithPis2.PublicInputs,
54 }
55
56 err := test.IsSolved(&circuit, &witness, field.TEST_CURVE.ScalarField())
57 assert.NoError(err)
58 }
59 testCase()
60}
61
62func TestStepVerifier2(t *testing.T) {
63 assert := test.NewAssert(t)
64
65 plonky2Circuit := "step"
66 proofWithPis := utils.DeserializeProofWithPublicInputs("./data/" + plonky2Circuit + "/proof_with_public_inputs.json")
67 circuit := TestVerifierCircuit{
68 plonky2CircuitName: plonky2Circuit,
69 Proof: proofWithPis.Proof,
70 PublicInputs: proofWithPis.PublicInputs,
71 }
72
73 proofWithPis2 := utils.DeserializeProofWithPublicInputs("./data/" + plonky2Circuit + "/proof_with_public_inputs.json")
74 witness := TestVerifierCircuit{
75 plonky2CircuitName: plonky2Circuit,
76 Proof: proofWithPis2.Proof,
77 PublicInputs: proofWithPis2.PublicInputs,
78 }
79
80 assert.ProverSucceeded(
81 &circuit,
82 &witness,
83 test.WithBackends(backend.GROTH16),
84 test.WithCurves(ecc.BN254),
85 test.NoFuzzing(),
86 test.NoSerialization(),
87 )
88}
89
90type testCircuit struct {
91 Arr [2]emulated.Element[emulated.Secp256k1Fp]
92 Expected emulated.Element[emulated.Secp256k1Fp]
93}
94
95func (circuit *testCircuit) Define(api frontend.API) error {
96 field, _ := emulated.NewField[emulated.Secp256k1Fp](api)
97
98 mulRes := field.Mul(&circuit.Arr[0], &circuit.Arr[1])
99 field.AssertIsEqual(mulRes, &circuit.Expected)
100
101 return nil
102}
103
104func TestMain(t *testing.T) {
105 assert := test.NewAssert(t)
106
107 var circuit testCircuit
108
109 assert.ProverSucceeded(
110 &circuit,
111 &testCircuit{
112 Arr: [2]emulated.Element[emulated.Secp256k1Fp]{
113 emulated.ValueOf[emulated.Secp256k1Fp](42),
114 emulated.ValueOf[emulated.Secp256k1Fp](24),
115 },
116 Expected: emulated.ValueOf[emulated.Secp256k1Fp](1008),
117 },
118 test.WithBackends(backend.GROTH16),
119 test.WithCurves(ecc.BN254),
120 test.NoFuzzing(),
121 test.NoSerialization(),
122 )
123}