Browse Source

initial work: gate interface and PublicInput

main
Nicholas Ward 2 years ago
parent
commit
7091e1e1b2
6 changed files with 151 additions and 1 deletions
  1. +50
    -0
      plonky2_verifier/gate.go
  2. +31
    -1
      plonky2_verifier/plonk.go
  3. +32
    -0
      plonky2_verifier/public_input.go
  4. +17
    -0
      plonky2_verifier/selectors.go
  5. +2
    -0
      plonky2_verifier/structs.go
  6. +19
    -0
      plonky2_verifier/vars.go

+ 50
- 0
plonky2_verifier/gate.go

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

+ 31
- 1
plonky2_verifier/plonk.go

@ -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
- 0
plonky2_verifier/public_input.go

@ -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
- 0
plonky2_verifier/selectors.go

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

+ 2
- 0
plonky2_verifier/structs.go

@ -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
- 0
plonky2_verifier/vars.go

@ -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…
Cancel
Save