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(computedOutput, output))
55 }
56
57 return constraints
58}