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