arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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}