arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/verifier/internal/gates/gate.go
verifier/internal/gates/gate.goRaw
 1package gates
 2
 3import (
 4	"fmt"
 5	"regexp"
 6
 7	"github.com/consensys/gnark/frontend"
 8	"github.com/succinctlabs/gnark-plonky2-verifier/field"
 9)
10
11type Gate interface {
12	Id() string
13	EvalUnfiltered(api frontend.API, qeAPI *field.QuadraticExtensionAPI, vars EvaluationVars) []field.QuadraticExtension
14}
15
16var gateRegexHandlers = map[*regexp.Regexp]func(parameters map[string]string) Gate{
17	aritheticGateRegex:          deserializeArithmeticGate,
18	aritheticExtensionGateRegex: deserializeExtensionArithmeticGate,
19	baseSumGateRegex:            deserializeBaseSumGate,
20	constantGateRegex:           deserializeConstantGate,
21	cosetInterpolationGateRegex: deserializeCosetInterpolationGate,
22	exponentiationGateRegex:     deserializeExponentiationGate,
23	mulExtensionGateRegex:       deserializeMulExtensionGate,
24	noopGateRegex:               deserializeNoopGate,
25	poseidonGateRegex:           deserializePoseidonGate,
26	publicInputGateRegex:        deserializePublicInputGate,
27	randomAccessGateRegex:       deserializeRandomAccessGate,
28	reducingExtensionGateRegex:  deserializeReducingExtensionGate,
29	reducingGateRegex:           deserializeReducingGate,
30}
31
32func GateInstanceFromId(gateId string) Gate {
33	for regex, handler := range gateRegexHandlers {
34		matches := regex.FindStringSubmatch(gateId)
35		if matches != nil {
36			parameters := make(map[string]string)
37			for i, name := range regex.SubexpNames() {
38				if i != 0 && name != "" {
39					parameters[name] = matches[i]
40				}
41			}
42
43			if matches != nil {
44				return handler(parameters)
45			}
46		}
47	}
48	panic(fmt.Sprintf("Unknown gate ID %s", gateId))
49}