arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/benchmark.go
benchmark.goRaw
 1package main
 2
 3import (
 4	"fmt"
 5	. "gnark-plonky2-verifier/field"
 6	. "gnark-plonky2-verifier/plonky2_verifier"
 7	"gnark-plonky2-verifier/poseidon"
 8	"os"
 9	"time"
10
11	"github.com/consensys/gnark-crypto/ecc"
12	"github.com/consensys/gnark/backend/groth16"
13	"github.com/consensys/gnark/frontend"
14	"github.com/consensys/gnark/frontend/cs/r1cs"
15)
16
17type BenchmarkPlonky2VerifierCircuit struct {
18	proofWithPis ProofWithPublicInputs
19
20	verifierChip *VerifierChip
21}
22
23func (circuit *BenchmarkPlonky2VerifierCircuit) Define(api frontend.API) error {
24	proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/dummy_2^14_gates/proof_with_public_inputs.json")
25	commonCircuitData := DeserializeCommonCircuitData("./plonky2_verifier/data/dummy_2^14_gates/common_circuit_data.json")
26	verifierOnlyCircuitData := DeserializeVerifierOnlyCircuitData("./plonky2_verifier/data/dummy_2^14_gates/verifier_only_circuit_data.json")
27
28	fieldAPI := NewFieldAPI(api)
29	qeAPI := NewQuadraticExtensionAPI(fieldAPI, commonCircuitData.DegreeBits)
30	hashAPI := NewHashAPI(fieldAPI)
31	poseidonChip := poseidon.NewPoseidonChip(api, fieldAPI)
32	friChip := NewFriChip(api, fieldAPI, qeAPI, hashAPI, poseidonChip, &commonCircuitData.FriParams)
33	plonkChip := NewPlonkChip(api, qeAPI, commonCircuitData)
34	circuit.verifierChip = NewVerifierChip(api, fieldAPI, qeAPI, poseidonChip, plonkChip, friChip)
35
36	circuit.verifierChip.Verify(proofWithPis, verifierOnlyCircuitData, commonCircuitData)
37
38	return nil
39}
40
41func compileCircuit() frontend.CompiledConstraintSystem {
42	circuit := BenchmarkPlonky2VerifierCircuit{}
43	proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/dummy_2^14_gates/proof_with_public_inputs.json")
44	circuit.proofWithPis = proofWithPis
45
46	r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &circuit)
47	if err != nil {
48		fmt.Println("error in building circuit", err)
49		os.Exit(1)
50	}
51
52	return r1cs
53}
54
55func createProof(r1cs frontend.CompiledConstraintSystem) groth16.Proof {
56	proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/dummy_2^14_gates/proof_with_public_inputs.json")
57
58	// Witness
59	assignment := &BenchmarkPlonky2VerifierCircuit{
60		proofWithPis: proofWithPis,
61	}
62
63	fmt.Println("Generating witness", time.Now())
64	witness, _ := frontend.NewWitness(assignment, ecc.BN254.ScalarField())
65	publicWitness, _ := witness.Public()
66
67	fmt.Println("Running circuit setup", time.Now())
68	pk, vk, err := groth16.Setup(r1cs)
69	if err != nil {
70		fmt.Println(err)
71		os.Exit(1)
72	}
73
74	fmt.Println("Creating proof", time.Now())
75	proof, err := groth16.Prove(r1cs, pk, witness)
76	if err != nil {
77		fmt.Println(err)
78		os.Exit(1)
79	}
80	fmt.Println("Verifying proof", time.Now())
81	err = groth16.Verify(proof, vk, publicWitness)
82	if err != nil {
83		fmt.Println(err)
84		os.Exit(1)
85	}
86
87	return proof
88}
89
90func main() {
91	r1cs := compileCircuit()
92	proof := createProof(r1cs)
93	fmt.Println(proof.CurveID(), time.Now())
94}