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