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