gnark-plonky2-verifier/verifier/internal/gates/constant_gate.go
verifier/internal/gates/constant_gate.goRaw
1package gates
2
3import (
4 "fmt"
5 "regexp"
6 "strconv"
7
8 "github.com/consensys/gnark/frontend"
9 "github.com/succinctlabs/gnark-plonky2-verifier/field"
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(api frontend.API, qeAPI *field.QuadraticExtensionAPI, vars EvaluationVars) []field.QuadraticExtension {
58 constraints := []field.QuadraticExtension{}
59
60 for i := uint64(0); i < g.numConsts; i++ {
61 constraints = append(constraints, qeAPI.SubExtension(vars.localConstants[g.ConstInput(i)], vars.localWires[g.WireOutput(i)]))
62 }
63
64 return constraints
65}