arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/plonk/gates/constant_gate.go
plonk/gates/constant_gate.goRaw
 1package gates
 2
 3import (
 4	"fmt"
 5	"regexp"
 6	"strconv"
 7
 8	"github.com/consensys/gnark/frontend"
 9	gl "github.com/succinctlabs/gnark-plonky2-verifier/goldilocks"
10)
11
12var constantGateRegex = regexp.MustCompile("ConstantGate { num_consts: (?P<numConsts>[0-9]+) }")
13
14func deserializeConstantGate(parameters map[string]string) Gate {
15	// Has the format "ConstantGate { num_consts: 2 }"
16	numConsts, hasNumConsts := parameters["numConsts"]
17	if !hasNumConsts {
18		panic("Missing field num_consts in ConstantGate")
19	}
20
21	numConstsInt, err := strconv.Atoi(numConsts)
22	if err != nil {
23		panic("Invalid num_consts field in ConstantGate")
24	}
25
26	return NewConstantGate(uint64(numConstsInt))
27}
28
29type ConstantGate struct {
30	numConsts uint64
31}
32
33func NewConstantGate(numConsts uint64) *ConstantGate {
34	return &ConstantGate{
35		numConsts: numConsts,
36	}
37}
38
39func (g *ConstantGate) Id() string {
40	return fmt.Sprintf("ConstantGate { num_consts: %d }", g.numConsts)
41}
42
43func (g *ConstantGate) ConstInput(i uint64) uint64 {
44	if i >= g.numConsts {
45		panic("Invalid constant index")
46	}
47	return i
48}
49
50func (g *ConstantGate) WireOutput(i uint64) uint64 {
51	if i >= g.numConsts {
52		panic("Invalid wire index")
53	}
54	return i
55}
56
57func (g *ConstantGate) EvalUnfiltered(
58	api frontend.API,
59	glApi gl.Chip,
60	vars EvaluationVars,
61) []gl.QuadraticExtensionVariable {
62	constraints := []gl.QuadraticExtensionVariable{}
63
64	for i := uint64(0); i < g.numConsts; i++ {
65		constraints = append(constraints, glApi.SubExtension(vars.localConstants[g.ConstInput(i)], vars.localWires[g.WireOutput(i)]))
66	}
67
68	return constraints
69}