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/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}