3434#include < nil/blueprint/blueprint/plonk/circuit.hpp>
3535#include < nil/blueprint/blueprint/plonk/assignment.hpp>
3636#include < nil/blueprint/component.hpp>
37+ #include < nil/blueprint/manifest.hpp>
3738#include < nil/blueprint/basic_non_native_policy.hpp>
3839
3940namespace nil {
4041 namespace blueprint {
4142 namespace components {
4243
43- template <typename ArithmetizationType, typename Ed25519Type, std::uint32_t WitnessesAmount,
44- typename NonNativePolicyType>
44+ template <typename ArithmetizationType, typename Ed25519Type, typename NonNativePolicyType>
4545 class bool_scalar_multiplication ;
4646
4747 template <typename BlueprintFieldType, typename ArithmetizationParams>
4848 class bool_scalar_multiplication <crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>,
49- typename crypto3::algebra::curves::ed25519, 9 , basic_non_native_policy<BlueprintFieldType>>:
50- public plonk_component<BlueprintFieldType, ArithmetizationParams, 9 , 0 , 0 > {
49+ typename crypto3::algebra::curves::ed25519, basic_non_native_policy<BlueprintFieldType>>:
50+ public plonk_component<BlueprintFieldType, ArithmetizationParams, 0 , 0 > {
5151
52- constexpr static const std::uint32_t WitnessesAmount = 9 ;
53-
54- using component_type = plonk_component<BlueprintFieldType, ArithmetizationParams, WitnessesAmount, 0 , 0 >;
52+ using component_type = plonk_component<BlueprintFieldType, ArithmetizationParams, 0 , 0 >;
5553 using operating_field_type = typename crypto3::algebra::fields::curve25519_base_field;
5654 using non_native_policy_type = basic_non_native_policy<BlueprintFieldType>;
5755
5856 public:
59-
6057 using var = typename component_type::var;
58+ using manifest_type = nil::blueprint::plonk_component_manifest;
59+
60+ class gate_manifest_type : public component_gate_manifest {
61+ public:
62+ std::uint32_t gates_amount () const override {
63+ return bool_scalar_multiplication::gates_amount;
64+ }
65+ };
6166
62- constexpr static const std::size_t rows_amount = 2 ;
67+ static gate_manifest get_gate_manifest (std::size_t witness_amount,
68+ std::size_t lookup_column_amount) {
69+ static gate_manifest manifest = gate_manifest (gate_manifest_type ());
70+ return manifest;
71+ }
72+
73+ static manifest_type get_manifest () {
74+ static manifest_type manifest = manifest_type (
75+ std::shared_ptr<manifest_param>(
76+ new manifest_single_value_param (9 )),
77+ false
78+ );
79+ return manifest;
80+ }
81+
82+ constexpr static std::size_t get_rows_amount (std::size_t witness_amount,
83+ std::size_t lookup_column_amount) {
84+ return 2 ;
85+ }
86+
87+ const std::size_t rows_amount = get_rows_amount(this ->witness_amount (), 0);
6388
6489 constexpr static const std::size_t gates_amount = 1 ;
6590
@@ -96,43 +121,42 @@ namespace nil {
96121
97122 template <typename ContainerType>
98123 bool_scalar_multiplication (ContainerType witness):
99- component_type (witness, {}, {}){};
124+ component_type (witness, {}, {}, get_manifest() ){};
100125
101126 template <typename WitnessContainerType, typename ConstantContainerType,
102127 typename PublicInputContainerType>
103128 bool_scalar_multiplication (WitnessContainerType witness, ConstantContainerType constant,
104129 PublicInputContainerType public_input):
105- component_type (witness, constant, public_input){};
130+ component_type (witness, constant, public_input, get_manifest() ){};
106131
107132 bool_scalar_multiplication (std::initializer_list<
108133 typename component_type::witness_container_type::value_type> witnesses,
109134 std::initializer_list<
110135 typename component_type::constant_container_type::value_type> constants,
111136 std::initializer_list<
112137 typename component_type::public_input_container_type::value_type> public_inputs):
113- component_type (witnesses, constants, public_inputs){};
138+ component_type (witnesses, constants, public_inputs, get_manifest() ){};
114139
115140 };
116141
117142 template <typename BlueprintFieldType,
118- typename ArithmetizationParams,
119- std::int32_t WitnessesAmount>
143+ typename ArithmetizationParams>
120144 using plonk_bool_scalar_multiplication =
121145 bool_scalar_multiplication<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>,
122146 typename crypto3::algebra::curves::ed25519,
123- WitnessesAmount,
124147 basic_non_native_policy<BlueprintFieldType>>;
125148
126149 template <typename BlueprintFieldType, typename ArithmetizationParams>
127- typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 >::result_type
150+ typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams>::result_type
128151 generate_assignments (
129- const plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 > &component,
130- assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>> &assignment,
152+ const plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams> &component,
153+ assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>>
154+ &assignment,
131155 const typename plonk_bool_scalar_multiplication<BlueprintFieldType,
132- ArithmetizationParams, 9 >::input_type instance_input,
156+ ArithmetizationParams>::input_type & instance_input,
133157 const std::uint32_t start_row_index) {
134158 using Ed25519Type = typename crypto3::algebra::curves::ed25519;
135- using var = typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 >::var;
159+ using var = typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams>::var;
136160
137161 std::size_t row = start_row_index;
138162 typename Ed25519Type::base_field_type::integral_type b = typename Ed25519Type::base_field_type::integral_type (var_value (assignment, instance_input.k ).data );
@@ -164,19 +188,21 @@ namespace nil {
164188 assignment.witness (component.W (7 ), row) = b * T_x_array[2 ];
165189 assignment.witness (component.W (8 ), row) = b * T_x_array[3 ];
166190 std::array<var, 4 > Q_x = {var (component.W (5 ), row), var (component.W (6 ), row), var (component.W (7 ), row), var (component.W (8 ), row)};
167-
168- return typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 >::result_type (
169- component, start_row_index);
191+
192+ return typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams>::result_type
193+ ( component, start_row_index);
170194 }
171195
172196 template <typename BlueprintFieldType, typename ArithmetizationParams>
173197 void generate_gates (
174- const plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 > &component,
198+ const plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams> &component,
175199 circuit<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>> &bp,
176- assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>> &assignment,
177- const typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 >::input_type &instance_input,
200+ assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>>
201+ &assignment,
202+ const typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams>::input_type
203+ &instance_input,
178204 const std::size_t first_selector_index) {
179- using var = typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 >::var;
205+ using var = typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams>::var;
180206
181207 auto constraint_9 = bp.add_constraint (
182208 var (component.W (4 ), 0 )*( var (component.W (4 ), 0 ) - 1 ));
@@ -199,21 +225,23 @@ namespace nil {
199225 auto constraint_8 = bp.add_constraint (
200226 var (component.W (8 ), +1 ) - var (component.W (3 ), +1 ) * var (component.W (4 ), +1 ));
201227
202- bp.add_gate (first_selector_index,
203- {constraint_9, constraint_10,
228+ bp.add_gate (first_selector_index,
229+ {constraint_9, constraint_10,
204230 constraint_1, constraint_2, constraint_3, constraint_4,
205231 constraint_5, constraint_6, constraint_7, constraint_8});
206-
232+
207233 }
208234
209235 template <typename BlueprintFieldType, typename ArithmetizationParams>
210236 void generate_copy_constraints (
211- const plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 > &component,
237+ const plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams> &component,
212238 circuit<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>> &bp,
213- assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>> &assignment,
214- const typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 >::input_type &instance_input,
239+ assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>>
240+ &assignment,
241+ const typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams>::input_type
242+ &instance_input,
215243 const std::size_t start_row_index) {
216- using var = typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 >::var;
244+ using var = typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams>::var;
217245
218246 std::size_t row = start_row_index;
219247
@@ -230,12 +258,13 @@ namespace nil {
230258 }
231259
232260 template <typename BlueprintFieldType, typename ArithmetizationParams>
233- typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 >::result_type
261+ typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams>::result_type
234262 generate_circuit (
235- const plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 > &component,
263+ const plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams> &component,
236264 circuit<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>> &bp,
237- assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>> &assignment,
238- const typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 >::input_type &instance_input,
265+ assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>>
266+ &assignment,
267+ const typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams>::input_type &instance_input,
239268 const std::size_t start_row_index){
240269
241270 auto selector_iterator = assignment.find_selector (component);
@@ -251,7 +280,7 @@ namespace nil {
251280
252281 generate_copy_constraints (component, bp, assignment, instance_input, row);
253282
254- return typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams, 9 >::result_type (
283+ return typename plonk_bool_scalar_multiplication<BlueprintFieldType, ArithmetizationParams>::result_type (
255284 component, start_row_index);
256285 }
257286
0 commit comments