arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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}