mirror of
https://github.com/arnaucube/gnark-plonky2-verifier.git
synced 2026-01-11 16:41:32 +01:00
All tests pass
This commit is contained in:
122
types/common_data.go
Normal file
122
types/common_data.go
Normal file
@@ -0,0 +1,122 @@
|
||||
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 DeserializeCommonCircuitData(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
|
||||
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
|
||||
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
|
||||
|
||||
return commonCircuitData
|
||||
}
|
||||
9
types/common_data_test.go
Normal file
9
types/common_data_test.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package types
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestDeserializeCommonCircuitData(t *testing.T) {
|
||||
DeserializeCommonCircuitData("../testdata/decode_block/common_circuit_data.json")
|
||||
}
|
||||
126
types/deserialize.go
Normal file
126
types/deserialize.go
Normal file
@@ -0,0 +1,126 @@
|
||||
package types
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io"
|
||||
"os"
|
||||
)
|
||||
|
||||
type ProofWithPublicInputsRaw struct {
|
||||
Proof struct {
|
||||
WiresCap []string `json:"wires_cap"`
|
||||
PlonkZsPartialProductsCap []string `json:"plonk_zs_partial_products_cap"`
|
||||
QuotientPolysCap []string `json:"quotient_polys_cap"`
|
||||
Openings struct {
|
||||
Constants [][]uint64 `json:"constants"`
|
||||
PlonkSigmas [][]uint64 `json:"plonk_sigmas"`
|
||||
Wires [][]uint64 `json:"wires"`
|
||||
PlonkZs [][]uint64 `json:"plonk_zs"`
|
||||
PlonkZsNext [][]uint64 `json:"plonk_zs_next"`
|
||||
PartialProducts [][]uint64 `json:"partial_products"`
|
||||
QuotientPolys [][]uint64 `json:"quotient_polys"`
|
||||
} `json:"openings"`
|
||||
OpeningProof struct {
|
||||
CommitPhaseMerkleCaps [][]string `json:"commit_phase_merkle_caps"`
|
||||
QueryRoundProofs []struct {
|
||||
InitialTreesProof struct {
|
||||
EvalsProofs []EvalProofRaw `json:"evals_proofs"`
|
||||
} `json:"initial_trees_proof"`
|
||||
Steps []struct {
|
||||
Evals [][]uint64 `json:"evals"`
|
||||
MerkleProof struct {
|
||||
Siblings []string `json:"siblings"`
|
||||
} `json:"merkle_proof"`
|
||||
} `json:"steps"`
|
||||
} `json:"query_round_proofs"`
|
||||
FinalPoly struct {
|
||||
Coeffs [][]uint64 `json:"coeffs"`
|
||||
} `json:"final_poly"`
|
||||
PowWitness uint64 `json:"pow_witness"`
|
||||
} `json:"opening_proof"`
|
||||
} `json:"proof"`
|
||||
PublicInputs []uint64 `json:"public_inputs"`
|
||||
}
|
||||
|
||||
type EvalProofRaw struct {
|
||||
LeafElements []uint64
|
||||
MerkleProof MerkleProofRaw
|
||||
}
|
||||
|
||||
func (e *EvalProofRaw) UnmarshalJSON(data []byte) error {
|
||||
return json.Unmarshal(data, &[]interface{}{&e.LeafElements, &e.MerkleProof})
|
||||
}
|
||||
|
||||
type MerkleProofRaw struct {
|
||||
Hash []string
|
||||
}
|
||||
|
||||
func (m *MerkleProofRaw) UnmarshalJSON(data []byte) error {
|
||||
type SiblingObject struct {
|
||||
Siblings []string // "siblings"
|
||||
}
|
||||
|
||||
var siblings SiblingObject
|
||||
if err := json.Unmarshal(data, &siblings); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
m.Hash = make([]string, len(siblings.Siblings))
|
||||
copy(m.Hash[:], siblings.Siblings)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type ProofChallengesRaw struct {
|
||||
PlonkBetas []uint64 `json:"plonk_betas"`
|
||||
PlonkGammas []uint64 `json:"plonk_gammas"`
|
||||
PlonkAlphas []uint64 `json:"plonk_alphas"`
|
||||
PlonkZeta []uint64 `json:"plonk_zeta"`
|
||||
FriChallenges struct {
|
||||
FriAlpha []uint64 `json:"fri_alpha"`
|
||||
FriBetas [][]uint64 `json:"fri_betas"`
|
||||
FriPowResponse uint64 `json:"fri_pow_response"`
|
||||
FriQueryIndices []uint64 `json:"fri_query_indices"`
|
||||
} `json:"fri_challenges"`
|
||||
}
|
||||
|
||||
type VerifierOnlyCircuitDataRaw struct {
|
||||
ConstantsSigmasCap []string `json:"constants_sigmas_cap"`
|
||||
CircuitDigest string `json:"circuit_digest"`
|
||||
}
|
||||
|
||||
func ReadProofWithPublicInputs(path string) ProofWithPublicInputsRaw {
|
||||
jsonFile, err := os.Open(path)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
defer jsonFile.Close()
|
||||
rawBytes, _ := io.ReadAll(jsonFile)
|
||||
|
||||
var raw ProofWithPublicInputsRaw
|
||||
err = json.Unmarshal(rawBytes, &raw)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return raw
|
||||
}
|
||||
|
||||
func ReadVerifierOnlyCircuitData(path string) VerifierOnlyCircuitDataRaw {
|
||||
jsonFile, err := os.Open(path)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
defer jsonFile.Close()
|
||||
rawBytes, _ := io.ReadAll(jsonFile)
|
||||
|
||||
var raw VerifierOnlyCircuitDataRaw
|
||||
err = json.Unmarshal(rawBytes, &raw)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return raw
|
||||
}
|
||||
13
types/deserialize_test.go
Normal file
13
types/deserialize_test.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package types
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestReadProofWithPublicInputs(t *testing.T) {
|
||||
ReadProofWithPublicInputs("../testdata/decode_block/proof_with_public_inputs.json")
|
||||
}
|
||||
|
||||
func TestReadVerifierOnlyCircuitData(t *testing.T) {
|
||||
ReadVerifierOnlyCircuitData("../testdata/decode_block/verifier_only_circuit_data.json")
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package types
|
||||
|
||||
import "github.com/succinctlabs/gnark-plonky2-verifier/plonk/gates"
|
||||
|
||||
type FriConfig struct {
|
||||
RateBits uint64
|
||||
CapHeight uint64
|
||||
@@ -18,3 +20,29 @@ type FriParams struct {
|
||||
DegreeBits uint64
|
||||
ReductionArityBits []uint64
|
||||
}
|
||||
|
||||
type CircuitConfig struct {
|
||||
NumWires uint64
|
||||
NumRoutedWires uint64
|
||||
NumConstants uint64
|
||||
UseBaseArithmeticGate bool
|
||||
SecurityBits uint64
|
||||
NumChallenges uint64
|
||||
ZeroKnowledge bool
|
||||
MaxQuotientDegreeFactor uint64
|
||||
FriConfig FriConfig
|
||||
}
|
||||
|
||||
type CommonCircuitData struct {
|
||||
Config CircuitConfig
|
||||
FriParams
|
||||
GateIds []string
|
||||
SelectorsInfo gates.SelectorsInfo
|
||||
DegreeBits uint64
|
||||
QuotientDegreeFactor uint64
|
||||
NumGateConstraints uint64
|
||||
NumConstants uint64
|
||||
NumPublicInputs uint64
|
||||
KIs []uint64
|
||||
NumPartialProducts uint64
|
||||
}
|
||||
|
||||
21
types/utils.go
Normal file
21
types/utils.go
Normal file
@@ -0,0 +1,21 @@
|
||||
package types
|
||||
|
||||
func ReductionArityBits(
|
||||
arityBits uint64,
|
||||
finalPolyBits uint64,
|
||||
degreeBits uint64,
|
||||
rateBits uint64,
|
||||
capHeight uint64,
|
||||
) []uint64 {
|
||||
returnArr := make([]uint64, 0)
|
||||
|
||||
for degreeBits > finalPolyBits && degreeBits+rateBits-arityBits >= capHeight {
|
||||
returnArr = append(returnArr, arityBits)
|
||||
if degreeBits < arityBits {
|
||||
panic("degreeBits < arityBits")
|
||||
}
|
||||
degreeBits -= arityBits
|
||||
}
|
||||
|
||||
return returnArr
|
||||
}
|
||||
Reference in New Issue
Block a user