mirror of
https://github.com/logos-storage/gnark-plonky2-verifier.git
synced 2026-01-05 14:43:10 +00:00
initial work: gate interface and PublicInput
This commit is contained in:
parent
57b7937ae8
commit
7091e1e1b2
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
|
||||
}
|
||||
|
||||
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 {
|
||||
// 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
|
||||
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 {
|
||||
Config CircuitConfig
|
||||
FriParams FriParams
|
||||
Gates []gate
|
||||
SelectorsInfo SelectorsInfo
|
||||
DegreeBits uint64
|
||||
QuotientDegreeFactor 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:]
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user