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