@@ -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
2012const (
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+ }
0 commit comments