gnark-plonky2-verifier/plonky2_verifier/gate.go
plonky2_verifier/gate.goRaw
1package plonky2_verifier
2
3import (
4 . "gnark-plonky2-verifier/field"
5)
6
7type gate interface {
8 EvalUnfiltered(vars EvaluationVars) []QuadraticExtension
9}
10
11func (p *PlonkChip) computeFilter(
12 row uint64,
13 groupRange Range,
14 s QuadraticExtension,
15 manySelector bool,
16) QuadraticExtension {
17 product := p.qeAPI.ONE_QE
18 for i := groupRange.start; i < groupRange.end; i++ {
19 if i == uint64(row) {
20 continue
21 }
22
23 product = p.qeAPI.MulExtension(product, p.qeAPI.SubExtension(p.qeAPI.FieldToQE(NewFieldElement(i)), s))
24 }
25
26 if manySelector {
27 product = p.qeAPI.MulExtension(product, p.qeAPI.SubExtension(p.qeAPI.FieldToQE(NewFieldElement(UNUSED_SELECTOR)), s))
28 }
29
30 return product
31}
32
33func (p *PlonkChip) evalFiltered(
34 g gate,
35 vars EvaluationVars,
36 row uint64,
37 selectorIndex uint64,
38 groupRange Range,
39 numSelectors uint64,
40) []QuadraticExtension {
41 filter := p.computeFilter(row, groupRange, vars.localConstants[selectorIndex], numSelectors > 1)
42
43 vars.RemovePrefix(numSelectors)
44
45 unfiltered := g.EvalUnfiltered(vars)
46 for i := range unfiltered {
47 unfiltered[i] = p.qeAPI.MulExtension(unfiltered[i], filter)
48 }
49 return unfiltered
50}