Skip to content
This repository was archived by the owner on Feb 17, 2025. It is now read-only.

Commit 1e9ceab

Browse files
Iluvmagicknkaskov
authored andcommitted
Added component manifest. Changed component interface.
1 parent 646c326 commit 1e9ceab

File tree

89 files changed

+5829
-3857
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+5829
-3857
lines changed

.github/workflows/run_tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ jobs:
2424
blueprint_algebra_fields_plonk_exponentiation_test,
2525
blueprint_algebra_curves_plonk_unified_addition_test,
2626
blueprint_algebra_curves_plonk_variable_base_scalar_mul_test,
27-
blueprint_algebra_curves_plonk_decomposed_variable_base_scalar_mul_test,
2827
blueprint_verifiers_kimchi_sponge_oracles_test,
2928
blueprint_hashes_plonk_poseidon_test,
3029
blueprint_algebra_curves_plonk_endo_scalar_test,
@@ -53,6 +52,7 @@ jobs:
5352
blueprint_hashes_plonk_sha256_test,
5453
blueprint_hashes_plonk_sha512_test,
5554
blueprint_algebra_fields_plonk_sqrt_test,
55+
blueprint_manifest_test,
5656
] # Tests to execute
5757
steps:
5858
- uses: cachix/install-nix-action@v23

include/nil/blueprint/assert.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,12 @@ namespace nil {
4242
} // namespace blueprint
4343
} // namespace nil
4444

45+
#define BLUEPRINT_RELEASE_ASSERT( expr ) \
46+
( (expr) ? (void)0 : nil::blueprint::detail::blueprint_assert( __LINE__, __FILE__, #expr))
47+
4548
#ifdef BLUEPRINT_DEBUG_ENABLED
4649
#define BLUEPRINT_ASSERT( expr ) \
47-
( (expr) ? (void)0 : nil::blueprint::detail::blueprint_assert( __LINE__, __FILE__, #expr))
50+
BLUEPRINT_RELEASE_ASSERT( expr )
4851
#else
4952
#define BLUEPRINT_ASSERT( expr ) ((void)0)
5053
#endif

include/nil/blueprint/component.hpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@
2626
#ifndef CRYPTO3_BLUEPRINT_COMPONENT_HPP
2727
#define CRYPTO3_BLUEPRINT_COMPONENT_HPP
2828

29+
#include <string>
30+
2931
#include <nil/crypto3/zk/snark/arithmetization/plonk/constraint_system.hpp>
3032
#include <nil/crypto3/zk/snark/arithmetization/constraint_satisfaction_problems/r1cs.hpp>
31-
3233
#include <nil/blueprint/detail/get_component_id.hpp>
34+
#include <nil/blueprint/manifest.hpp>
35+
#include <nil/blueprint/assert.hpp>
3336

3437
namespace nil {
3538
namespace blueprint {
@@ -42,16 +45,16 @@ namespace nil {
4245
template<typename ArithmetizationType>
4346
class component{};
4447

45-
template<typename BlueprintFieldType, typename ArithmetizationParams, std::uint32_t WitnessAmount,
46-
std::uint32_t ConstantAmount, std::uint32_t PublicInputAmount>
48+
template<typename BlueprintFieldType, typename ArithmetizationParams,
49+
std::uint32_t ConstantAmount, std::uint32_t PublicInputAmount>
4750
class plonk_component:
4851
public component<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>> {
4952
protected:
5053

51-
using witness_container_type = std::array<std::uint32_t, WitnessAmount>;
54+
using witness_container_type = std::vector<std::uint32_t>;
5255
using constant_container_type = std::array<std::uint32_t, ConstantAmount>;
5356
using public_input_container_type = std::array<std::uint32_t, PublicInputAmount>;
54-
57+
using manifest_type = nil::blueprint::plonk_component_manifest;
5558
public:
5659

5760
witness_container_type _W;
@@ -67,7 +70,7 @@ namespace nil {
6770
* @param[in] internal witness signed index. For -1, last witness assumed.
6871
*/
6972
typename witness_container_type::value_type W(std::int32_t index) const {
70-
return _W[(WitnessAmount + index)%WitnessAmount];
73+
return _W[(_W.size() + index) % _W.size()];
7174
}
7275

7376
/**
@@ -104,10 +107,13 @@ namespace nil {
104107
template <typename WitnessContainerType, typename ConstantContainerType,
105108
typename PublicInputContainerType>
106109
plonk_component(WitnessContainerType witness, ConstantContainerType constant,
107-
PublicInputContainerType public_input) {
108-
std::copy_n(std::make_move_iterator(witness.begin()), WitnessAmount, _W.begin());
110+
PublicInputContainerType public_input, const manifest_type &manifest) {
111+
_W.resize(witness.size());
112+
std::copy_n(std::make_move_iterator(witness.begin()), witness.size(), _W.begin());
109113
std::copy_n(std::make_move_iterator(constant.begin()), ConstantAmount, _C.begin());
110114
std::copy_n(std::make_move_iterator(public_input.begin()), PublicInputAmount, _PI.begin());
115+
116+
BLUEPRINT_RELEASE_ASSERT(manifest.check_manifest(*this));
111117
}
112118

113119
std::size_t witness_amount() const {
@@ -160,7 +166,6 @@ namespace nil {
160166

161167
virtual detail::blueprint_component_id_type get_id() const { return std::string(""); };
162168
};
163-
164169
} // namespace components
165170
} // namespace blueprint
166171
} // namespace nil

include/nil/blueprint/components/algebra/curves/edwards/plonk/non_native/bool_scalar_multiplication.hpp

Lines changed: 68 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -34,32 +34,57 @@
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

3940
namespace 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

Comments
 (0)