From 853a273aa9984cad8b693b4edd637940c351a2b5 Mon Sep 17 00:00:00 2001 From: arnaucube Date: Fri, 15 Aug 2025 16:06:08 +0000 Subject: [PATCH] add observer for FriConfig & FriParams in verifier circuit, to match the updated version of plonky2 at PR#1678 (https://github.com/0xPolygonZero/plonky2/pull/1678) --- challenger/challenger.go | 23 +++++++++++++++++++++++ types/common_data.go | 10 ++++++++++ types/types.go | 12 +++++------- verifier/verifier.go | 1 + 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/challenger/challenger.go b/challenger/challenger.go index 20da42a..48cbf46 100644 --- a/challenger/challenger.go +++ b/challenger/challenger.go @@ -86,6 +86,29 @@ func (c *Chip) ObserveOpenings(openings fri.Openings) { } } +func (c *Chip) ObserveFriConfig( + config types.FriConfig, +) { + c.ObserveElement(gl.NewVariable(config.RateBits)) + c.ObserveElement(gl.NewVariable(config.CapHeight)) + c.ObserveElement(gl.NewVariable(config.ProofOfWorkBits)) + for i := 0; i < len(config.ReductionStrategy); i++ { + c.ObserveElement(gl.NewVariable(config.ReductionStrategy[i])) + } + c.ObserveElement(gl.NewVariable(config.NumQueryRounds)) +} + +func (c *Chip) ObserveFriParams( + params types.FriParams, +) { + c.ObserveFriConfig(params.Config) + c.ObserveElement(gl.NewVariable(0)) // Hiding, should be always false as hiding is not supported in gnark-plonky2-verifier + c.ObserveElement(gl.NewVariable(params.DegreeBits)) + for i := 0; i < len(params.ReductionArityBits); i++ { + c.ObserveElement(gl.NewVariable(params.ReductionArityBits[i])) + } +} + func (c *Chip) GetChallenge() gl.Variable { if len(c.inputBuffer) != 0 || len(c.outputBuffer) == 0 { c.duplexing() diff --git a/types/common_data.go b/types/common_data.go index c3a6177..aca0852 100644 --- a/types/common_data.go +++ b/types/common_data.go @@ -86,6 +86,13 @@ func ReadCommonCircuitData(path string) CommonCircuitData { commonCircuitData.Config.FriConfig.RateBits = raw.Config.FriConfig.RateBits commonCircuitData.Config.FriConfig.CapHeight = raw.Config.FriConfig.CapHeight commonCircuitData.Config.FriConfig.ProofOfWorkBits = raw.Config.FriConfig.ProofOfWorkBits + // since the only reduction_strategy supported in gnark-plonky2-verifier is + // ConstantArityBits, set the first element of the array to 1 (following + // https://github.com/0xPolygonZero/plonky2/blob/main/plonky2/src/fri/reduction_strategies.rs#L70). + // Ideally this first value set to 1 would already be set by plonky2 serialization of the + // CommonCircuitData, but the serializer available in plonky2's implementation does not + // include this first value + commonCircuitData.Config.FriConfig.ReductionStrategy = append([]uint64{1}, raw.Config.FriConfig.ReductionStrategy.ConstantArityBits...) commonCircuitData.Config.FriConfig.NumQueryRounds = raw.Config.FriConfig.NumQueryRounds commonCircuitData.FriParams.DegreeBits = raw.FriParams.DegreeBits @@ -93,6 +100,9 @@ func ReadCommonCircuitData(path string) CommonCircuitData { commonCircuitData.FriParams.Config.RateBits = raw.FriParams.Config.RateBits commonCircuitData.FriParams.Config.CapHeight = raw.FriParams.Config.CapHeight commonCircuitData.FriParams.Config.ProofOfWorkBits = raw.FriParams.Config.ProofOfWorkBits + // set FriParams.ReductionStrategy[0]=1, for the same reason as in + // FriConfig.ReductionStrategy few lines above + commonCircuitData.FriParams.Config.ReductionStrategy = append([]uint64{1}, raw.FriParams.Config.ReductionStrategy.ConstantArityBits...) commonCircuitData.FriParams.Config.NumQueryRounds = raw.FriParams.Config.NumQueryRounds commonCircuitData.FriParams.ReductionArityBits = raw.FriParams.ReductionArityBits diff --git a/types/types.go b/types/types.go index 03bd38f..217925f 100644 --- a/types/types.go +++ b/types/types.go @@ -5,13 +5,11 @@ import ( ) type FriConfig struct { - RateBits uint64 - CapHeight uint64 - ProofOfWorkBits uint64 - NumQueryRounds uint64 - // Note that we do not need `reduction_strategy` of type FriReductionStrategy as the plonky2 FriConfig has. - // reduction_strategy is only used for computing `reduction_arity_bits`, which is serialized in the - // CommonCircuitData. + RateBits uint64 + CapHeight uint64 + ProofOfWorkBits uint64 + ReductionStrategy []uint64 // only ConstantArityBits is supported + NumQueryRounds uint64 } func (fc *FriConfig) Rate() float64 { diff --git a/verifier/verifier.go b/verifier/verifier.go index 0d47f23..99f0b58 100644 --- a/verifier/verifier.go +++ b/verifier/verifier.go @@ -53,6 +53,7 @@ func (c *VerifierChip) GetChallenges( var circuitDigest = verifierData.CircuitDigest + challenger.ObserveFriParams(c.commonData.FriParams) challenger.ObserveBN254Hash(circuitDigest) challenger.ObserveHash(publicInputsHash) challenger.ObserveCap(proof.WiresCap)