arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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	"regexp"
  7	"strconv"
  8)
  9
 10var reducingExtensionGateRegex = regexp.MustCompile("ReducingExtensionGate { num_coeffs: (?P<numCoeffs>[0-9]+) }")
 11
 12func deserializeReducingExtensionGate(parameters map[string]string) gate {
 13	// Has the format "ReducingGate { num_coeffs: 33 }"
 14	numCoeffs, hasNumCoeffs := parameters["numCoeffs"]
 15	if !hasNumCoeffs {
 16		panic("Missing field num_coeffs in ReducingExtensionGate")
 17	}
 18
 19	numCoeffsInt, err := strconv.Atoi(numCoeffs)
 20	if err != nil {
 21		panic("Invalid num_coeffs field in ReducingExtensionGate")
 22	}
 23
 24	return NewReducingExtensionGate(uint64(numCoeffsInt))
 25}
 26
 27type ReducingExtensionGate struct {
 28	numCoeffs uint64
 29}
 30
 31const START_COEFFS_REDUCING_EXTENSION_GATE = 3 * D
 32
 33func NewReducingExtensionGate(numCoeffs uint64) *ReducingExtensionGate {
 34	return &ReducingExtensionGate{
 35		numCoeffs: numCoeffs,
 36	}
 37}
 38
 39func (g *ReducingExtensionGate) Id() string {
 40	return fmt.Sprintf("ReducingExtensionGate { num_ops: %d }", g.numCoeffs)
 41}
 42
 43func (g *ReducingExtensionGate) wiresOutput() Range {
 44	return Range{0, D}
 45}
 46
 47func (g *ReducingExtensionGate) wiresAlpha() Range {
 48	return Range{D, 2 * D}
 49}
 50
 51func (g *ReducingExtensionGate) wiresOldAcc() Range {
 52	return Range{2 * D, 3 * D}
 53}
 54
 55func (g *ReducingExtensionGate) wiresCoeff(i uint64) Range {
 56	return Range{START_COEFFS_REDUCING_EXTENSION_GATE + D*i, START_COEFFS_REDUCING_EXTENSION_GATE + D*(i+1)}
 57}
 58
 59func (g *ReducingExtensionGate) startAccs() uint64 {
 60	return START_COEFFS_REDUCING_EXTENSION_GATE + g.numCoeffs*D
 61}
 62
 63func (g *ReducingExtensionGate) wiresAccs(i uint64) Range {
 64	if i >= g.numCoeffs {
 65		panic("Accumulator index out of bounds")
 66	}
 67
 68	if i == g.numCoeffs-1 {
 69		return g.wiresOutput()
 70	}
 71
 72	return Range{g.startAccs() + D*i, g.startAccs() + D*(i+1)}
 73}
 74
 75func (g *ReducingExtensionGate) EvalUnfiltered(p *PlonkChip, vars EvaluationVars) []QuadraticExtension {
 76	alpha := vars.GetLocalExtAlgebra(g.wiresAlpha())
 77	oldAcc := vars.GetLocalExtAlgebra(g.wiresOldAcc())
 78
 79	coeffs := []QEAlgebra{}
 80	for i := uint64(0); i < g.numCoeffs; i++ {
 81		coeffs = append(coeffs, vars.GetLocalExtAlgebra(g.wiresCoeff(i)))
 82	}
 83
 84	accs := []QEAlgebra{}
 85	for i := uint64(0); i < g.numCoeffs; i++ {
 86		accs = append(accs, vars.GetLocalExtAlgebra(g.wiresAccs(i)))
 87	}
 88
 89	constraints := []QuadraticExtension{}
 90	acc := oldAcc
 91	for i := uint64(0); i < g.numCoeffs; i++ {
 92		coeff := coeffs[i]
 93		tmp := p.qeAPI.MulExtensionAlgebra(acc, alpha)
 94		tmp = p.qeAPI.AddExtensionAlgebra(tmp, coeff)
 95		tmp = p.qeAPI.SubExtensionAlgebra(tmp, accs[i])
 96		for j := uint64(0); j < D; j++ {
 97			constraints = append(constraints, tmp[j])
 98		}
 99		acc = accs[i]
100	}
101
102	return constraints
103}