gnark-plonky2-verifier/plonky2_verifier/base_sum_gate.go
plonky2_verifier/base_sum_gate.goRaw
1package plonky2_verifier
2
3import (
4 "fmt"
5 . "gnark-plonky2-verifier/field"
6)
7
8const (
9 WIRE_SUM = 0
10 START_LIMBS = 1
11)
12
13type BaseSumGate struct {
14 numLimbs uint64
15 base uint64
16}
17
18func NewBaseSumGate(numLimbs uint64, base uint64) *BaseSumGate {
19 return &BaseSumGate{
20 numLimbs: numLimbs,
21 base: base,
22 }
23}
24
25func (g *BaseSumGate) Id() string {
26 return fmt.Sprintf("BaseSumGate { num_ops: %d } + Base: %d", g.numLimbs, g.base)
27}
28
29func (g *BaseSumGate) limbs() []uint64 {
30 limbIndices := make([]uint64, g.numLimbs)
31 for i := uint64(0); i < g.numLimbs; i++ {
32 limbIndices[i] = uint64(START_LIMBS + i)
33 }
34
35 return limbIndices
36}
37
38func (g *BaseSumGate) EvalUnfiltered(p *PlonkChip, vars EvaluationVars) []QuadraticExtension {
39 sum := vars.localWires[WIRE_SUM]
40 limbs := make([]QuadraticExtension, g.numLimbs)
41 limbIndices := g.limbs()
42 for i, limbIdx := range limbIndices {
43 limbs[i] = vars.localWires[limbIdx]
44 }
45
46 base_qe := p.qeAPI.FieldToQE(NewFieldElement(g.base))
47 computedSum := p.qeAPI.ReduceWithPowers(
48 limbs,
49 base_qe,
50 )
51
52 var constraints []QuadraticExtension
53 constraints = append(constraints, p.qeAPI.SubExtension(computedSum, sum))
54 for _, limb := range limbs {
55 acc := p.qeAPI.ONE_QE
56 for i := uint64(0); i < g.base; i++ {
57 difference := p.qeAPI.SubExtension(limb, p.qeAPI.FieldToQE(NewFieldElement(i)))
58 acc = p.qeAPI.MulExtension(acc, difference)
59 }
60 constraints = append(constraints, acc)
61 }
62
63 return constraints
64}