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

Commit 41cb11e

Browse files
akokoshnakokoshn
andauthored
Handle using lookup tbales in proxy (#264)
Co-authored-by: akokoshn <[email protected]>
1 parent 87d4bab commit 41cb11e

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

include/nil/blueprint/blueprint/plonk/assignment_proxy.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ namespace nil {
125125
}
126126
}
127127

128+
void fill_selector(std::uint32_t index, const column_type& column) override {
129+
for (std::uint32_t i = 0; i < column.size(); i++) {
130+
used_rows.insert(i);
131+
}
132+
assignment_ptr->fill_selector(index, column);
133+
}
134+
128135
value_type &shared(std::uint32_t shared_index, std::uint32_t row_index) override {
129136
return assignment_ptr->shared(shared_index, row_index);
130137
}
@@ -198,6 +205,13 @@ namespace nil {
198205
return std::const_pointer_cast<const assignment<ArithmetizationType>>(assignment_ptr)->constant(constant_index, row_index);
199206
}
200207

208+
void fill_constant(std::uint32_t index, const column_type& column) override {
209+
for (std::uint32_t i = 0; i < column.size(); i++) {
210+
used_rows.insert(i);
211+
}
212+
assignment_ptr->fill_constant(index, column);
213+
}
214+
201215
std::uint32_t constants_amount() const override {
202216
return assignment_ptr->constants_amount();
203217
}

test/proxy.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,4 +389,85 @@ BOOST_AUTO_TEST_CASE(blueprint_assignment_proxy_save_shared_test) {
389389
BOOST_ASSERT(var_value(assignment, res[1]) == 2);
390390

391391
BOOST_ASSERT(assignment.shared_column_size(0) == 2);
392+
}
393+
394+
BOOST_AUTO_TEST_CASE(blueprint_assignment_proxy_fill_constant_test) {
395+
using BlueprintFieldType = typename nil::crypto3::algebra::curves::pallas::base_field_type;
396+
constexpr std::size_t WitnessColumns = 15;
397+
constexpr std::size_t PublicInputColumns = 1;
398+
constexpr std::size_t ConstantColumns = 5;
399+
constexpr std::size_t SelectorColumns = 35;
400+
401+
using ArithmetizationParams =
402+
nil::crypto3::zk::snark::plonk_arithmetization_params<WitnessColumns, PublicInputColumns, ConstantColumns, SelectorColumns>;
403+
using ArithmetizationType = nil::crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>;
404+
using var = nil::crypto3::zk::snark::plonk_variable<typename BlueprintFieldType::value_type>;
405+
using column_type = typename nil::crypto3::zk::snark::plonk_column<BlueprintFieldType>;
406+
407+
auto assignment_ptr = std::make_shared<assignment<ArithmetizationType>>();
408+
assignment_proxy<ArithmetizationType> assignment(assignment_ptr, 0);
409+
410+
const column_type constant_col = {1, 2, 3, 4, 5};
411+
assignment.fill_constant(1, constant_col);
412+
413+
BOOST_ASSERT(assignment.constant_column_size(1) == 5);
414+
std::set<uint32_t> used_rows = {0, 1, 2, 3, 4};
415+
BOOST_ASSERT(assignment.get_used_rows() == used_rows);
416+
}
417+
418+
BOOST_AUTO_TEST_CASE(blueprint_assignment_proxy_fill_selector_test) {
419+
using BlueprintFieldType = typename nil::crypto3::algebra::curves::pallas::base_field_type;
420+
constexpr std::size_t WitnessColumns = 15;
421+
constexpr std::size_t PublicInputColumns = 1;
422+
constexpr std::size_t ConstantColumns = 5;
423+
constexpr std::size_t SelectorColumns = 35;
424+
425+
using ArithmetizationParams =
426+
nil::crypto3::zk::snark::plonk_arithmetization_params<WitnessColumns, PublicInputColumns, ConstantColumns, SelectorColumns>;
427+
using ArithmetizationType = nil::crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>;
428+
using var = nil::crypto3::zk::snark::plonk_variable<typename BlueprintFieldType::value_type>;
429+
using column_type = typename nil::crypto3::zk::snark::plonk_column<BlueprintFieldType>;
430+
431+
auto assignment_ptr = std::make_shared<assignment<ArithmetizationType>>();
432+
assignment_proxy<ArithmetizationType> assignment(assignment_ptr, 0);
433+
434+
const column_type selector_col = {1, 2, 3, 4, 5};
435+
assignment.fill_selector(1, selector_col);
436+
437+
BOOST_ASSERT(assignment.selector_column_size(1) == 5);
438+
std::set<uint32_t> used_rows = {0, 1, 2, 3, 4};
439+
BOOST_ASSERT(assignment.get_used_rows() == used_rows);
440+
}
441+
442+
BOOST_AUTO_TEST_CASE(blueprint_proxy_call_pack_lookup_tables_test) {
443+
using BlueprintFieldType = typename nil::crypto3::algebra::curves::pallas::base_field_type;
444+
constexpr std::size_t WitnessColumns = 15;
445+
constexpr std::size_t PublicInputColumns = 1;
446+
constexpr std::size_t ConstantColumns = 5;
447+
constexpr std::size_t SelectorColumns = 35;
448+
449+
using ArithmetizationParams =
450+
nil::crypto3::zk::snark::plonk_arithmetization_params<WitnessColumns, PublicInputColumns, ConstantColumns, SelectorColumns>;
451+
using ArithmetizationType = nil::crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>;
452+
using var = nil::crypto3::zk::snark::plonk_variable<typename BlueprintFieldType::value_type>;
453+
using column_type = typename nil::crypto3::zk::snark::plonk_column<BlueprintFieldType>;
454+
typedef nil::crypto3::zk::snark::plonk_lookup_table<BlueprintFieldType> lookup_table_type;
455+
456+
auto bp_ptr = std::make_shared<circuit<ArithmetizationType>>();
457+
circuit_proxy<ArithmetizationType> bp(bp_ptr, 0);
458+
auto assignment_ptr = std::make_shared<assignment<ArithmetizationType>>();
459+
assignment_proxy<ArithmetizationType> assignment(assignment_ptr, 0);
460+
461+
std::vector<std::size_t> lookup_columns_indices = {0, 1, 2, 3, 4};
462+
std::size_t usable_rows_amount = assignment.allocated_rows();
463+
bp.reserve_table("binary_xor_table/full");
464+
465+
nil::crypto3::zk::snark::pack_lookup_tables(
466+
bp.get_reserved_indices(),
467+
bp.get_reserved_tables(),
468+
bp, assignment, lookup_columns_indices,
469+
usable_rows_amount);
470+
471+
std::set<uint32_t> used_rows = {0, 1, 2, 3, 4};
472+
BOOST_ASSERT(assignment.get_used_rows() == used_rows);
392473
}

0 commit comments

Comments
 (0)