Revert "Range check optimizations"

This commit is contained in:
puma314
2023-10-11 17:39:52 -07:00
committed by GitHub
parent c23b174535
commit 0c677ddd0d
50 changed files with 1146 additions and 1089 deletions

View File

@@ -36,7 +36,7 @@ func (g *EvaluateGatesChip) computeFilter(
s gl.QuadraticExtensionVariable,
manySelector bool,
) gl.QuadraticExtensionVariable {
glApi := gl.New(g.api)
glApi := gl.NewChip(g.api)
product := gl.OneExtension()
for i := groupRange.start; i < groupRange.end; i++ {
if i == uint64(row) {
@@ -62,7 +62,7 @@ func (g *EvaluateGatesChip) evalFiltered(
groupRange Range,
numSelectors uint64,
) []gl.QuadraticExtensionVariable {
glApi := gl.New(g.api)
glApi := gl.NewChip(g.api)
filter := g.computeFilter(row, groupRange, vars.localConstants[selectorIndex], numSelectors > 1)
vars.RemovePrefix(numSelectors)
@@ -75,7 +75,7 @@ func (g *EvaluateGatesChip) evalFiltered(
}
func (g *EvaluateGatesChip) EvaluateGateConstraints(vars EvaluationVars) []gl.QuadraticExtensionVariable {
glApi := gl.New(g.api)
glApi := gl.NewChip(g.api)
constraints := make([]gl.QuadraticExtensionVariable, g.numGateConstraints)
for i := range constraints {
constraints[i] = gl.ZeroExtension()

View File

@@ -11,7 +11,7 @@ import (
gl "github.com/succinctlabs/gnark-plonky2-verifier/goldilocks"
"github.com/succinctlabs/gnark-plonky2-verifier/plonk/gates"
"github.com/succinctlabs/gnark-plonky2-verifier/poseidon"
"github.com/succinctlabs/gnark-plonky2-verifier/types"
"github.com/succinctlabs/gnark-plonky2-verifier/verifier"
)
// From recursive_step circuit
@@ -690,10 +690,10 @@ type TestGateCircuit struct {
}
func (circuit *TestGateCircuit) Define(api frontend.API) error {
commonCircuitData := types.ReadCommonCircuitData("../../testdata/decode_block/common_circuit_data.json")
commonCircuitData := verifier.DeserializeCommonCircuitData("../../data/decode_block/common_circuit_data.json")
numSelectors := commonCircuitData.SelectorsInfo.NumSelectors()
glApi := gl.New(api)
glApi := gl.NewChip(api)
vars := gates.NewEvaluationVars(localConstants[numSelectors:], localWires, publicInputsHash)

View File

@@ -45,7 +45,7 @@ func (g *PoseidonMdsGate) mdsRowShfAlgebra(
v [poseidon.SPONGE_WIDTH]gl.QuadraticExtensionAlgebraVariable,
api frontend.API,
) gl.QuadraticExtensionAlgebraVariable {
glApi := gl.New(api)
glApi := gl.NewChip(api)
if r >= poseidon.SPONGE_WIDTH {
panic("MDS row index out of range")
}

View File

@@ -6,7 +6,6 @@ import (
"github.com/succinctlabs/gnark-plonky2-verifier/plonk/gates"
"github.com/succinctlabs/gnark-plonky2-verifier/poseidon"
"github.com/succinctlabs/gnark-plonky2-verifier/types"
"github.com/succinctlabs/gnark-plonky2-verifier/variables"
)
type PlonkChip struct {
@@ -14,12 +13,9 @@ type PlonkChip struct {
commonData types.CommonCircuitData `gnark:"-"`
// These are global constant variables that we use in this Chip that we save here.
// This avoids having to recreate them every time we use them.
DEGREE gl.Variable `gnark:"-"`
DEGREE_BITS_F gl.Variable `gnark:"-"`
DEGREE_QE gl.QuadraticExtensionVariable `gnark:"-"`
commonDataKIs []gl.Variable `gnark:"-"`
evaluateGatesChip *gates.EvaluateGatesChip
}
@@ -27,15 +23,9 @@ type PlonkChip struct {
func NewPlonkChip(api frontend.API, commonData types.CommonCircuitData) *PlonkChip {
// TODO: Should degreeBits be verified that it fits within the field and that degree is within uint64?
// Create the gates based on commonData GateIds
createdGates := []gates.Gate{}
for _, gateId := range commonData.GateIds {
createdGates = append(createdGates, gates.GateInstanceFromId(gateId))
}
evaluateGatesChip := gates.NewEvaluateGatesChip(
api,
createdGates,
commonData.Gates,
commonData.NumGateConstraints,
commonData.SelectorsInfo,
)
@@ -48,14 +38,13 @@ func NewPlonkChip(api frontend.API, commonData types.CommonCircuitData) *PlonkCh
DEGREE: gl.NewVariable(1 << commonData.DegreeBits),
DEGREE_BITS_F: gl.NewVariable(commonData.DegreeBits),
DEGREE_QE: gl.NewVariable(1 << commonData.DegreeBits).ToQuadraticExtension(),
commonDataKIs: gl.Uint64ArrayToVariableArray(commonData.KIs),
evaluateGatesChip: evaluateGatesChip,
}
}
func (p *PlonkChip) expPowerOf2Extension(x gl.QuadraticExtensionVariable) gl.QuadraticExtensionVariable {
glApi := gl.New(p.api)
glApi := gl.NewChip(p.api)
for i := uint64(0); i < p.commonData.DegreeBits; i++ {
x = glApi.MulExtension(x, x)
}
@@ -64,7 +53,7 @@ func (p *PlonkChip) expPowerOf2Extension(x gl.QuadraticExtensionVariable) gl.Qua
func (p *PlonkChip) evalL0(x gl.QuadraticExtensionVariable, xPowN gl.QuadraticExtensionVariable) gl.QuadraticExtensionVariable {
// L_0(x) = (x^n - 1) / (n * (x - 1))
glApi := gl.New(p.api)
glApi := gl.NewChip(p.api)
evalZeroPoly := glApi.SubExtension(
xPowN,
gl.OneExtension(),
@@ -83,9 +72,9 @@ func (p *PlonkChip) checkPartialProducts(
numerators []gl.QuadraticExtensionVariable,
denominators []gl.QuadraticExtensionVariable,
challengeNum uint64,
openings variables.OpeningSet,
openings types.OpeningSet,
) []gl.QuadraticExtensionVariable {
glApi := gl.New(p.api)
glApi := gl.NewChip(p.api)
numPartProds := p.commonData.NumPartialProducts
quotDegreeFactor := p.commonData.QuotientDegreeFactor
@@ -117,18 +106,18 @@ func (p *PlonkChip) checkPartialProducts(
func (p *PlonkChip) evalVanishingPoly(
vars gates.EvaluationVars,
proofChallenges variables.ProofChallenges,
openings variables.OpeningSet,
proofChallenges types.ProofChallenges,
openings types.OpeningSet,
zetaPowN gl.QuadraticExtensionVariable,
) []gl.QuadraticExtensionVariable {
glApi := gl.New(p.api)
glApi := gl.NewChip(p.api)
constraintTerms := p.evaluateGatesChip.EvaluateGateConstraints(vars)
// Calculate the k[i] * x
sIDs := make([]gl.QuadraticExtensionVariable, p.commonData.Config.NumRoutedWires)
for i := uint64(0); i < p.commonData.Config.NumRoutedWires; i++ {
sIDs[i] = glApi.ScalarMulExtension(proofChallenges.PlonkZeta, p.commonDataKIs[i])
sIDs[i] = glApi.ScalarMulExtension(proofChallenges.PlonkZeta, p.commonData.KIs[i])
}
// Calculate L_0(zeta)
@@ -204,11 +193,11 @@ func (p *PlonkChip) evalVanishingPoly(
}
func (p *PlonkChip) Verify(
proofChallenges variables.ProofChallenges,
openings variables.OpeningSet,
proofChallenges types.ProofChallenges,
openings types.OpeningSet,
publicInputsHash poseidon.GoldilocksHashOut,
) {
glApi := gl.New(p.api)
glApi := gl.NewChip(p.api)
// Calculate zeta^n
zetaPowN := p.expPowerOf2Extension(proofChallenges.PlonkZeta)

View File

@@ -7,25 +7,23 @@ import (
"github.com/consensys/gnark/frontend"
"github.com/consensys/gnark/test"
"github.com/succinctlabs/gnark-plonky2-verifier/plonk"
"github.com/succinctlabs/gnark-plonky2-verifier/types"
"github.com/succinctlabs/gnark-plonky2-verifier/variables"
"github.com/succinctlabs/gnark-plonky2-verifier/verifier"
)
type TestPlonkCircuit struct {
ProofWithPis variables.ProofWithPublicInputs `gnark:",public"`
VerifierOnlyCircuitData variables.VerifierOnlyCircuitData `gnark:",public"`
CommonCircuitData types.CommonCircuitData
proofWithPIsFilename string `gnark:"-"`
commonCircuitDataFilename string `gnark:"-"`
verifierOnlyCircuitDataFilename string `gnark:"-"`
}
func (circuit *TestPlonkCircuit) Define(api frontend.API) error {
commonCircuitData := circuit.CommonCircuitData
verifierOnlyCircuitData := circuit.VerifierOnlyCircuitData
proofWithPis := circuit.ProofWithPis
proofWithPis := verifier.DeserializeProofWithPublicInputs(circuit.proofWithPIsFilename)
commonCircuitData := verifier.DeserializeCommonCircuitData(circuit.commonCircuitDataFilename)
verifierOnlyCircuitData := verifier.DeserializeVerifierOnlyCircuitData(circuit.verifierOnlyCircuitDataFilename)
verifierChip := verifier.NewVerifierChip(api, commonCircuitData)
publicInputsHash := verifierChip.GetPublicInputsHash(proofWithPis.PublicInputs)
proofChallenges := verifierChip.GetChallenges(proofWithPis.Proof, publicInputsHash, verifierOnlyCircuitData)
proofChallenges := verifierChip.GetChallenges(proofWithPis.Proof, publicInputsHash, commonCircuitData, verifierOnlyCircuitData)
plonkChip := plonk.NewPlonkChip(
api,
@@ -39,25 +37,13 @@ func (circuit *TestPlonkCircuit) Define(api frontend.API) error {
func TestPlonkDecodeBlock(t *testing.T) {
assert := test.NewAssert(t)
proofWithPIsFilename := "../testdata/decode_block/proof_with_public_inputs.json"
commonCircuitDataFilename := "../testdata/decode_block/common_circuit_data.json"
verifierOnlyCircuitDataFilename := "../testdata/decode_block/verifier_only_circuit_data.json"
proofWithPis := variables.DeserializeProofWithPublicInputs(types.ReadProofWithPublicInputs(proofWithPIsFilename))
commonCircuitData := types.ReadCommonCircuitData(commonCircuitDataFilename)
verifierOnlyCircuitData := variables.DeserializeVerifierOnlyCircuitData(types.ReadVerifierOnlyCircuitData(verifierOnlyCircuitDataFilename))
testCase := func() {
circuit := TestPlonkCircuit{
proofWithPis,
verifierOnlyCircuitData,
commonCircuitData,
}
witness := TestPlonkCircuit{
proofWithPis,
verifierOnlyCircuitData,
commonCircuitData,
proofWithPIsFilename: "../../data/decode_block/proof_with_public_inputs.json",
commonCircuitDataFilename: "../../data/decode_block/common_circuit_data.json",
verifierOnlyCircuitDataFilename: "../../data/decode_block/verifier_only_circuit_data.json",
}
witness := TestPlonkCircuit{}
err := test.IsSolved(&circuit, &witness, ecc.BN254.ScalarField())
assert.NoError(err)
}