You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.4 KiB

package plonky2_verifier
import (
"fmt"
. "gnark-plonky2-verifier/field"
)
const (
WIRE_SUM = 0
START_LIMBS = 1
)
type BaseSumGate struct {
numLimbs uint64
base uint64
}
func NewBaseSumGate(numLimbs uint64, base uint64) *BaseSumGate {
return &BaseSumGate{
numLimbs: numLimbs,
base: base,
}
}
func (g *BaseSumGate) Id() string {
return fmt.Sprintf("BaseSumGate { num_ops: %d } + Base: %d", g.numLimbs, g.base)
}
func (g *BaseSumGate) limbs() []uint64 {
limbIndices := make([]uint64, g.numLimbs)
for i := uint64(0); i < g.numLimbs; i++ {
limbIndices[i] = uint64(START_LIMBS + i)
}
return limbIndices
}
func (g *BaseSumGate) EvalUnfiltered(p *PlonkChip, vars EvaluationVars) []QuadraticExtension {
sum := vars.localWires[WIRE_SUM]
limbs := make([]QuadraticExtension, g.numLimbs)
limbIndices := g.limbs()
for i, limbIdx := range limbIndices {
limbs[i] = vars.localWires[limbIdx]
}
base_qe := p.qeAPI.FieldToQE(NewFieldElement(g.base))
computedSum := p.qeAPI.ReduceWithPowers(
limbs,
base_qe,
)
var constraints []QuadraticExtension
constraints = append(constraints, p.qeAPI.SubExtension(computedSum, sum))
for _, limb := range limbs {
acc := p.qeAPI.ONE_QE
for i := uint64(0); i < g.base; i++ {
difference := p.qeAPI.SubExtension(limb, p.qeAPI.FieldToQE(NewFieldElement(i)))
acc = p.qeAPI.MulExtension(acc, difference)
}
constraints = append(constraints, acc)
}
return constraints
}