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}