From 604da5e7f9010bf94c9af2a2679c119eb8e6cbd2 Mon Sep 17 00:00:00 2001 From: akokoshn Date: Mon, 20 Nov 2023 08:48:13 +0200 Subject: [PATCH 1/3] Enable lookup --- bin/assigner/src/main.cpp | 213 ++++++++++++++++++++--------------- bin/transpiler/src/main.cpp | 2 +- examples/cpp/CMakeLists.txt | 6 +- examples/rust/CMakeLists.txt | 4 +- libs/assigner | 2 +- libs/blueprint | 2 +- libs/crypto3 | 2 +- 7 files changed, 131 insertions(+), 100 deletions(-) diff --git a/bin/assigner/src/main.cpp b/bin/assigner/src/main.cpp index f5f440fd..59b38e9c 100644 --- a/bin/assigner/src/main.cpp +++ b/bin/assigner/src/main.cpp @@ -90,21 +90,21 @@ void print_circuit(const circuit_proxy &circuit_proxy, using AssignmentTableType = assignment_proxy; using variable_type = crypto3::zk::snark::plonk_variable; - const auto gates = circuit_proxy.gates(); - const std::set& used_gates_idx = circuit_proxy.get_used_gates(); + const auto& gates = circuit_proxy.gates(); + const auto& used_gates_idx = circuit_proxy.get_used_gates(); typename ConstraintSystemType::gates_container_type used_gates; for (const auto &it : used_gates_idx) { used_gates.push_back(gates[it]); } - const auto copy_constraints = circuit_proxy.copy_constraints(); + const auto& copy_constraints = circuit_proxy.copy_constraints(); typename ConstraintSystemType::copy_constraints_container_type used_copy_constraints; - const std::set& used_copy_constraints_idx = circuit_proxy.get_used_copy_constraints(); + const auto& used_copy_constraints_idx = circuit_proxy.get_used_copy_constraints(); for (const auto &it : used_copy_constraints_idx) { used_copy_constraints.push_back(copy_constraints[it]); } if (rename_required) { - const auto used_rows = table_proxy.get_used_rows(); + const auto& used_rows = table_proxy.get_used_rows(); std::uint32_t local_row = 0; for (const auto &row : used_rows) { for (auto &constraint : used_copy_constraints) { @@ -127,16 +127,16 @@ void print_circuit(const circuit_proxy &circuit_proxy, } } - const auto lookup_gates = circuit_proxy.lookup_gates(); + const auto& lookup_gates = circuit_proxy.lookup_gates(); typename ConstraintSystemType::lookup_gates_container_type used_lookup_gates; - const std::set& used_lookup_gates_idx = circuit_proxy.get_used_lookup_gates(); + const auto& used_lookup_gates_idx = circuit_proxy.get_used_lookup_gates(); for (const auto &it : used_lookup_gates_idx) { used_lookup_gates.push_back(lookup_gates[it]); } - const auto lookup_tables = circuit_proxy.lookup_tables(); + const auto& lookup_tables = circuit_proxy.lookup_tables(); typename ConstraintSystemType::lookup_tables_type used_lookup_tables; - const std::set& used_lookup_tables_idx = circuit_proxy.get_used_lookup_tables(); + const auto& used_lookup_tables_idx = circuit_proxy.get_used_lookup_tables(); for (const auto &it : used_lookup_tables_idx) { used_lookup_tables.push_back(lookup_tables[it]); } @@ -170,66 +170,18 @@ enum class print_column_kind { SELECTOR }; -template -void fill_vector_value(std::vector &table_values, const assignment_proxy &table_proxy, - print_column_kind column_kind, std::uint32_t num_cols, std::uint32_t num_rows, std::uint32_t padding) { - for(std::size_t i = 0; i < num_cols; i++) { - for(std::size_t j = 0; j < num_rows; j++){ - ValueType val; - switch (column_kind) { - case print_column_kind::WITNESS: { - if (j < table_proxy.witness_column_size(i)) { - table_values.push_back(table_proxy.witness(i, j)); - } else { - table_values.push_back(0); - } - break; - } - case print_column_kind::SHARED: { - if (j < table_proxy.shared_column_size(i)) { - table_values.push_back(table_proxy.shared(i, j)); - } else { - table_values.push_back(0); - } - break; - } - case print_column_kind::PUBLIC_INPUT: { - if (j < table_proxy.public_input_column_size(i)) { - table_values.push_back(table_proxy.public_input(i, j)); - } else { - table_values.push_back(0); - } - break; - } - case print_column_kind::CONSTANT: { - if (j < table_proxy.constant_column_size(i)) { - table_values.push_back(table_proxy.constant(i, j)); - } else { - table_values.push_back(0); - } - break; - } - case print_column_kind::SELECTOR: { - if (j < table_proxy.selector_column_size(i)) { - table_values.push_back(table_proxy.selector(i, j)); - } else { - table_values.push_back(0); - } - break; - } - default: { - table_values.push_back(0); - } - }; - } - for(std::uint32_t j = 0; j < padding; j++){ +template +void fill_vector_value(std::vector &table_values, const ContainerType &table_col, std::uint32_t padding) { + std::copy(table_col.begin(), table_col.end(), std::back_inserter(table_values)); + for(std::uint32_t j = table_col.size(); j < padding; j++){ table_values.push_back(0); } - } } -template -void print_assignment_table(const assignment_proxy &table_proxy, print_table_kind print_kind, std::ostream &out = std::cout) { +template +void print_assignment_table(const assignment_proxy &table_proxy, + print_table_kind print_kind, + std::ostream &out = std::cout) { using AssignmentTableType = assignment_proxy; std::uint32_t usable_rows_amount; std::uint32_t total_columns; @@ -238,20 +190,34 @@ void print_assignment_table(const assignment_proxy &table_p std::uint32_t witness_size = table_proxy.witnesses_amount(); std::uint32_t constant_size = table_proxy.constants_amount(); std::uint32_t selector_size = table_proxy.selectors_amount(); + const auto lookup_constant_cols = table_proxy.get_lookup_constant_cols(); + const auto lookup_selector_cols = table_proxy.get_lookup_selector_cols(); if (print_kind == print_table_kind::PRIVATE) { + constant_size = constant_size - table_proxy.get_lookup_constant_amount(); + selector_size = selector_size - table_proxy.get_lookup_selector_amount(); total_columns = witness_size + constant_size + selector_size; usable_rows_amount = table_proxy.get_used_rows().size(); } else if (print_kind == print_table_kind::SHARED) { - total_columns = shared_size + public_input_size; + constant_size = table_proxy.get_lookup_constant_amount(); + selector_size = table_proxy.get_lookup_selector_amount(); + total_columns = shared_size + public_input_size + constant_size + selector_size; std::uint32_t max_shared_size = 0; std::uint32_t max_public_inputs_size = 0; + std::uint32_t max_constant_size = 0; + std::uint32_t max_selector_size = 0; for (std::uint32_t i = 0; i < shared_size; i++) { max_shared_size = std::max(max_shared_size, table_proxy.shared_column_size(i)); } for (std::uint32_t i = 0; i < public_input_size; i++) { max_public_inputs_size = std::max(max_public_inputs_size, table_proxy.public_input_column_size(i)); } - usable_rows_amount = std::max(max_shared_size, max_public_inputs_size); + for (const auto &i : lookup_constant_cols) { + max_constant_size = std::max(max_constant_size, table_proxy.constant_column_size(i)); + } + for (const auto &i : lookup_selector_cols) { + max_selector_size = std::max(max_selector_size, table_proxy.selector_column_size(i)); + } + usable_rows_amount = std::max({max_shared_size, max_public_inputs_size, max_constant_size, max_selector_size}); } else { // FULL total_columns = AssignmentTableType::arithmetization_params::total_columns; std::uint32_t max_witness_size = 0; @@ -280,7 +246,6 @@ void print_assignment_table(const assignment_proxy &table_p if (padded_rows_amount < 8) { padded_rows_amount = 8; } - const std::uint32_t padding = padded_rows_amount - usable_rows_amount; using TTypeBase = nil::marshalling::field_type; using plonk_assignment_table = nil::marshalling::types::bundle< @@ -296,27 +261,65 @@ void print_assignment_table(const assignment_proxy &table_p > > >; + using column_type = typename crypto3::zk::snark::plonk_column; std::vector table_values; if (print_kind == print_table_kind::FULL) { - fill_vector_value - (table_values, table_proxy, print_column_kind::WITNESS, witness_size, usable_rows_amount, padding); - fill_vector_value - (table_values, table_proxy, print_column_kind::PUBLIC_INPUT, public_input_size, usable_rows_amount, padding); - fill_vector_value - (table_values, table_proxy, print_column_kind::CONSTANT, constant_size, usable_rows_amount, padding); - fill_vector_value - (table_values, table_proxy, print_column_kind::SELECTOR, selector_size, usable_rows_amount, padding); + for (std::uint32_t i = 0; i < witness_size; i++) { + fill_vector_value + (table_values, table_proxy.witness(i), padded_rows_amount); + } + for (std::uint32_t i = 0; i < public_input_size; i++) { + fill_vector_value + (table_values, table_proxy.public_input(i), padded_rows_amount); + } + for (std::uint32_t i = 0; i < constant_size; i++) { + fill_vector_value + (table_values, table_proxy.constant(i), padded_rows_amount); + } + for (std::uint32_t i = 0; i < selector_size; i++) { + fill_vector_value + (table_values, table_proxy.selector(i), padded_rows_amount); + } } else if (print_kind == print_table_kind::SHARED) { - fill_vector_value - (table_values, table_proxy, print_column_kind::PUBLIC_INPUT, public_input_size, usable_rows_amount, padding); - fill_vector_value - (table_values, table_proxy, print_column_kind::SHARED, shared_size, usable_rows_amount, padding); + for (std::uint32_t i = 0; i < public_input_size; i++) { + fill_vector_value + (table_values, table_proxy.public_input(i), padded_rows_amount); + } + for (std::uint32_t i = 0; i < shared_size; i++) { + fill_vector_value + (table_values, table_proxy.shared(i), padded_rows_amount); + } + for (const auto &i : table_proxy.get_lookup_constant_cols()) { + fill_vector_value + (table_values, table_proxy.constant(i), padded_rows_amount); + } + for (const auto &i : table_proxy.get_lookup_selector_cols()) { + fill_vector_value + (table_values, table_proxy.selector(i), padded_rows_amount); + } } else { - const auto rows = table_proxy.get_used_rows(); + const std::uint32_t padding = padded_rows_amount - usable_rows_amount; + const auto& rows = table_proxy.get_used_rows(); + + std::vector constant_cols; + const auto& lookup_constant_cols = table_proxy.get_lookup_constant_cols(); + for (std::uint32_t i = 0; i < table_proxy.constants_amount(); i++) { + if (lookup_constant_cols.find(i) == lookup_constant_cols.end()) { + constant_cols.push_back(i); + } + } + std::vector selector_cols; + const auto& lookup_selector_cols = table_proxy.get_lookup_selector_cols(); + for (std::uint32_t i = 0; i < table_proxy.selectors_amount(); i++) { + if (lookup_selector_cols.find(i) == lookup_selector_cols.end()) { + selector_cols.push_back(i); + } + } for( std::size_t i = 0; i < AssignmentTableType::arithmetization_params::witness_columns; i++ ){ + const auto column_size = table_proxy.witness_column_size(i); for(const auto& j : rows){ - if (j < table_proxy.witness_column_size(i)) { + if (j < column_size) { table_values.push_back(table_proxy.witness(i, j)); } else { table_values.push_back(0); @@ -326,9 +329,10 @@ void print_assignment_table(const assignment_proxy &table_p table_values.push_back(0); } } - for( std::size_t i = 0; i < AssignmentTableType::arithmetization_params::constant_columns; i++ ){ + for(const auto& i : constant_cols) { + const auto column_size = table_proxy.constant_column_size(i); for(const auto& j : rows){ - if (j < table_proxy.constant_column_size(i)) { + if (j < column_size) { table_values.push_back(table_proxy.constant(i, j)); } else { table_values.push_back(0); @@ -338,9 +342,10 @@ void print_assignment_table(const assignment_proxy &table_p table_values.push_back(0); } } - for( std::size_t i = 0; i < AssignmentTableType::arithmetization_params::selector_columns; i++ ){ - for(const auto& j : rows){ - if (j < table_proxy.selector_column_size(i)) { + for(const auto& i : selector_cols) { + const auto column_size = table_proxy.selector_column_size(i); + for(const auto& j : rows) { + if (j < column_size) { table_values.push_back(table_proxy.selector(i, j)); } else { table_values.push_back(0); @@ -376,9 +381,10 @@ int curve_dependent_main(std::string bytecode_file_name, const std::string &policy, std::uint32_t max_num_provers) { using BlueprintFieldType = typename CurveType::base_field_type; + constexpr std::size_t WitnessColumns = 15; constexpr std::size_t PublicInputColumns = 1; - constexpr std::size_t ConstantColumns = 5; + constexpr std::size_t ConstantColumns = 30; constexpr std::size_t SelectorColumns = 35; using ArithmetizationParams = @@ -433,6 +439,32 @@ int curve_dependent_main(std::string bytecode_file_name, ASSERT_MSG(!parser_instance.assignments.empty() && !parser_instance.circuits.empty(), "Not found any proxy for prover" ); + // pack lookup tables + if (parser_instance.circuits[0].get_reserved_tables().size() > 0) { + std::vector lookup_columns_indices; + const auto& lookup_tables = parser_instance.circuits[0].get_reserved_tables(); + const std::uint32_t max_usable_rows = 500000; + // looking for free constant columns + std::uint32_t max_used_col = 0; + for(std::size_t i = 0; i < ConstantColumns; i++) { + if(parser_instance.assignments[0].constant_column_size(i) != 0) { + max_used_col = i; + } + } + lookup_columns_indices.resize(ConstantColumns - max_used_col - 1); + std::iota(lookup_columns_indices.begin(), lookup_columns_indices.end(), max_used_col + 1); // fill max_used_col + 1, max_used_col + 2, ... + + auto usable_rows_amount = zk::snark::pack_lookup_tables_horizontal( + parser_instance.circuits[0].get_reserved_indices(), + parser_instance.circuits[0].get_reserved_tables(), + parser_instance.circuits[0].get(), + parser_instance.assignments[0].get(), + lookup_columns_indices, + parser_instance.assignments[0].allocated_rows(), + max_usable_rows + ); + } + // print shared table std::ofstream shared_otable; const auto print_kind = parser_instance.assignments.size() > 1 ? print_table_kind::SHARED : print_table_kind::FULL; @@ -446,7 +478,7 @@ int curve_dependent_main(std::string bytecode_file_name, print_assignment_table< nil::marshalling::option::big_endian, - ArithmetizationType + ArithmetizationType, BlueprintFieldType >(parser_instance.assignments[0], print_kind, shared_otable); shared_otable.close(); @@ -462,7 +494,7 @@ int curve_dependent_main(std::string bytecode_file_name, print_assignment_table< nil::marshalling::option::big_endian, - ArithmetizationType + ArithmetizationType, BlueprintFieldType >(it, print_table_kind::PRIVATE, otable); @@ -470,7 +502,6 @@ int curve_dependent_main(std::string bytecode_file_name, otable.close(); } } - auto assignment_it = parser_instance.assignments.begin(); for (auto& it : parser_instance.circuits) { std::ofstream ocircuit; diff --git a/bin/transpiler/src/main.cpp b/bin/transpiler/src/main.cpp index e9ebae73..2cf119e7 100644 --- a/bin/transpiler/src/main.cpp +++ b/bin/transpiler/src/main.cpp @@ -253,7 +253,7 @@ int main(int argc, char *argv[]) { using BlueprintFieldType = typename curve_type::base_field_type; constexpr std::size_t WitnessColumns = 15; constexpr std::size_t PublicInputColumns = 1; - constexpr std::size_t ConstantColumns = 5; + constexpr std::size_t ConstantColumns = 30; constexpr std::size_t SelectorColumns = 35; using ArithmetizationParams = diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt index 55930944..394462ec 100644 --- a/examples/cpp/CMakeLists.txt +++ b/examples/cpp/CMakeLists.txt @@ -78,9 +78,9 @@ add_example_with_proving(arithmetics_cpp_example SOURCES arithmetics.cpp INPUT a add_example_with_proving(integer_arithmetics_cpp_example SOURCES integer_arithmetics.cpp INPUT integer_arithmetics.inp) add_example_with_proving(poseidon_cpp_example SOURCES poseidon.cpp INPUT poseidon.inp) add_example_with_proving(merkle_tree_poseidon_cpp_example SOURCES merkle_tree_poseidon.cpp INPUT merkle_tree_poseidon.inp) -add_example_with_proving(merkle_tree_sha2_256_cpp_example SOURCES merkle_tree_sha2_256.cpp INPUT merkle_tree_sha2_256.inp) -add_example_with_proving(validate_merkle_path_sha2_256_cpp_example SOURCES validate_merkle_path_sha2_256.cpp INPUT validate_merkle_path_sha2_256.inp) -add_example_with_proving(sha256_cpp_example SOURCES sha2_256.cpp INPUT sha2_256.inp) +#add_example_with_proving(merkle_tree_sha2_256_cpp_example SOURCES merkle_tree_sha2_256.cpp INPUT merkle_tree_sha2_256.inp) +add_example_without_proving(validate_merkle_path_sha2_256_cpp_example SOURCES validate_merkle_path_sha2_256.cpp INPUT validate_merkle_path_sha2_256.inp) +add_example_without_proving(sha256_cpp_example SOURCES sha2_256.cpp INPUT sha2_256.inp) add_example_with_proving(balance_cpp_example SOURCES balance.cpp INPUT balance.inp) add_example_with_proving(memory_cpp_example SOURCES memory.cpp INPUT memory.inp) add_example_with_proving(polynomial_cpp_example SOURCES polynomial.cpp INPUT polynomial.inp COMPILER_OPTIONS -std=c++20) diff --git a/examples/rust/CMakeLists.txt b/examples/rust/CMakeLists.txt index bbc02e53..30220809 100644 --- a/examples/rust/CMakeLists.txt +++ b/examples/rust/CMakeLists.txt @@ -41,6 +41,6 @@ add_rust_example(arithmetics_arkworks_rust_example EXAMPLE_NAME arithmetics_arkw add_rust_example(ed25519_curve_add_rust_example EXAMPLE_NAME ed25519_curve_add INPUT ed25519_curve_add.inp) add_rust_example(eddsa_signature_verification_rust_example EXAMPLE_NAME eddsa_signature_verification INPUT eddsa_signature_verification_rust.inp) add_rust_example(eddsa_signature_verification_builtins_rust_example EXAMPLE_NAME eddsa_signature_verification_builtins INPUT eddsa_signature_verification_rust.inp) -add_rust_example(merkle_tree_sha2_256_rust_example EXAMPLE_NAME merkle_tree_sha2_256 INPUT merkle_tree_sha2_256_rust.inp) -add_rust_example(sha2_256_rust_example EXAMPLE_NAME sha2_256 INPUT sha2_256_rust.inp) +#add_rust_example(merkle_tree_sha2_256_rust_example EXAMPLE_NAME merkle_tree_sha2_256 INPUT merkle_tree_sha2_256_rust.inp) +#add_rust_example(sha2_256_rust_example EXAMPLE_NAME sha2_256 INPUT sha2_256_rust.inp) add_rust_example(sha2_512_rust_example EXAMPLE_NAME sha2_512 INPUT sha2_512_rust.inp) diff --git a/libs/assigner b/libs/assigner index 3bb2f6ed..6dd86fb9 160000 --- a/libs/assigner +++ b/libs/assigner @@ -1 +1 @@ -Subproject commit 3bb2f6ed332e7ddc850952b4cfda3cc701b47f85 +Subproject commit 6dd86fb9ec59a7bd2f9ace50c19daf92c601b97e diff --git a/libs/blueprint b/libs/blueprint index 0cbb80dc..ca6012a5 160000 --- a/libs/blueprint +++ b/libs/blueprint @@ -1 +1 @@ -Subproject commit 0cbb80dcae7e546f619d77ee7b2c664eba43dc89 +Subproject commit ca6012a52ce26f797c818668e1ad441138d109ec diff --git a/libs/crypto3 b/libs/crypto3 index 355b3d5c..2dcbf3ac 160000 --- a/libs/crypto3 +++ b/libs/crypto3 @@ -1 +1 @@ -Subproject commit 355b3d5cb9da12f840d6afcbee81fb9f5a55a863 +Subproject commit 2dcbf3ac72e82bcdb6bf04b8795deb432d98eebf From 9ea5f454dbb8753704af0a6d7d2e32f42357bb0a Mon Sep 17 00:00:00 2001 From: akokoshn Date: Thu, 30 Nov 2023 22:46:08 +0200 Subject: [PATCH 2/3] Static definition of constant/selector columns amount --- bin/assigner/src/main.cpp | 62 ++++++++++++++----------------------- bin/transpiler/src/main.cpp | 4 +-- libs/blueprint | 2 +- libs/crypto3 | 2 +- 4 files changed, 28 insertions(+), 42 deletions(-) diff --git a/bin/assigner/src/main.cpp b/bin/assigner/src/main.cpp index 59b38e9c..14990513 100644 --- a/bin/assigner/src/main.cpp +++ b/bin/assigner/src/main.cpp @@ -181,6 +181,7 @@ void fill_vector_value(std::vector &table_values, const ContainerType template void print_assignment_table(const assignment_proxy &table_proxy, print_table_kind print_kind, + std::uint32_t ComponentConstantColumns, std::uint32_t ComponentSelectorColumns, std::ostream &out = std::cout) { using AssignmentTableType = assignment_proxy; std::uint32_t usable_rows_amount; @@ -193,13 +194,13 @@ void print_assignment_table(const assignment_proxy &table_p const auto lookup_constant_cols = table_proxy.get_lookup_constant_cols(); const auto lookup_selector_cols = table_proxy.get_lookup_selector_cols(); if (print_kind == print_table_kind::PRIVATE) { - constant_size = constant_size - table_proxy.get_lookup_constant_amount(); - selector_size = selector_size - table_proxy.get_lookup_selector_amount(); + constant_size = ComponentConstantColumns; + selector_size = ComponentSelectorColumns; total_columns = witness_size + constant_size + selector_size; usable_rows_amount = table_proxy.get_used_rows().size(); } else if (print_kind == print_table_kind::SHARED) { - constant_size = table_proxy.get_lookup_constant_amount(); - selector_size = table_proxy.get_lookup_selector_amount(); + constant_size = constant_size - ComponentConstantColumns; + selector_size = selector_size - ComponentSelectorColumns; total_columns = shared_size + public_input_size + constant_size + selector_size; std::uint32_t max_shared_size = 0; std::uint32_t max_public_inputs_size = 0; @@ -290,32 +291,18 @@ void print_assignment_table(const assignment_proxy &table_p fill_vector_value (table_values, table_proxy.shared(i), padded_rows_amount); } - for (const auto &i : table_proxy.get_lookup_constant_cols()) { + for (std::uint32_t i = 0; i < constant_size; i++) { fill_vector_value - (table_values, table_proxy.constant(i), padded_rows_amount); + (table_values, table_proxy.constant(i + ComponentConstantColumns), padded_rows_amount); } - for (const auto &i : table_proxy.get_lookup_selector_cols()) { + for (std::uint32_t i = 0; i < selector_size; i++) { fill_vector_value - (table_values, table_proxy.selector(i), padded_rows_amount); + (table_values, table_proxy.selector(i + ComponentSelectorColumns), padded_rows_amount); } } else { const std::uint32_t padding = padded_rows_amount - usable_rows_amount; const auto& rows = table_proxy.get_used_rows(); - std::vector constant_cols; - const auto& lookup_constant_cols = table_proxy.get_lookup_constant_cols(); - for (std::uint32_t i = 0; i < table_proxy.constants_amount(); i++) { - if (lookup_constant_cols.find(i) == lookup_constant_cols.end()) { - constant_cols.push_back(i); - } - } - std::vector selector_cols; - const auto& lookup_selector_cols = table_proxy.get_lookup_selector_cols(); - for (std::uint32_t i = 0; i < table_proxy.selectors_amount(); i++) { - if (lookup_selector_cols.find(i) == lookup_selector_cols.end()) { - selector_cols.push_back(i); - } - } for( std::size_t i = 0; i < AssignmentTableType::arithmetization_params::witness_columns; i++ ){ const auto column_size = table_proxy.witness_column_size(i); for(const auto& j : rows){ @@ -329,7 +316,7 @@ void print_assignment_table(const assignment_proxy &table_p table_values.push_back(0); } } - for(const auto& i : constant_cols) { + for (std::uint32_t i = 0; i < ComponentConstantColumns; i++) { const auto column_size = table_proxy.constant_column_size(i); for(const auto& j : rows){ if (j < column_size) { @@ -342,7 +329,7 @@ void print_assignment_table(const assignment_proxy &table_p table_values.push_back(0); } } - for(const auto& i : selector_cols) { + for (std::uint32_t i = 0; i < ComponentSelectorColumns; i++) { const auto column_size = table_proxy.selector_column_size(i); for(const auto& j : rows) { if (j < column_size) { @@ -382,10 +369,15 @@ int curve_dependent_main(std::string bytecode_file_name, std::uint32_t max_num_provers) { using BlueprintFieldType = typename CurveType::base_field_type; + constexpr std::size_t ComponentConstantColumns = 5; + constexpr std::size_t LookupConstantColumns = 30; + constexpr std::size_t ComponentSelectorColumns = 30; + constexpr std::size_t LookupSelectorConstantColumns = 6; + constexpr std::size_t WitnessColumns = 15; constexpr std::size_t PublicInputColumns = 1; - constexpr std::size_t ConstantColumns = 30; - constexpr std::size_t SelectorColumns = 35; + constexpr std::size_t ConstantColumns = ComponentConstantColumns + LookupConstantColumns; + constexpr std::size_t SelectorColumns = ComponentSelectorColumns + LookupSelectorConstantColumns; using ArithmetizationParams = zk::snark::plonk_arithmetization_params; @@ -442,17 +434,10 @@ int curve_dependent_main(std::string bytecode_file_name, // pack lookup tables if (parser_instance.circuits[0].get_reserved_tables().size() > 0) { std::vector lookup_columns_indices; - const auto& lookup_tables = parser_instance.circuits[0].get_reserved_tables(); const std::uint32_t max_usable_rows = 500000; - // looking for free constant columns - std::uint32_t max_used_col = 0; - for(std::size_t i = 0; i < ConstantColumns; i++) { - if(parser_instance.assignments[0].constant_column_size(i) != 0) { - max_used_col = i; - } - } - lookup_columns_indices.resize(ConstantColumns - max_used_col - 1); - std::iota(lookup_columns_indices.begin(), lookup_columns_indices.end(), max_used_col + 1); // fill max_used_col + 1, max_used_col + 2, ... + lookup_columns_indices.resize(LookupConstantColumns); + // fill ComponentConstantColumns, ComponentConstantColumns + 1, ... + std::iota(lookup_columns_indices.begin(), lookup_columns_indices.end(), ComponentConstantColumns); auto usable_rows_amount = zk::snark::pack_lookup_tables_horizontal( parser_instance.circuits[0].get_reserved_indices(), @@ -460,6 +445,7 @@ int curve_dependent_main(std::string bytecode_file_name, parser_instance.circuits[0].get(), parser_instance.assignments[0].get(), lookup_columns_indices, + ComponentSelectorColumns, parser_instance.assignments[0].allocated_rows(), max_usable_rows ); @@ -479,7 +465,7 @@ int curve_dependent_main(std::string bytecode_file_name, print_assignment_table< nil::marshalling::option::big_endian, ArithmetizationType, BlueprintFieldType - >(parser_instance.assignments[0], print_kind, shared_otable); + >(parser_instance.assignments[0], print_kind, ComponentConstantColumns, ComponentSelectorColumns, shared_otable); shared_otable.close(); @@ -495,7 +481,7 @@ int curve_dependent_main(std::string bytecode_file_name, print_assignment_table< nil::marshalling::option::big_endian, ArithmetizationType, BlueprintFieldType - >(it, print_table_kind::PRIVATE, otable); + >(it, print_table_kind::PRIVATE, ComponentConstantColumns, ComponentSelectorColumns, otable); // nil::blueprint::profiling_assignment_table(parser_instance.assignmnt, desc.usable_rows_amount, otable); diff --git a/bin/transpiler/src/main.cpp b/bin/transpiler/src/main.cpp index 2cf119e7..965b58f9 100644 --- a/bin/transpiler/src/main.cpp +++ b/bin/transpiler/src/main.cpp @@ -253,8 +253,8 @@ int main(int argc, char *argv[]) { using BlueprintFieldType = typename curve_type::base_field_type; constexpr std::size_t WitnessColumns = 15; constexpr std::size_t PublicInputColumns = 1; - constexpr std::size_t ConstantColumns = 30; - constexpr std::size_t SelectorColumns = 35; + constexpr std::size_t ConstantColumns = 35; + constexpr std::size_t SelectorColumns = 36; using ArithmetizationParams = nil::crypto3::zk::snark::plonk_arithmetization_params Date: Fri, 1 Dec 2023 12:23:39 +0000 Subject: [PATCH 3/3] Submodules assigner, blueprint and zk updated to master to support lookup. --- bin/assigner/src/main.cpp | 2 +- examples/cpp/CMakeLists.txt | 2 +- libs/assigner | 2 +- libs/blueprint | 2 +- libs/crypto3 | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/assigner/src/main.cpp b/bin/assigner/src/main.cpp index 14990513..9a2ab703 100644 --- a/bin/assigner/src/main.cpp +++ b/bin/assigner/src/main.cpp @@ -144,7 +144,7 @@ void print_circuit(const circuit_proxy &circuit_proxy, auto filled_val = plonk_constraint_system(std::make_tuple( nil::crypto3::marshalling::types::fill_plonk_gates(used_gates), - nil::crypto3::marshalling::types::fill_plonk_copy_constraints(used_copy_constraints), + nil::crypto3::marshalling::types::fill_plonk_copy_constraints(used_copy_constraints), nil::crypto3::marshalling::types::fill_plonk_lookup_gates(used_lookup_gates), nil::crypto3::marshalling::types::fill_plonk_lookup_tables(used_lookup_tables) )); diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt index 394462ec..632fc873 100644 --- a/examples/cpp/CMakeLists.txt +++ b/examples/cpp/CMakeLists.txt @@ -78,7 +78,7 @@ add_example_with_proving(arithmetics_cpp_example SOURCES arithmetics.cpp INPUT a add_example_with_proving(integer_arithmetics_cpp_example SOURCES integer_arithmetics.cpp INPUT integer_arithmetics.inp) add_example_with_proving(poseidon_cpp_example SOURCES poseidon.cpp INPUT poseidon.inp) add_example_with_proving(merkle_tree_poseidon_cpp_example SOURCES merkle_tree_poseidon.cpp INPUT merkle_tree_poseidon.inp) -#add_example_with_proving(merkle_tree_sha2_256_cpp_example SOURCES merkle_tree_sha2_256.cpp INPUT merkle_tree_sha2_256.inp) +add_example_without_proving(merkle_tree_sha2_256_cpp_example SOURCES merkle_tree_sha2_256.cpp INPUT merkle_tree_sha2_256.inp) add_example_without_proving(validate_merkle_path_sha2_256_cpp_example SOURCES validate_merkle_path_sha2_256.cpp INPUT validate_merkle_path_sha2_256.inp) add_example_without_proving(sha256_cpp_example SOURCES sha2_256.cpp INPUT sha2_256.inp) add_example_with_proving(balance_cpp_example SOURCES balance.cpp INPUT balance.inp) diff --git a/libs/assigner b/libs/assigner index 6dd86fb9..a5fc5a81 160000 --- a/libs/assigner +++ b/libs/assigner @@ -1 +1 @@ -Subproject commit 6dd86fb9ec59a7bd2f9ace50c19daf92c601b97e +Subproject commit a5fc5a815dc1ab5ce56db250abc519b1cc70c9fa diff --git a/libs/blueprint b/libs/blueprint index 6f0f090b..168922fb 160000 --- a/libs/blueprint +++ b/libs/blueprint @@ -1 +1 @@ -Subproject commit 6f0f090be0f1c6f436915f13adc11bad9a2c3a45 +Subproject commit 168922fb3b3b9a9a6a5cf53dd964ec9bfcb560d3 diff --git a/libs/crypto3 b/libs/crypto3 index b6dd187d..d8635597 160000 --- a/libs/crypto3 +++ b/libs/crypto3 @@ -1 +1 @@ -Subproject commit b6dd187d2d25387bdccd1578ac06601eaa0d0a45 +Subproject commit d86355978662431a2aed99fdf67412d16fd72975