mirror of
https://github.com/arnaucube/gnark-plonky2-verifier.git
synced 2026-01-12 09:01:32 +01:00
initial work: gate interface and PublicInput
This commit is contained in:
50
plonky2_verifier/gate.go
Normal file
50
plonky2_verifier/gate.go
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
package plonky2_verifier
|
||||||
|
|
||||||
|
import (
|
||||||
|
. "gnark-plonky2-verifier/field"
|
||||||
|
)
|
||||||
|
|
||||||
|
type gate interface {
|
||||||
|
EvalUnfiltered(vars EvaluationVars) []QuadraticExtension
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PlonkChip) computeFilter(
|
||||||
|
row int,
|
||||||
|
groupRange Range,
|
||||||
|
s QuadraticExtension,
|
||||||
|
manySelector bool,
|
||||||
|
) QuadraticExtension {
|
||||||
|
product := p.qeAPI.ONE_QE
|
||||||
|
for i := groupRange.start; i < groupRange.end; i++ {
|
||||||
|
if i == uint64(row) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
product = p.qeAPI.MulExtension(product, p.qeAPI.SubExtension(p.qeAPI.FieldToQE(NewFieldElement(i)), s))
|
||||||
|
}
|
||||||
|
|
||||||
|
if manySelector {
|
||||||
|
product = p.qeAPI.MulExtension(product, p.qeAPI.SubExtension(p.qeAPI.FieldToQE(NewFieldElement(UNUSED_SELECTOR)), s))
|
||||||
|
}
|
||||||
|
|
||||||
|
return product
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PlonkChip) evalFiltered(
|
||||||
|
g gate,
|
||||||
|
vars EvaluationVars,
|
||||||
|
row int,
|
||||||
|
selectorIndex int,
|
||||||
|
groupRange Range,
|
||||||
|
numSelectors int,
|
||||||
|
) []QuadraticExtension {
|
||||||
|
filter := p.computeFilter(row, groupRange, vars.localConstants[selectorIndex], numSelectors > 1)
|
||||||
|
|
||||||
|
vars.RemovePrefix(numSelectors)
|
||||||
|
|
||||||
|
unfiltered := g.EvalUnfiltered(vars)
|
||||||
|
for i := range unfiltered {
|
||||||
|
unfiltered[i] = p.qeAPI.MulExtension(unfiltered[i], filter)
|
||||||
|
}
|
||||||
|
return unfiltered
|
||||||
|
}
|
||||||
@@ -116,8 +116,38 @@ func (p *PlonkChip) checkPartialProducts(
|
|||||||
return partialProductChecks
|
return partialProductChecks
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *PlonkChip) evalFiltered(
|
||||||
|
g gate,
|
||||||
|
vars EvaluationVars,
|
||||||
|
row int,
|
||||||
|
selectorIndex int,
|
||||||
|
groupRange Range,
|
||||||
|
numSelectors int
|
||||||
|
) []QuadraticExtension {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PlonkChip) evaluateGateConstraints(
|
||||||
|
commonData CommonCircuitData,
|
||||||
|
x QuadraticExtension,
|
||||||
|
vars EvaluationVars,
|
||||||
|
localZs []QuadraticExtension,
|
||||||
|
nextZs []QuadraticExtension,
|
||||||
|
partialProducts []QuadraticExtension,
|
||||||
|
sSigmas []QuadraticExtension,
|
||||||
|
betas []F,
|
||||||
|
gammas []F,
|
||||||
|
alphas []F,
|
||||||
|
) []QuadraticExtension {
|
||||||
|
constraints := make([]QuadraticExtension, commonData.NumGateConstraints)
|
||||||
|
|
||||||
|
for i, gate := range commonData.Gates {
|
||||||
|
selectorIndex := commonData.selector
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (p *PlonkChip) evalVanishingPoly(proofChallenges ProofChallenges, openings OpeningSet, zetaPowN QuadraticExtension) []QuadraticExtension {
|
func (p *PlonkChip) evalVanishingPoly(proofChallenges ProofChallenges, openings OpeningSet, zetaPowN QuadraticExtension) []QuadraticExtension {
|
||||||
// TODO: evaluate_gate_contraints logic should be implemented here. See https://github.com/mir-protocol/plonky2/blob/main/plonky2/src/plonk/vanishing_poly.rs#L39
|
// TODO: evaluate_gate_constraints logic should be implemented here. See https://github.com/mir-protocol/plonky2/blob/main/plonky2/src/plonk/vanishing_poly.rs#L39
|
||||||
|
|
||||||
// Calculate the k[i] * x
|
// Calculate the k[i] * x
|
||||||
sIDs := make([]QuadraticExtension, p.commonData.Config.NumRoutedWires)
|
sIDs := make([]QuadraticExtension, p.commonData.Config.NumRoutedWires)
|
||||||
|
|||||||
32
plonky2_verifier/public_input.go
Normal file
32
plonky2_verifier/public_input.go
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package plonky2_verifier
|
||||||
|
|
||||||
|
import (
|
||||||
|
. "gnark-plonky2-verifier/field"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PublicInputGate struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PublicInputGate) WiresPublicInputsHash() []int {
|
||||||
|
return []int{0, 1, 2, 3}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PublicInputGate) EvalUnfiltered(pc *PlonkChip, vars EvaluationVars) []QuadraticExtension {
|
||||||
|
constraints := []QuadraticExtension{}
|
||||||
|
|
||||||
|
wires := p.WiresPublicInputsHash()
|
||||||
|
hash_parts := vars.publicInputsHash.elements
|
||||||
|
for i := 0; i < 4; i++ {
|
||||||
|
wire := wires[i]
|
||||||
|
hash_part := hash_parts[i]
|
||||||
|
|
||||||
|
diff := pc.qeAPI.SubExtension(vars.localWires[wire], pc.qeAPI.FieldToQE(hash_part))
|
||||||
|
constraints = append(constraints, diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
return constraints
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PublicInputGate) EvalFiltered(vars EvaluationVars) []QuadraticExtension {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
17
plonky2_verifier/selectors.go
Normal file
17
plonky2_verifier/selectors.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package plonky2_verifier
|
||||||
|
|
||||||
|
const UNUSED_SELECTOR = ^uint64(0) // max uint
|
||||||
|
|
||||||
|
type Range struct {
|
||||||
|
start uint64
|
||||||
|
end uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
type SelectorsInfo struct {
|
||||||
|
selectorIndices []uint64
|
||||||
|
groups []Range
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SelectorsInfo) NumSelectors() int {
|
||||||
|
return len(s.groups)
|
||||||
|
}
|
||||||
@@ -101,6 +101,8 @@ type CircuitConfig struct {
|
|||||||
type CommonCircuitData struct {
|
type CommonCircuitData struct {
|
||||||
Config CircuitConfig
|
Config CircuitConfig
|
||||||
FriParams FriParams
|
FriParams FriParams
|
||||||
|
Gates []gate
|
||||||
|
SelectorsInfo SelectorsInfo
|
||||||
DegreeBits uint64
|
DegreeBits uint64
|
||||||
QuotientDegreeFactor uint64
|
QuotientDegreeFactor uint64
|
||||||
NumGateConstraints uint64
|
NumGateConstraints uint64
|
||||||
|
|||||||
19
plonky2_verifier/vars.go
Normal file
19
plonky2_verifier/vars.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package plonky2_verifier
|
||||||
|
|
||||||
|
import (
|
||||||
|
. "gnark-plonky2-verifier/field"
|
||||||
|
)
|
||||||
|
|
||||||
|
type HashOut struct {
|
||||||
|
elements [4]F
|
||||||
|
}
|
||||||
|
|
||||||
|
type EvaluationVars struct {
|
||||||
|
localConstants []QuadraticExtension
|
||||||
|
localWires []QuadraticExtension
|
||||||
|
publicInputsHash HashOut
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EvaluationVars) RemovePrefix(numSelectors int) {
|
||||||
|
e.localConstants = e.localConstants[numSelectors:]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user