Skip to content

Commit b5c7a66

Browse files
committed
xxx: work
1 parent e10e32a commit b5c7a66

File tree

8 files changed

+295
-272
lines changed

8 files changed

+295
-272
lines changed

prover/zkevm/prover/bls/circuits_add.go

Lines changed: 18 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -7,156 +7,36 @@ import (
77
"github.com/consensys/gnark/std/algebra/emulated/sw_bls12381"
88
"github.com/consensys/gnark/std/evmprecompiles"
99
"github.com/consensys/gnark/std/math/emulated"
10-
"github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk"
11-
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
12-
"github.com/consensys/linea-monorepo/prover/protocol/query"
13-
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
14-
)
15-
16-
const (
17-
NAME_BLS_ADD = "BLS_ADD"
1810
)
1911

2012
const (
2113
nbRowsPerG1Add = 3 * nbG1Limbs // 2 for the inputs, 1 for the output
2214
nbRowsPerG2Add = 3 * nbG2Limbs // 2 for the inputs, 1 for the output
2315
)
2416

25-
type BlsAddDataSource struct {
26-
CsAdd ifaces.Column
27-
CsCurveMembership ifaces.Column
28-
Limb ifaces.Column
29-
Index ifaces.Column
30-
Counter ifaces.Column
31-
IsData ifaces.Column
32-
IsRes ifaces.Column
33-
}
34-
35-
func newAddDataSource(comp *wizard.CompiledIOP, g group) *BlsAddDataSource {
36-
return &BlsAddDataSource{
37-
CsAdd: comp.Columns.GetHandle(ifaces.ColIDf("bls.CIRCUIT_SELECTOR_%s_ADD", g.String())),
38-
CsCurveMembership: comp.Columns.GetHandle(ifaces.ColIDf("bls.CURVE_MEMBERSHIP_%s_ADD", g.StringCurve())),
39-
Limb: comp.Columns.GetHandle("bls.LIMB"),
40-
Index: comp.Columns.GetHandle("bls.INDEX"),
41-
Counter: comp.Columns.GetHandle("bls.CT"),
42-
IsData: comp.Columns.GetHandle(ifaces.ColIDf("bls.DATA_%s_ADD", g.String())),
43-
IsRes: comp.Columns.GetHandle(ifaces.ColIDf("bls.RSLT_%s_ADD", g.String())),
44-
}
45-
}
46-
47-
type BlsAdd struct {
48-
*BlsAddDataSource
49-
*UnalignedCurveMembershipData
50-
AlignedAddGnarkData *plonk.Alignment
51-
AlignedCurveMembershipGnarkData *plonk.Alignment
52-
53-
size int
54-
*Limits
55-
group
56-
}
57-
58-
func newAdd(comp *wizard.CompiledIOP, g group, limits *Limits, src *BlsAddDataSource, plonkOptions []query.PlonkOption) *BlsAdd {
59-
size := limits.sizeAddIntegration(g)
60-
ucmd := newUnalignedCurveMembershipData(comp, g, size, &UnalignedCurveMembershipDataSource{
61-
Limb: src.Limb,
62-
CsCurveMembership: src.CsCurveMembership,
63-
Counter: src.Counter,
64-
})
65-
66-
toAlignAdd := &plonk.CircuitAlignmentInput{
67-
Name: fmt.Sprintf("%s_%s_ALIGNMENT", NAME_BLS_ADD, g.String()),
68-
Round: ROUND_NR,
69-
DataToCircuitMask: src.CsAdd,
70-
DataToCircuit: src.Limb,
71-
Circuit: NewAddCircuit(g, limits),
72-
NbCircuitInstances: limits.nbAddCircuitInstances(g),
73-
PlonkOptions: plonkOptions,
74-
}
75-
toAlignCurveMembership := &plonk.CircuitAlignmentInput{
76-
Name: fmt.Sprintf("%s_%s_CURVE_MEMBERSHIP_ALIGNMENT", NAME_BLS_ADD, g.StringCurve()),
77-
Round: ROUND_NR,
78-
DataToCircuitMask: ucmd.IsActive,
79-
DataToCircuit: ucmd.GnarkData,
80-
Circuit: NewCheckCircuit(g, CURVE, limits),
81-
NbCircuitInstances: limits.nbCurveMembershipCircuitInstances(g),
82-
PlonkOptions: plonkOptions,
83-
InputFillerKey: membershipInputFillerKey(g, CURVE),
84-
}
85-
86-
res := &BlsAdd{
87-
BlsAddDataSource: src,
88-
UnalignedCurveMembershipData: ucmd,
89-
AlignedAddGnarkData: plonk.DefineAlignment(comp, toAlignAdd),
90-
AlignedCurveMembershipGnarkData: plonk.DefineAlignment(comp, toAlignCurveMembership),
91-
size: size,
92-
Limits: limits,
93-
group: g,
94-
}
95-
96-
return res
97-
}
98-
99-
func (ba *BlsAdd) Assign(run *wizard.ProverRuntime) {
100-
ba.UnalignedCurveMembershipData.Assign(run)
101-
ba.AlignedAddGnarkData.Assign(run)
102-
ba.AlignedCurveMembershipGnarkData.Assign(run)
103-
}
104-
105-
func NewG1AddZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsAdd {
106-
return newAdd(
107-
comp,
108-
G1,
109-
limits,
110-
newAddDataSource(comp, G1),
111-
[]query.PlonkOption{query.PlonkRangeCheckOption(16, 6, true)},
112-
)
113-
}
114-
115-
func NewG2AddZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsAdd {
116-
return newAdd(
117-
comp,
118-
G2,
119-
limits,
120-
newAddDataSource(comp, G2),
121-
[]query.PlonkOption{query.PlonkRangeCheckOption(16, 6, true)},
122-
)
123-
}
124-
125-
type MultiAddCircuit[C convertable[T], T element] struct {
126-
Instances []AddInstance[C, T]
127-
}
128-
129-
func NewAddCircuit(g group, limits *Limits) frontend.Circuit {
130-
switch g {
131-
case G1:
132-
return &MultiAddCircuit[g1ElementWizard, sw_bls12381.G1Affine]{Instances: make([]AddInstance[g1ElementWizard, sw_bls12381.G1Affine], limits.NbG1AddInputInstances)}
133-
case G2:
134-
return &MultiAddCircuit[g2ElementWizard, sw_bls12381.G2Affine]{Instances: make([]AddInstance[g2ElementWizard, sw_bls12381.G2Affine], limits.NbG2AddInputInstances)}
135-
default:
136-
panic(fmt.Sprintf("unknown group for bls add circuit: %v", g))
137-
}
138-
}
139-
140-
type AddInstance[C convertable[T], T element] struct {
17+
type addInstance[C convertable[T], T element] struct {
14118
InputLeft, InputRight C `gnark:",public"`
14219
Res C `gnark:",public"`
14320
}
21+
type multiAddCircuit[C convertable[T], T element] struct {
22+
Instances []addInstance[C, T]
23+
}
14424

145-
func (c *MultiAddCircuit[C, T]) Define(api frontend.API) error {
25+
func (c *multiAddCircuit[C, T]) Define(api frontend.API) error {
14626
f, err := emulated.NewField[sw_bls12381.BaseField](api)
14727
if err != nil {
14828
return fmt.Errorf("new field: %w", err)
14929
}
15030
nbInstances := len(c.Instances)
15131
switch vv := any(c.Instances).(type) {
152-
case []AddInstance[g1ElementWizard, sw_bls12381.G1Affine]:
32+
case []addInstance[g1ElementWizard, sw_bls12381.G1Affine]:
15333
for i := 0; i < nbInstances; i++ {
15434
left := vv[i].InputLeft.ToElement(api, f)
15535
right := vv[i].InputRight.ToElement(api, f)
15636
expected := vv[i].Res.ToElement(api, f)
15737
evmprecompiles.ECAddG1BLS(api, &left, &right, &expected)
15838
}
159-
case []AddInstance[g2ElementWizard, sw_bls12381.G2Affine]:
39+
case []addInstance[g2ElementWizard, sw_bls12381.G2Affine]:
16040
for i := 0; i < nbInstances; i++ {
16141
left := vv[i].InputLeft.ToElement(api, f)
16242
right := vv[i].InputRight.ToElement(api, f)
@@ -169,3 +49,14 @@ func (c *MultiAddCircuit[C, T]) Define(api frontend.API) error {
16949

17050
return nil
17151
}
52+
53+
func newAddCircuit(g group, limits *Limits) frontend.Circuit {
54+
switch g {
55+
case G1:
56+
return &multiAddCircuit[g1ElementWizard, sw_bls12381.G1Affine]{Instances: make([]addInstance[g1ElementWizard, sw_bls12381.G1Affine], limits.NbG1AddInputInstances)}
57+
case G2:
58+
return &multiAddCircuit[g2ElementWizard, sw_bls12381.G2Affine]{Instances: make([]addInstance[g2ElementWizard, sw_bls12381.G2Affine], limits.NbG2AddInputInstances)}
59+
default:
60+
panic(fmt.Sprintf("unknown group for bls add circuit: %v", g))
61+
}
62+
}

prover/zkevm/prover/bls/circuits_add_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ func TestBlsG1Add(t *testing.T) {
1818
}
1919
ct := csvtraces.MustOpenCsvFile("testdata/bls_g1_add_input.csv")
2020
var blsAdd *BlsAdd
21-
var blsAddSource *BlsAddDataSource
21+
var blsAddSource *blsAddDataSource
2222
cmp := wizard.Compile(
2323
func(b *wizard.Builder) {
24-
blsAddSource = &BlsAddDataSource{
24+
blsAddSource = &blsAddDataSource{
2525
CsAdd: ct.GetCommit(b, "CIRCUIT_SELECTOR_G1_ADD"),
2626
Limb: ct.GetCommit(b, "LIMB"),
2727
Index: ct.GetCommit(b, "INDEX"),
@@ -56,10 +56,10 @@ func TestBlsG2Add(t *testing.T) {
5656
}
5757
ct := csvtraces.MustOpenCsvFile("testdata/bls_g2_add_input.csv")
5858
var blsAdd *BlsAdd
59-
var blsAddSource *BlsAddDataSource
59+
var blsAddSource *blsAddDataSource
6060
cmp := wizard.Compile(
6161
func(b *wizard.Builder) {
62-
blsAddSource = &BlsAddDataSource{
62+
blsAddSource = &blsAddDataSource{
6363
CsAdd: ct.GetCommit(b, "CIRCUIT_SELECTOR_G2_ADD"),
6464
Limb: ct.GetCommit(b, "LIMB"),
6565
Index: ct.GetCommit(b, "INDEX"),

prover/zkevm/prover/bls/circuits_maps.go

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,45 +10,21 @@ import (
1010
"github.com/consensys/gnark/std/math/emulated"
1111
)
1212

13-
type MultiMapToG1Circuit[C convertable[T], T element] struct {
14-
Instances []MapToInstance[C, T] `gnark:",public"`
15-
}
16-
17-
func newMultiMapToG1Circuit(g group, limits *Limits) frontend.Circuit {
18-
switch g {
19-
case G1:
20-
res := &MultiMapToG1Circuit[g1ElementWizard, sw_bls12381.G1Affine]{
21-
Instances: make([]MapToInstance[g1ElementWizard, sw_bls12381.G1Affine], limits.NbG1MapToInputInstances),
22-
}
23-
for i := range res.Instances {
24-
res.Instances[i].Input = make([]emulated.Element[sw_bls12381.BaseField], 1)
25-
}
26-
return res
27-
case G2:
28-
res := &MultiMapToG1Circuit[g2ElementWizard, sw_bls12381.G2Affine]{
29-
Instances: make([]MapToInstance[g2ElementWizard, sw_bls12381.G2Affine], limits.NbG2MapToInputInstances),
30-
}
31-
for i := range res.Instances {
32-
res.Instances[i].Input = make([]emulated.Element[sw_bls12381.BaseField], 2)
33-
}
34-
return res
35-
default:
36-
panic(fmt.Sprintf("unknown group %s for bls map to G1 circuit", g.String()))
37-
}
38-
}
39-
40-
type MapToInstance[C convertable[T], T element] struct {
13+
type mapInstance[C convertable[T], T element] struct {
4114
Input []emulated.Element[sw_bls12381.BaseField] // len==1 for G1, len==2 for G2
4215
Mapped C
4316
}
17+
type multiMapCircuit[C convertable[T], T element] struct {
18+
Instances []mapInstance[C, T] `gnark:",public"`
19+
}
4420

45-
func (c *MultiMapToG1Circuit[C, T]) Define(api frontend.API) error {
21+
func (c *multiMapCircuit[C, T]) Define(api frontend.API) error {
4622
fp, err := emulated.NewField[sw_bls12381.BaseField](api)
4723
if err != nil {
4824
return fmt.Errorf("new field: %w", err)
4925
}
5026
switch vv := any(c.Instances).(type) {
51-
case []MapToInstance[g1ElementWizard, sw_bls12381.G1Affine]:
27+
case []mapInstance[g1ElementWizard, sw_bls12381.G1Affine]:
5228
for i := range c.Instances {
5329
if len(c.Instances[i].Input) != 1 {
5430
return fmt.Errorf("instance %d expected 1 input for G1 map to G1, got %d", i, len(c.Instances[i].Input))
@@ -58,7 +34,7 @@ func (c *MultiMapToG1Circuit[C, T]) Define(api frontend.API) error {
5834
return fmt.Errorf("instance %d map to G1: %w", i, err)
5935
}
6036
}
61-
case []MapToInstance[g2ElementWizard, sw_bls12381.G2Affine]:
37+
case []mapInstance[g2ElementWizard, sw_bls12381.G2Affine]:
6238
for i := range c.Instances {
6339
if len(c.Instances[i].Input) != 2 {
6440
return fmt.Errorf("expected 2 inputs for G2 map to G1, got %d", len(c.Instances[i].Input))
@@ -77,3 +53,26 @@ func (c *MultiMapToG1Circuit[C, T]) Define(api frontend.API) error {
7753
}
7854
return nil
7955
}
56+
57+
func NewMapCircuit(g group, limits *Limits) frontend.Circuit {
58+
switch g {
59+
case G1:
60+
res := &multiMapCircuit[g1ElementWizard, sw_bls12381.G1Affine]{
61+
Instances: make([]mapInstance[g1ElementWizard, sw_bls12381.G1Affine], limits.NbG1MapToInputInstances),
62+
}
63+
for i := range res.Instances {
64+
res.Instances[i].Input = make([]emulated.Element[sw_bls12381.BaseField], 1)
65+
}
66+
return res
67+
case G2:
68+
res := &multiMapCircuit[g2ElementWizard, sw_bls12381.G2Affine]{
69+
Instances: make([]mapInstance[g2ElementWizard, sw_bls12381.G2Affine], limits.NbG2MapToInputInstances),
70+
}
71+
for i := range res.Instances {
72+
res.Instances[i].Input = make([]emulated.Element[sw_bls12381.BaseField], 2)
73+
}
74+
return res
75+
default:
76+
panic(fmt.Sprintf("unknown group %s for bls map to G1 circuit", g.String()))
77+
}
78+
}

0 commit comments

Comments
 (0)