gnark-plonky2-verifier/verifier/internal/fri/fri_test.go
verifier/internal/fri/fri_test.goRaw
1package fri_test
2
3import (
4 "testing"
5
6 "github.com/consensys/gnark/frontend"
7 "github.com/consensys/gnark/test"
8 "github.com/succinctlabs/gnark-plonky2-verifier/field"
9 "github.com/succinctlabs/gnark-plonky2-verifier/poseidon"
10 "github.com/succinctlabs/gnark-plonky2-verifier/verifier/common"
11 "github.com/succinctlabs/gnark-plonky2-verifier/verifier/internal/fri"
12 "github.com/succinctlabs/gnark-plonky2-verifier/verifier/internal/plonk"
13 "github.com/succinctlabs/gnark-plonky2-verifier/verifier/utils"
14)
15
16type TestFriCircuit struct {
17 proofWithPIsFilename string `gnark:"-"`
18 commonCircuitDataFilename string `gnark:"-"`
19 verifierOnlyCircuitDataFilename string `gnark:"-"`
20}
21
22func (circuit *TestFriCircuit) Define(api frontend.API) error {
23 proofWithPis := utils.DeserializeProofWithPublicInputs(circuit.proofWithPIsFilename)
24 commonCircuitData := utils.DeserializeCommonCircuitData(circuit.commonCircuitDataFilename)
25 verifierOnlyCircuitData := utils.DeserializeVerifierOnlyCircuitData(circuit.verifierOnlyCircuitDataFilename)
26
27 fieldAPI := field.NewFieldAPI(api)
28 qeAPI := field.NewQuadraticExtensionAPI(api, fieldAPI, commonCircuitData.DegreeBits)
29 poseidonChip := poseidon.NewPoseidonChip(api, fieldAPI, qeAPI)
30 poseidonBN128Chip := poseidon.NewPoseidonBN128Chip(api, fieldAPI)
31 friChip := fri.NewFriChip(api, fieldAPI, qeAPI, poseidonBN128Chip, &commonCircuitData.FriParams)
32 challengerChip := plonk.NewChallengerChip(api, fieldAPI, poseidonChip, poseidonBN128Chip)
33
34 challengerChip.ObserveBN128Hash(verifierOnlyCircuitData.CircuitDigest)
35 challengerChip.ObserveHash(poseidonChip.HashNoPad(proofWithPis.PublicInputs))
36 challengerChip.ObserveCap(proofWithPis.Proof.WiresCap)
37 plonkBetas := challengerChip.GetNChallenges(commonCircuitData.Config.NumChallenges) // For plonk betas
38 fieldAPI.AssertIsEqual(plonkBetas[0], field.NewFieldConst(17615363392879944733))
39 plonkGammas := challengerChip.GetNChallenges(commonCircuitData.Config.NumChallenges) // For plonk gammas
40 fieldAPI.AssertIsEqual(plonkGammas[0], field.NewFieldConst(15174493176564484303))
41
42 challengerChip.ObserveCap(proofWithPis.Proof.PlonkZsPartialProductsCap)
43 plonkAlphas := challengerChip.GetNChallenges(commonCircuitData.Config.NumChallenges) // For plonk alphas
44 fieldAPI.AssertIsEqual(plonkAlphas[0], field.NewFieldConst(9276470834414745550))
45
46 challengerChip.ObserveCap(proofWithPis.Proof.QuotientPolysCap)
47 plonkZeta := challengerChip.GetExtensionChallenge()
48 fieldAPI.AssertIsEqual(plonkZeta[0], field.NewFieldConst(3892795992421241388))
49
50 challengerChip.ObserveOpenings(fri.ToFriOpenings(proofWithPis.Proof.Openings))
51
52 friChallenges := challengerChip.GetFriChallenges(
53 proofWithPis.Proof.OpeningProof.CommitPhaseMerkleCaps,
54 proofWithPis.Proof.OpeningProof.FinalPoly,
55 proofWithPis.Proof.OpeningProof.PowWitness,
56 commonCircuitData.DegreeBits,
57 commonCircuitData.Config.FriConfig,
58 )
59
60 fieldAPI.AssertIsEqual(friChallenges.FriAlpha[0], field.NewFieldConst(885535811531859621))
61
62 fieldAPI.AssertIsEqual(friChallenges.FriBetas[0][0], field.NewFieldConst(5231781384587895507))
63
64 fieldAPI.AssertIsEqual(friChallenges.FriPowResponse, field.NewFieldConst(70715523064019))
65
66 fieldAPI.AssertIsEqual(friChallenges.FriQueryIndices[0], field.NewFieldConst(11890500485816111017))
67
68 initialMerkleCaps := []common.MerkleCap{
69 verifierOnlyCircuitData.ConstantSigmasCap,
70 proofWithPis.Proof.WiresCap,
71 proofWithPis.Proof.PlonkZsPartialProductsCap,
72 proofWithPis.Proof.QuotientPolysCap,
73 }
74
75 // Seems like there is a bug in the emulated field code.
76 // Add ZERO to all of the fri challenges values to reduce them.
77 plonkZeta[0] = fieldAPI.Add(plonkZeta[0], field.ZERO_F)
78 plonkZeta[1] = fieldAPI.Add(plonkZeta[1], field.ZERO_F)
79
80 friChallenges.FriAlpha[0] = fieldAPI.Add(friChallenges.FriAlpha[0], field.ZERO_F)
81 friChallenges.FriAlpha[1] = fieldAPI.Add(friChallenges.FriAlpha[1], field.ZERO_F)
82
83 for i := 0; i < len(friChallenges.FriBetas); i++ {
84 friChallenges.FriBetas[i][0] = fieldAPI.Add(friChallenges.FriBetas[i][0], field.ZERO_F)
85 friChallenges.FriBetas[i][1] = fieldAPI.Add(friChallenges.FriBetas[i][1], field.ZERO_F)
86 }
87
88 friChallenges.FriPowResponse = fieldAPI.Add(friChallenges.FriPowResponse, field.ZERO_F)
89
90 for i := 0; i < len(friChallenges.FriQueryIndices); i++ {
91 friChallenges.FriQueryIndices[i] = fieldAPI.Add(friChallenges.FriQueryIndices[i], field.ZERO_F)
92 }
93
94 friChip.VerifyFriProof(
95 fri.GetFriInstance(&commonCircuitData, qeAPI, plonkZeta, commonCircuitData.DegreeBits),
96 fri.ToFriOpenings(proofWithPis.Proof.Openings),
97 &friChallenges,
98 initialMerkleCaps,
99 &proofWithPis.Proof.OpeningProof,
100 )
101
102 return nil
103}
104
105func TestDecodeBlockFriVerification(t *testing.T) {
106 assert := test.NewAssert(t)
107
108 testCase := func() {
109 circuit := TestFriCircuit{
110 proofWithPIsFilename: "../../data/decode_block/proof_with_public_inputs.json",
111 commonCircuitDataFilename: "../../data/decode_block//common_circuit_data.json",
112 verifierOnlyCircuitDataFilename: "../../data/decode_block//verifier_only_circuit_data.json",
113 }
114 witness := TestFriCircuit{
115 proofWithPIsFilename: "../../data/dummy_2^14_gates/proof_with_public_inputs.json",
116 commonCircuitDataFilename: "../../data/dummy_2^14_gates/common_circuit_data.json",
117 verifierOnlyCircuitDataFilename: ".../../data/dummy_2^14_gates/verifier_only_circuit_data.json",
118 }
119 err := test.IsSolved(&circuit, &witness, field.TEST_CURVE.ScalarField())
120 assert.NoError(err)
121 }
122
123 testCase()
124}