arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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}