gnark-plonky2-verifier/plonk_benchmark.go
plonk_benchmark.goRaw
1package main
2
3import (
4 "fmt"
5 . "gnark-ed25519/field"
6 . "gnark-ed25519/plonky2_verifier"
7 "os"
8 "time"
9
10 "github.com/consensys/gnark-crypto/ecc"
11 "github.com/consensys/gnark/backend/groth16"
12 "github.com/consensys/gnark/frontend"
13 "github.com/consensys/gnark/frontend/cs/r1cs"
14)
15
16type BenchmarkPlonkCircuit struct {
17 proofChallenges ProofChallenges
18 openings OpeningSet
19}
20
21func (circuit *BenchmarkPlonkCircuit) Define(api frontend.API) error {
22 commonCircuitData := DeserializeCommonCircuitData("./plonky2_verifier/data/dummy_2^14_gates/common_circuit_data.json")
23
24 field := NewFieldAPI(api)
25 qeAPI := NewQuadraticExtensionAPI(field, commonCircuitData.DegreeBits)
26
27 plonkChip := NewPlonkChip(api, qeAPI, commonCircuitData)
28
29 plonkChip.Verify(circuit.proofChallenges, circuit.openings)
30
31 return nil
32}
33
34func compileCircuit() frontend.CompiledConstraintSystem {
35 fmt.Println("compiling circuit", time.Now())
36 circuit := BenchmarkPlonkCircuit{}
37
38 proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/dummy_2^14_gates/proof_with_public_inputs.json")
39
40 // Challenge associated with the data from "/.data/dummy_2^14_gates/*"
41 proofChallenges := ProofChallenges{
42 PlonkBetas: []F{
43 NewFieldElementFromString("4678728155650926271"),
44 NewFieldElementFromString("13611962404289024887"),
45 },
46 PlonkGammas: []F{
47 NewFieldElementFromString("13237663823305715949"),
48 NewFieldElementFromString("15389314098328235145"),
49 },
50 PlonkAlphas: []F{
51 NewFieldElementFromString("14505919539124304197"),
52 NewFieldElementFromString("1695455639263736117"),
53 },
54 PlonkZeta: QuadraticExtension{
55 NewFieldElementFromString("14887793628029982930"),
56 NewFieldElementFromString("1136137158284059037"),
57 },
58 }
59
60 circuit.proofChallenges = proofChallenges
61 circuit.openings = proofWithPis.Proof.Openings
62
63 r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &circuit)
64 if err != nil {
65 fmt.Println("error in building circuit", err)
66 os.Exit(1)
67 }
68
69 return r1cs
70}
71
72func createProof(r1cs frontend.CompiledConstraintSystem) groth16.Proof {
73 proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/dummy_2^14_gates/proof_with_public_inputs.json")
74
75 // Challenge associated with the data from "/.data/dummy_2^14_gates/*"
76 proofChallenges := ProofChallenges{
77 PlonkBetas: []F{
78 NewFieldElementFromString("4678728155650926271"),
79 NewFieldElementFromString("13611962404289024887"),
80 },
81 PlonkGammas: []F{
82 NewFieldElementFromString("13237663823305715949"),
83 NewFieldElementFromString("15389314098328235145"),
84 },
85 PlonkAlphas: []F{
86 NewFieldElementFromString("14505919539124304197"),
87 NewFieldElementFromString("1695455639263736117"),
88 },
89 PlonkZeta: QuadraticExtension{
90 NewFieldElementFromString("14887793628029982930"),
91 NewFieldElementFromString("1136137158284059037"),
92 },
93 }
94
95 // Witness
96 assignment := &BenchmarkPlonkCircuit{
97 proofChallenges: proofChallenges,
98 openings: proofWithPis.Proof.Openings,
99 }
100
101 fmt.Println("Generating witness", time.Now())
102 witness, _ := frontend.NewWitness(assignment, ecc.BN254.ScalarField())
103 publicWitness, _ := witness.Public()
104 pk, vk, err := groth16.Setup(r1cs)
105 if err != nil {
106 fmt.Println(err)
107 os.Exit(1)
108 }
109
110 fmt.Println("Creating proof", time.Now())
111 proof, err := groth16.Prove(r1cs, pk, witness)
112 if err != nil {
113 fmt.Println(err)
114 os.Exit(1)
115 }
116 fmt.Println("Verifying proof", time.Now())
117 err = groth16.Verify(proof, vk, publicWitness)
118 if err != nil {
119 fmt.Println(err)
120 os.Exit(1)
121 }
122
123 return proof
124}
125
126func main() {
127 r1cs := compileCircuit()
128 fi, _ := os.Open("dummy_fri.r1cs")
129 r1cs.WriteTo(fi)
130 proof := createProof(r1cs)
131 fmt.Println(proof.CurveID(), time.Now())
132}