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}