gnark-plonky2-verifier/plonky2_verifier/reducing_extension_gate.go
plonky2_verifier/reducing_extension_gate.goRaw
1package plonky2_verifier
2
3import (
4 "fmt"
5 . "gnark-plonky2-verifier/field"
6)
7
8type ReducingExtensionGate struct {
9 numCoeffs uint64
10}
11
12const START_COEFFS = 3 * D
13
14func NewReducingExtensionGate(numCoeffs uint64) *ReducingExtensionGate {
15 return &ReducingExtensionGate{
16 numCoeffs: numCoeffs,
17 }
18}
19
20func (g *ReducingExtensionGate) Id() string {
21 return fmt.Sprintf("ReducingExtensionGate { num_ops: %d }", g.numCoeffs)
22}
23
24func (g *ReducingExtensionGate) wiresOutput() Range {
25 return Range{0, D}
26}
27
28func (g *ReducingExtensionGate) wiresAlpha() Range {
29 return Range{D, 2 * D}
30}
31
32func (g *ReducingExtensionGate) wiresOldAcc() Range {
33 return Range{2 * D, 3 * D}
34}
35
36func (g *ReducingExtensionGate) wiresCoeff(i uint64) Range {
37 return Range{START_COEFFS + D*i, START_COEFFS + D*(i+1)}
38}
39
40func (g *ReducingExtensionGate) startAccs() uint64 {
41 return START_COEFFS + g.numCoeffs*D
42}
43
44func (g *ReducingExtensionGate) 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 *ReducingExtensionGate) EvalUnfiltered(p *PlonkChip, vars EvaluationVars) []QuadraticExtension {
57 alpha := vars.GetLocalExtAlgebra(g.wiresAlpha())
58 oldAcc := vars.GetLocalExtAlgebra(g.wiresOldAcc())
59
60 coeffs := []QEAlgebra{}
61 for i := uint64(0); i < g.numCoeffs; i++ {
62 coeffs = append(coeffs, vars.GetLocalExtAlgebra(g.wiresCoeff(i)))
63 }
64
65 accs := []QEAlgebra{}
66 for i := uint64(0); i < g.numCoeffs; i++ {
67 accs = append(accs, vars.GetLocalExtAlgebra(g.wiresAccs(i)))
68 }
69
70 constraints := []QuadraticExtension{}
71 acc := oldAcc
72 for i := uint64(0); i < g.numCoeffs; i++ {
73 coeff := coeffs[i]
74 tmp := p.qeAPI.MulExtensionAlgebra(acc, alpha)
75 tmp = p.qeAPI.AddExtensionAlgebra(tmp, coeff)
76 tmp = p.qeAPI.SubExtensionAlgebra(tmp, accs[i])
77 for j := uint64(0); j < D; j++ {
78 constraints = append(constraints, tmp[j])
79 }
80 acc = accs[i]
81 }
82
83 return constraints
84}