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