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