arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/plonky2_verifier/reducing_gate.go
plonky2_verifier/reducing_gate.goRaw
 1package plonky2_verifier
 2
 3import (
 4	"fmt"
 5	. "gnark-plonky2-verifier/field"
 6)
 7
 8type ReducingGate struct {
 9	numCoeffs uint64
10}
11
12const START_COEFFS_REDUCING_GATE = 3 * D
13
14func NewReducingGate(numCoeffs uint64) *ReducingGate {
15	return &ReducingGate{
16		numCoeffs: numCoeffs,
17	}
18}
19
20func (g *ReducingGate) Id() string {
21	return fmt.Sprintf("ReducingExtensionGate { num_ops: %d }", g.numCoeffs)
22}
23
24func (g *ReducingGate) wiresOutput() Range {
25	return Range{0, D}
26}
27
28func (g *ReducingGate) wiresAlpha() Range {
29	return Range{D, 2 * D}
30}
31
32func (g *ReducingGate) wiresOldAcc() Range {
33	return Range{2 * D, 3 * D}
34}
35
36func (g *ReducingGate) wiresCoeff() Range {
37	return Range{START_COEFFS_REDUCING_GATE, START_COEFFS_REDUCING_GATE + g.numCoeffs}
38}
39
40func (g *ReducingGate) startAccs() uint64 {
41	return START_COEFFS_REDUCING_GATE + g.numCoeffs
42}
43
44func (g *ReducingGate) wiresAccs(i uint64) Range {
45	if i >= g.numCoeffs {
46		panic("Accumulator index out of bounds")
47	}
48
49	if i == g.numCoeffs-1 {
50		return g.wiresOutput()
51	}
52
53	return Range{g.startAccs() + D*i, g.startAccs() + D*(i+1)}
54}
55
56func (g *ReducingGate) EvalUnfiltered(p *PlonkChip, vars EvaluationVars) []QuadraticExtension {
57	alpha := vars.GetLocalExtAlgebra(g.wiresAlpha())
58	oldAcc := vars.GetLocalExtAlgebra(g.wiresOldAcc())
59
60	coeffs := []QuadraticExtension{}
61	coeffsRange := g.wiresCoeff()
62	for i := coeffsRange.start; i < coeffsRange.end; i++ {
63		coeffs = append(coeffs, vars.localWires[i])
64	}
65
66	accs := []QEAlgebra{}
67	for i := uint64(0); i < g.numCoeffs; i++ {
68		accs = append(accs, vars.GetLocalExtAlgebra(g.wiresAccs(i)))
69	}
70
71	constraints := []QuadraticExtension{}
72	acc := oldAcc
73	for i := uint64(0); i < g.numCoeffs; i++ {
74		var coeff QEAlgebra
75		for j := 0; j < D; j++ {
76			coeff[j] = p.qeAPI.ZERO_QE
77		}
78		coeff[0] = coeffs[i]
79		tmp := p.qeAPI.MulExtensionAlgebra(acc, alpha)
80		tmp = p.qeAPI.AddExtensionAlgebra(tmp, coeff)
81		tmp = p.qeAPI.SubExtensionAlgebra(tmp, accs[i])
82		for j := 0; j < D; j++ {
83			constraints = append(constraints, tmp[j])
84		}
85		acc = accs[i]
86	}
87
88	return constraints
89}