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/variables"
15)
16
17type TestFriCircuit struct {
18 ProofWithPis variables.ProofWithPublicInputs
19 VerifierOnlyCircuitData variables.VerifierOnlyCircuitData
20 CommonCircuitData types.CommonCircuitData
21}
22
23func (circuit *TestFriCircuit) Define(api frontend.API) error {
24 commonCircuitData := circuit.CommonCircuitData
25 verifierOnlyCircuitData := circuit.VerifierOnlyCircuitData
26 proofWithPis := circuit.ProofWithPis
27
28 glApi := gl.New(api)
29 poseidonChip := poseidon.NewGoldilocksChip(api)
30 friChip := fri.NewChip(api, &commonCircuitData, &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(friChip.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.Config.FriConfig,
56 )
57
58 api.AssertIsEqual(friChallenges.FriAlpha[0].Limb, 885535811531859621)
59
60 api.AssertIsEqual(friChallenges.FriBetas[0][0].Limb, 5231781384587895507)
61
62 api.AssertIsEqual(friChallenges.FriPowResponse.Limb, 70715523064019)
63
64 // glApi.AssertIsEqual(friChallenges.FriQueryIndices[0], gl.NewVariableFromConst(11890500485816111017))
65 var x uint64
66 x = 11890500485816111017
67 api.AssertIsEqual(friChallenges.FriQueryIndices[0].Limb, x)
68
69 initialMerkleCaps := []variables.FriMerkleCap{
70 verifierOnlyCircuitData.ConstantSigmasCap,
71 proofWithPis.Proof.WiresCap,
72 proofWithPis.Proof.PlonkZsPartialProductsCap,
73 proofWithPis.Proof.QuotientPolysCap,
74 }
75
76 // Seems like there is a bug in the emulated field code.
77 // Add ZERO to all of the fri challenges values to reduce them.
78 plonkZeta[0] = glApi.Add(plonkZeta[0], gl.Zero())
79 plonkZeta[1] = glApi.Add(plonkZeta[1], gl.Zero())
80
81 friChallenges.FriAlpha[0] = glApi.Add(friChallenges.FriAlpha[0], gl.Zero())
82 friChallenges.FriAlpha[1] = glApi.Add(friChallenges.FriAlpha[1], gl.Zero())
83
84 for i := 0; i < len(friChallenges.FriBetas); i++ {
85 friChallenges.FriBetas[i][0] = glApi.Add(friChallenges.FriBetas[i][0], gl.Zero())
86 friChallenges.FriBetas[i][1] = glApi.Add(friChallenges.FriBetas[i][1], gl.Zero())
87 }
88
89 friChallenges.FriPowResponse = glApi.Add(friChallenges.FriPowResponse, gl.Zero())
90
91 for i := 0; i < len(friChallenges.FriQueryIndices); i++ {
92 friChallenges.FriQueryIndices[i] = glApi.Add(friChallenges.FriQueryIndices[i], gl.Zero())
93 }
94
95 friChip.VerifyFriProof(
96 friChip.GetInstance(plonkZeta),
97 friChip.ToOpenings(proofWithPis.Proof.Openings),
98 &friChallenges,
99 initialMerkleCaps,
100 &proofWithPis.Proof.OpeningProof,
101 )
102
103 return nil
104}
105
106func TestDecodeBlockFriVerification(t *testing.T) {
107 assert := test.NewAssert(t)
108
109 proofWithPIsFilename := "../testdata/decode_block/proof_with_public_inputs.json"
110 commonCircuitDataFilename := "../testdata/decode_block/common_circuit_data.json"
111 verifierOnlyCircuitDataFilename := "../testdata/decode_block/verifier_only_circuit_data.json"
112
113 proofWithPis := variables.DeserializeProofWithPublicInputs(types.ReadProofWithPublicInputs(proofWithPIsFilename))
114 commonCircuitData := types.ReadCommonCircuitData(commonCircuitDataFilename)
115 verifierOnlyCircuitData := variables.DeserializeVerifierOnlyCircuitData(types.ReadVerifierOnlyCircuitData(verifierOnlyCircuitDataFilename))
116
117 testCase := func() {
118 circuit := TestFriCircuit{
119 proofWithPis,
120 verifierOnlyCircuitData,
121 commonCircuitData,
122 }
123 witness := TestFriCircuit{
124 proofWithPis,
125 verifierOnlyCircuitData,
126 commonCircuitData,
127 }
128 err := test.IsSolved(&circuit, &witness, ecc.BN254.ScalarField())
129 assert.NoError(err)
130 }
131
132 testCase()
133}