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