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