From ee9da86061af994996aeaa398e86540cc7fba2f9 Mon Sep 17 00:00:00 2001 From: "e.tatuzova" Date: Wed, 6 Mar 2024 12:21:11 +0400 Subject: [PATCH] Public input sizes, table description in common data structure #302 --- .../plonk/constraint_system.hpp | 25 ++++++++++++-- .../plonk/placeholder/preprocessor.hpp | 34 +++++++++++++++++-- .../systems/plonk/placeholder/verifier.hpp | 10 +++++- test/systems/plonk/placeholder/circuits.hpp | 5 +-- .../systems/plonk/placeholder/placeholder.cpp | 6 +++- 5 files changed, 70 insertions(+), 10 deletions(-) diff --git a/include/nil/crypto3/zk/snark/arithmetization/plonk/constraint_system.hpp b/include/nil/crypto3/zk/snark/arithmetization/plonk/constraint_system.hpp index c0114824e..64f14e360 100644 --- a/include/nil/crypto3/zk/snark/arithmetization/plonk/constraint_system.hpp +++ b/include/nil/crypto3/zk/snark/arithmetization/plonk/constraint_system.hpp @@ -66,12 +66,15 @@ namespace nil { typedef math::term term_type; typedef math::binary_arithmetic_operation binary_operation_type; typedef math::pow_operation pow_operation_type; + typedef std::vector public_input_sizes_type; protected: gates_container_type _gates; copy_constraints_container_type _copy_constraints; lookup_gates_container_type _lookup_gates; lookup_tables_type _lookup_tables; + // If empty, then check full column + public_input_sizes_type _public_input_sizes; public: typedef FieldType field_type; @@ -83,15 +86,30 @@ namespace nil { plonk_constraint_system(const gates_container_type &gates, const copy_constraints_container_type ©_constraints, const lookup_gates_container_type &lookup_gates = {}, - const lookup_tables_type &lookup_tables = {} + const lookup_tables_type &lookup_tables = {}, + const public_input_sizes_type &public_input_sizes = {} ) : _gates(gates), _copy_constraints(copy_constraints), _lookup_gates(lookup_gates), - _lookup_tables(lookup_tables) + _lookup_tables(lookup_tables), + _public_input_sizes(public_input_sizes) { } + std::size_t public_input_total_size() const { + return std::accumulate(_public_input_sizes.begin(), _public_input_sizes.end(), 0); + } + + std::size_t public_input_size(std::size_t i) const { + assert(i < _public_input_sizes.size()); + return _public_input_sizes[i]; + } + + std::size_t public_input_sizes_num() const { + return _public_input_sizes.size(); + } + std::size_t num_gates() const { return _gates.size(); } @@ -217,7 +235,8 @@ namespace nil { bool operator==(const plonk_constraint_system &other) const { return (this->_gates == other._gates) && (this->_copy_constraints == other._copy_constraints) && - (this->_lookup_gates == other._lookup_gates) && (this->_lookup_tables == other._lookup_tables); + (this->_lookup_gates == other._lookup_gates) && (this->_lookup_tables == other._lookup_tables) && + (this->_public_input_sizes == other._public_input_sizes); } }; } // namespace snark diff --git a/include/nil/crypto3/zk/snark/systems/plonk/placeholder/preprocessor.hpp b/include/nil/crypto3/zk/snark/systems/plonk/placeholder/preprocessor.hpp index a00845e94..b3070a268 100644 --- a/include/nil/crypto3/zk/snark/systems/plonk/placeholder/preprocessor.hpp +++ b/include/nil/crypto3/zk/snark/systems/plonk/placeholder/preprocessor.hpp @@ -111,6 +111,8 @@ namespace nil { using commitment_scheme_type = typename ParamsType::commitment_scheme_type; using commitments_type = public_commitments_type; using verification_key_type = verification_key; + using transcript_hash_type = typename ParamsType::transcript_hash_type; + using table_description_type = plonk_table_description; // marshalled public_commitments_type commitments; @@ -118,6 +120,10 @@ namespace nil { std::size_t rows_amount; std::size_t usable_rows_amount; + std::size_t witness_columns; + std::size_t public_input_columns; + std::size_t constant_columns; + std::size_t selector_columns; // not marshalled. They can be derived from other fields. polynomial_dfs_type lagrange_0; @@ -134,6 +140,10 @@ namespace nil { std::vector> col_rotations, std::size_t rows, std::size_t usable_rows, + std::size_t witness_columns, + std::size_t public_input_columns, + std::size_t constant_columns, + std::size_t selector_columns, std::uint32_t max_gates_degree, verification_key vk ): commitments(commts), @@ -141,7 +151,9 @@ namespace nil { lagrange_0(D->size() - 1, D->size(), FieldType::value_type::zero()), Z(std::vector(rows + 1, FieldType::value_type::zero())), basic_domain(D), - max_gates_degree(max_gates_degree), vk(vk) + max_gates_degree(max_gates_degree), vk(vk), + witness_columns(witness_columns), public_input_columns(public_input_columns), + constant_columns(constant_columns), selector_columns(selector_columns) { // Z is polynomial -1, 0,..., 0, 1 Z[0] = -FieldType::value_type::one(); @@ -157,13 +169,19 @@ namespace nil { std::vector> col_rotations, std::size_t rows, std::size_t usable_rows, + std::size_t witness_columns, + std::size_t public_input_columns, + std::size_t constant_columns, + std::size_t selector_columns, std::uint32_t max_gates_degree, verification_key vk ): commitments(commts), columns_rotations(col_rotations), rows_amount(rows), usable_rows_amount(usable_rows), lagrange_0(rows - 1, rows, FieldType::value_type::zero()), Z(std::vector(rows + 1, FieldType::value_type::zero())), - max_gates_degree(max_gates_degree), vk(vk) + max_gates_degree(max_gates_degree), vk(vk), + witness_columns(witness_columns), public_input_columns(public_input_columns), + constant_columns(constant_columns), selector_columns(selector_columns) { // Z is polynomial -1, 0,..., 0, 1 Z[0] = -FieldType::value_type::one(); @@ -181,6 +199,10 @@ namespace nil { return rows_amount == rhs.rows_amount && usable_rows_amount == rhs.usable_rows_amount && columns_rotations == rhs.columns_rotations && + witness_columns == rhs.witness_columns && + public_input_columns == rhs.public_input_columns && + constant_columns == rhs.constant_columns && + selector_columns == rhs.selector_columns && commitments == rhs.commitments && basic_domain->size() == rhs.basic_domain->size() && lagrange_0 == rhs.lagrange_0 && @@ -508,7 +530,13 @@ namespace nil { typename preprocessed_data_type::verification_key vk = {constraint_system_with_params_hash, public_commitments.fixed_values}; typename preprocessed_data_type::common_data_type common_data ( std::move(public_commitments), std::move(c_rotations), - N_rows, table_description.usable_rows_amount, max_gates_degree, vk + table_description.rows_amount, + table_description.usable_rows_amount, + table_description.witness_columns, + table_description.public_input_columns, + table_description.constant_columns, + table_description.selector_columns, + max_gates_degree, vk ); transcript_type transcript(std::vector({})); diff --git a/include/nil/crypto3/zk/snark/systems/plonk/placeholder/verifier.hpp b/include/nil/crypto3/zk/snark/systems/plonk/placeholder/verifier.hpp index cfe91b6a5..fada7b59c 100644 --- a/include/nil/crypto3/zk/snark/systems/plonk/placeholder/verifier.hpp +++ b/include/nil/crypto3/zk/snark/systems/plonk/placeholder/verifier.hpp @@ -147,10 +147,18 @@ namespace nil { auto numerator = challenge.pow(preprocessed_public_data.common_data.rows_amount) - FieldType::value_type::one(); numerator /= typename FieldType::value_type(preprocessed_public_data.common_data.rows_amount); + // If public input sizes are set, all of them should be set. + if(constraint_system.public_input_sizes_num() != 0 && constraint_system.public_input_sizes_num() != table_description.public_input_columns){ + return false; + } + for( std::size_t i = 0; i < public_input.size(); ++i ){ typename FieldType::value_type value = FieldType::value_type::zero(); + std::size_t max_size = public_input[i].size(); + if (constraint_system.public_input_sizes_num() != 0) + max_size = std::min(max_size, constraint_system.public_input_size(i)); auto omega_pow = FieldType::value_type::one(); - for( std::size_t j = 0; j < public_input[i].size(); ++j ){ + for( std::size_t j = 0; j < max_size; ++j ){ value += (public_input[i][j] * omega_pow) / (challenge - omega_pow); omega_pow = omega_pow * omega; } diff --git a/test/systems/plonk/placeholder/circuits.hpp b/test/systems/plonk/placeholder/circuits.hpp index 2c53d45f9..77832ba57 100644 --- a/test/systems/plonk/placeholder/circuits.hpp +++ b/test/systems/plonk/placeholder/circuits.hpp @@ -70,8 +70,8 @@ namespace nil { std::vector>> gates; std::vector> copy_constraints; std::vector>> lookup_gates; - std::vector> lookup_tables; + std::vector public_input_sizes; circuit_description() : table_rows(0){ } @@ -251,11 +251,12 @@ namespace nil { typedef placeholder_circuit_params circuit_params; circuit_description test_circuit; + test_circuit.public_input_sizes = {3}; std::vector> table(table_columns); - std::vector q_add(test_circuit.usable_rows); std::vector q_mul(test_circuit.usable_rows); + std::vector q_add(test_circuit.usable_rows); for (std::size_t j = 0; j < table_columns; j++) { table[j].resize(test_circuit.usable_rows); } diff --git a/test/systems/plonk/placeholder/placeholder.cpp b/test/systems/plonk/placeholder/placeholder.cpp index 5cedde457..f02ac9b2d 100644 --- a/test/systems/plonk/placeholder/placeholder.cpp +++ b/test/systems/plonk/placeholder/placeholder.cpp @@ -383,7 +383,11 @@ BOOST_FIXTURE_TEST_CASE(prover_test, test_initializer){ desc.usable_rows_amount = circuit.usable_rows; std::size_t table_rows_log = std::log2(desc.rows_amount); - typename policy_type::constraint_system_type constraint_system(circuit.gates, circuit.copy_constraints, circuit.lookup_gates); + typename policy_type::constraint_system_type constraint_system( + circuit.gates, circuit.copy_constraints, + circuit.lookup_gates, circuit.lookup_tables, + circuit.public_input_sizes + ); typename policy_type::variable_assignment_type assignments = circuit.table; std::vector columns_with_copy_constraints = {0, 1, 2, 3};