package plonky2_verifier
|
|
|
|
import (
|
|
"fmt"
|
|
. "gnark-plonky2-verifier/field"
|
|
)
|
|
|
|
type ReducingExtensionGate struct {
|
|
numCoeffs uint64
|
|
}
|
|
|
|
const START_COEFFS_REDUCING_EXTENSION_GATE = 3 * D
|
|
|
|
func NewReducingExtensionGate(numCoeffs uint64) *ReducingExtensionGate {
|
|
return &ReducingExtensionGate{
|
|
numCoeffs: numCoeffs,
|
|
}
|
|
}
|
|
|
|
func (g *ReducingExtensionGate) Id() string {
|
|
return fmt.Sprintf("ReducingExtensionGate { num_ops: %d }", g.numCoeffs)
|
|
}
|
|
|
|
func (g *ReducingExtensionGate) wiresOutput() Range {
|
|
return Range{0, D}
|
|
}
|
|
|
|
func (g *ReducingExtensionGate) wiresAlpha() Range {
|
|
return Range{D, 2 * D}
|
|
}
|
|
|
|
func (g *ReducingExtensionGate) wiresOldAcc() Range {
|
|
return Range{2 * D, 3 * D}
|
|
}
|
|
|
|
func (g *ReducingExtensionGate) wiresCoeff(i uint64) Range {
|
|
return Range{START_COEFFS_REDUCING_EXTENSION_GATE + D*i, START_COEFFS_REDUCING_EXTENSION_GATE + D*(i+1)}
|
|
}
|
|
|
|
func (g *ReducingExtensionGate) startAccs() uint64 {
|
|
return START_COEFFS_REDUCING_EXTENSION_GATE + g.numCoeffs*D
|
|
}
|
|
|
|
func (g *ReducingExtensionGate) wiresAccs(i uint64) Range {
|
|
if i >= g.numCoeffs {
|
|
panic("Accumulator index out of bounds")
|
|
}
|
|
|
|
if i == g.numCoeffs-1 {
|
|
return g.wiresOutput()
|
|
}
|
|
|
|
return Range{g.startAccs() + D*i, g.startAccs() + D*(i+1)}
|
|
}
|
|
|
|
func (g *ReducingExtensionGate) EvalUnfiltered(p *PlonkChip, vars EvaluationVars) []QuadraticExtension {
|
|
alpha := vars.GetLocalExtAlgebra(g.wiresAlpha())
|
|
oldAcc := vars.GetLocalExtAlgebra(g.wiresOldAcc())
|
|
|
|
coeffs := []QEAlgebra{}
|
|
for i := uint64(0); i < g.numCoeffs; i++ {
|
|
coeffs = append(coeffs, vars.GetLocalExtAlgebra(g.wiresCoeff(i)))
|
|
}
|
|
|
|
accs := []QEAlgebra{}
|
|
for i := uint64(0); i < g.numCoeffs; i++ {
|
|
accs = append(accs, vars.GetLocalExtAlgebra(g.wiresAccs(i)))
|
|
}
|
|
|
|
constraints := []QuadraticExtension{}
|
|
acc := oldAcc
|
|
for i := uint64(0); i < g.numCoeffs; i++ {
|
|
coeff := coeffs[i]
|
|
tmp := p.qeAPI.MulExtensionAlgebra(acc, alpha)
|
|
tmp = p.qeAPI.AddExtensionAlgebra(tmp, coeff)
|
|
tmp = p.qeAPI.SubExtensionAlgebra(tmp, accs[i])
|
|
for j := uint64(0); j < D; j++ {
|
|
constraints = append(constraints, tmp[j])
|
|
}
|
|
acc = accs[i]
|
|
}
|
|
|
|
return constraints
|
|
}
|