package types import ( "encoding/json" "io" "os" "github.com/succinctlabs/gnark-plonky2-verifier/plonk/gates" ) type CommonCircuitDataRaw struct { Config struct { NumWires uint64 `json:"num_wires"` NumRoutedWires uint64 `json:"num_routed_wires"` NumConstants uint64 `json:"num_constants"` UseBaseArithmeticGate bool `json:"use_base_arithmetic_gate"` SecurityBits uint64 `json:"security_bits"` NumChallenges uint64 `json:"num_challenges"` ZeroKnowledge bool `json:"zero_knowledge"` MaxQuotientDegreeFactor uint64 `json:"max_quotient_degree_factor"` FriConfig struct { RateBits uint64 `json:"rate_bits"` CapHeight uint64 `json:"cap_height"` ProofOfWorkBits uint64 `json:"proof_of_work_bits"` ReductionStrategy struct { ConstantArityBits []uint64 `json:"ConstantArityBits"` } `json:"reduction_strategy"` NumQueryRounds uint64 `json:"num_query_rounds"` } `json:"fri_config"` } `json:"config"` FriParams struct { Config struct { RateBits uint64 `json:"rate_bits"` CapHeight uint64 `json:"cap_height"` ProofOfWorkBits uint64 `json:"proof_of_work_bits"` ReductionStrategy struct { ConstantArityBits []uint64 `json:"ConstantArityBits"` } `json:"reduction_strategy"` NumQueryRounds uint64 `json:"num_query_rounds"` } `json:"config"` Hiding bool `json:"hiding"` DegreeBits uint64 `json:"degree_bits"` ReductionArityBits []uint64 `json:"reduction_arity_bits"` } `json:"fri_params"` Gates []string `json:"gates"` SelectorsInfo struct { SelectorIndices []uint64 `json:"selector_indices"` Groups []struct { Start uint64 `json:"start"` End uint64 `json:"end"` } `json:"groups"` } `json:"selectors_info"` QuotientDegreeFactor uint64 `json:"quotient_degree_factor"` NumGateConstraints uint64 `json:"num_gate_constraints"` NumConstants uint64 `json:"num_constants"` NumPublicInputs uint64 `json:"num_public_inputs"` KIs []uint64 `json:"k_is"` NumPartialProducts uint64 `json:"num_partial_products"` } func ReadCommonCircuitData(path string) CommonCircuitData { jsonFile, err := os.Open(path) if err != nil { panic(err) } defer jsonFile.Close() rawBytes, _ := io.ReadAll(jsonFile) var raw CommonCircuitDataRaw err = json.Unmarshal(rawBytes, &raw) if err != nil { panic(err) } var commonCircuitData CommonCircuitData commonCircuitData.Config.NumWires = raw.Config.NumWires commonCircuitData.Config.NumRoutedWires = raw.Config.NumRoutedWires commonCircuitData.Config.NumConstants = raw.Config.NumConstants commonCircuitData.Config.UseBaseArithmeticGate = raw.Config.UseBaseArithmeticGate commonCircuitData.Config.SecurityBits = raw.Config.SecurityBits commonCircuitData.Config.NumChallenges = raw.Config.NumChallenges commonCircuitData.Config.ZeroKnowledge = raw.Config.ZeroKnowledge commonCircuitData.Config.MaxQuotientDegreeFactor = raw.Config.MaxQuotientDegreeFactor 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 commonCircuitData.DegreeBits = raw.FriParams.DegreeBits 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 commonCircuitData.GateIds = raw.Gates selectorGroupStart := []uint64{} selectorGroupEnd := []uint64{} for _, group := range raw.SelectorsInfo.Groups { selectorGroupStart = append(selectorGroupStart, group.Start) selectorGroupEnd = append(selectorGroupEnd, group.End) } commonCircuitData.SelectorsInfo = *gates.NewSelectorsInfo( raw.SelectorsInfo.SelectorIndices, selectorGroupStart, selectorGroupEnd, ) commonCircuitData.QuotientDegreeFactor = raw.QuotientDegreeFactor commonCircuitData.NumGateConstraints = raw.NumGateConstraints commonCircuitData.NumConstants = raw.NumConstants commonCircuitData.NumPublicInputs = raw.NumPublicInputs commonCircuitData.KIs = raw.KIs commonCircuitData.NumPartialProducts = raw.NumPartialProducts // Don't support circuits that have hiding enabled if raw.FriParams.Hiding { panic("Circuit has hiding enabled, which is not supported") } return commonCircuitData }