arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/plonky2_verifier/arithmetic_gate.go
plonky2_verifier/arithmetic_gate.goRaw
 1package plonky2_verifier
 2
 3import (
 4	"fmt"
 5	. "gnark-plonky2-verifier/field"
 6)
 7
 8type ArithmeticGate struct {
 9	numOps uint64
10}
11
12func NewArithmeticGate(numOps uint64) *ArithmeticGate {
13	return &ArithmeticGate{
14		numOps: numOps,
15	}
16}
17
18func (g *ArithmeticGate) Id() string {
19	return fmt.Sprintf("ArithmeticGate { num_ops: %d }", g.numOps)
20}
21
22func (g *ArithmeticGate) WireIthMultiplicand0(i uint64) uint64 {
23	return 4 * i
24}
25
26func (g *ArithmeticGate) WireIthMultiplicand1(i uint64) uint64 {
27	return 4*i + 1
28}
29
30func (g *ArithmeticGate) WireIthAddend(i uint64) uint64 {
31	return 4*i + 2
32}
33
34func (g *ArithmeticGate) WireIthOutput(i uint64) uint64 {
35	return 4*i + 3
36}
37
38func (g *ArithmeticGate) EvalUnfiltered(p *PlonkChip, vars EvaluationVars) []QuadraticExtension {
39	const0 := vars.localConstants[0]
40	const1 := vars.localConstants[1]
41
42	constraints := []QuadraticExtension{}
43	for i := uint64(0); i < g.numOps; i++ {
44		multiplicand0 := vars.localWires[g.WireIthMultiplicand0(i)]
45		multiplicand1 := vars.localWires[g.WireIthMultiplicand1(i)]
46		addend := vars.localWires[g.WireIthAddend(i)]
47		output := vars.localWires[g.WireIthOutput(i)]
48
49		computedOutput := p.qeAPI.AddExtension(
50			p.qeAPI.MulExtension(p.qeAPI.MulExtension(multiplicand0, multiplicand1), const0),
51			p.qeAPI.MulExtension(addend, const1),
52		)
53
54		constraints = append(constraints, p.qeAPI.SubExtension(output, computedOutput))
55	}
56
57	return constraints
58}