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	poseidonMdsGateRegex:        deserializePoseidonMdsGate,
27	publicInputGateRegex:        deserializePublicInputGate,
28	randomAccessGateRegex:       deserializeRandomAccessGate,
29	reducingExtensionGateRegex:  deserializeReducingExtensionGate,
30	reducingGateRegex:           deserializeReducingGate,
31}
32
33func GateInstanceFromId(gateId string) Gate {
34	for regex, handler := range gateRegexHandlers {
35		matches := regex.FindStringSubmatch(gateId)
36		if matches != nil {
37			parameters := make(map[string]string)
38			for i, name := range regex.SubexpNames() {
39				if i != 0 && name != "" {
40					parameters[name] = matches[i]
41				}
42			}
43
44			if matches != nil {
45				return handler(parameters)
46			}
47		}
48	}
49	panic(fmt.Sprintf("Unknown gate ID %s", gateId))
50}