arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/types/common_data.go
types/common_data.goRaw
  1package types
  2
  3import (
  4	"encoding/json"
  5	"io"
  6	"os"
  7
  8	"github.com/succinctlabs/gnark-plonky2-verifier/plonk/gates"
  9)
 10
 11type CommonCircuitDataRaw struct {
 12	Config struct {
 13		NumWires                uint64 `json:"num_wires"`
 14		NumRoutedWires          uint64 `json:"num_routed_wires"`
 15		NumConstants            uint64 `json:"num_constants"`
 16		UseBaseArithmeticGate   bool   `json:"use_base_arithmetic_gate"`
 17		SecurityBits            uint64 `json:"security_bits"`
 18		NumChallenges           uint64 `json:"num_challenges"`
 19		ZeroKnowledge           bool   `json:"zero_knowledge"`
 20		MaxQuotientDegreeFactor uint64 `json:"max_quotient_degree_factor"`
 21		FriConfig               struct {
 22			RateBits          uint64 `json:"rate_bits"`
 23			CapHeight         uint64 `json:"cap_height"`
 24			ProofOfWorkBits   uint64 `json:"proof_of_work_bits"`
 25			ReductionStrategy struct {
 26				ConstantArityBits []uint64 `json:"ConstantArityBits"`
 27			} `json:"reduction_strategy"`
 28			NumQueryRounds uint64 `json:"num_query_rounds"`
 29		} `json:"fri_config"`
 30	} `json:"config"`
 31	FriParams struct {
 32		Config struct {
 33			RateBits          uint64 `json:"rate_bits"`
 34			CapHeight         uint64 `json:"cap_height"`
 35			ProofOfWorkBits   uint64 `json:"proof_of_work_bits"`
 36			ReductionStrategy struct {
 37				ConstantArityBits []uint64 `json:"ConstantArityBits"`
 38			} `json:"reduction_strategy"`
 39			NumQueryRounds uint64 `json:"num_query_rounds"`
 40		} `json:"config"`
 41		Hiding             bool     `json:"hiding"`
 42		DegreeBits         uint64   `json:"degree_bits"`
 43		ReductionArityBits []uint64 `json:"reduction_arity_bits"`
 44	} `json:"fri_params"`
 45	Gates         []string `json:"gates"`
 46	SelectorsInfo struct {
 47		SelectorIndices []uint64 `json:"selector_indices"`
 48		Groups          []struct {
 49			Start uint64 `json:"start"`
 50			End   uint64 `json:"end"`
 51		} `json:"groups"`
 52	} `json:"selectors_info"`
 53	QuotientDegreeFactor uint64   `json:"quotient_degree_factor"`
 54	NumGateConstraints   uint64   `json:"num_gate_constraints"`
 55	NumConstants         uint64   `json:"num_constants"`
 56	NumPublicInputs      uint64   `json:"num_public_inputs"`
 57	KIs                  []uint64 `json:"k_is"`
 58	NumPartialProducts   uint64   `json:"num_partial_products"`
 59}
 60
 61func ReadCommonCircuitData(path string) CommonCircuitData {
 62	jsonFile, err := os.Open(path)
 63	if err != nil {
 64		panic(err)
 65	}
 66
 67	defer jsonFile.Close()
 68	rawBytes, _ := io.ReadAll(jsonFile)
 69
 70	var raw CommonCircuitDataRaw
 71	err = json.Unmarshal(rawBytes, &raw)
 72	if err != nil {
 73		panic(err)
 74	}
 75
 76	var commonCircuitData CommonCircuitData
 77	commonCircuitData.Config.NumWires = raw.Config.NumWires
 78	commonCircuitData.Config.NumRoutedWires = raw.Config.NumRoutedWires
 79	commonCircuitData.Config.NumConstants = raw.Config.NumConstants
 80	commonCircuitData.Config.UseBaseArithmeticGate = raw.Config.UseBaseArithmeticGate
 81	commonCircuitData.Config.SecurityBits = raw.Config.SecurityBits
 82	commonCircuitData.Config.NumChallenges = raw.Config.NumChallenges
 83	commonCircuitData.Config.ZeroKnowledge = raw.Config.ZeroKnowledge
 84	commonCircuitData.Config.MaxQuotientDegreeFactor = raw.Config.MaxQuotientDegreeFactor
 85
 86	commonCircuitData.Config.FriConfig.RateBits = raw.Config.FriConfig.RateBits
 87	commonCircuitData.Config.FriConfig.CapHeight = raw.Config.FriConfig.CapHeight
 88	commonCircuitData.Config.FriConfig.ProofOfWorkBits = raw.Config.FriConfig.ProofOfWorkBits
 89	// since the only reduction_strategy supported in gnark-plonky2-verifier is
 90	// ConstantArityBits, set the first element of the array to 1 (following
 91	// https://github.com/0xPolygonZero/plonky2/blob/main/plonky2/src/fri/reduction_strategies.rs#L70).
 92	// Ideally this first value set to 1 would already be set by plonky2 serialization of the
 93	// CommonCircuitData, but the serializer available in plonky2's implementation does not
 94	// include this first value
 95	commonCircuitData.Config.FriConfig.ReductionStrategy = append([]uint64{1}, raw.Config.FriConfig.ReductionStrategy.ConstantArityBits...)
 96	commonCircuitData.Config.FriConfig.NumQueryRounds = raw.Config.FriConfig.NumQueryRounds
 97
 98	commonCircuitData.FriParams.DegreeBits = raw.FriParams.DegreeBits
 99	commonCircuitData.DegreeBits = raw.FriParams.DegreeBits
100	commonCircuitData.FriParams.Config.RateBits = raw.FriParams.Config.RateBits
101	commonCircuitData.FriParams.Config.CapHeight = raw.FriParams.Config.CapHeight
102	commonCircuitData.FriParams.Config.ProofOfWorkBits = raw.FriParams.Config.ProofOfWorkBits
103	// set FriParams.ReductionStrategy[0]=1, for the same reason as in
104	// FriConfig.ReductionStrategy few lines above
105	commonCircuitData.FriParams.Config.ReductionStrategy = append([]uint64{1}, raw.FriParams.Config.ReductionStrategy.ConstantArityBits...)
106	commonCircuitData.FriParams.Config.NumQueryRounds = raw.FriParams.Config.NumQueryRounds
107	commonCircuitData.FriParams.ReductionArityBits = raw.FriParams.ReductionArityBits
108
109	commonCircuitData.GateIds = raw.Gates
110
111	selectorGroupStart := []uint64{}
112	selectorGroupEnd := []uint64{}
113	for _, group := range raw.SelectorsInfo.Groups {
114		selectorGroupStart = append(selectorGroupStart, group.Start)
115		selectorGroupEnd = append(selectorGroupEnd, group.End)
116	}
117
118	commonCircuitData.SelectorsInfo = *gates.NewSelectorsInfo(
119		raw.SelectorsInfo.SelectorIndices,
120		selectorGroupStart,
121		selectorGroupEnd,
122	)
123
124	commonCircuitData.QuotientDegreeFactor = raw.QuotientDegreeFactor
125	commonCircuitData.NumGateConstraints = raw.NumGateConstraints
126	commonCircuitData.NumConstants = raw.NumConstants
127	commonCircuitData.NumPublicInputs = raw.NumPublicInputs
128	commonCircuitData.KIs = raw.KIs
129	commonCircuitData.NumPartialProducts = raw.NumPartialProducts
130
131	// Don't support circuits that have hiding enabled
132	if raw.FriParams.Hiding {
133		panic("Circuit has hiding enabled, which is not supported")
134	}
135
136	return commonCircuitData
137}