Skip to content

Commit

Permalink
Changed placeholder test to use a different LPC scheme when verifying.
Browse files Browse the repository at this point in the history
  • Loading branch information
martun committed Sep 6, 2024
1 parent 35212a8 commit fb2e0f1
Show file tree
Hide file tree
Showing 10 changed files with 161 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -253,8 +253,6 @@ namespace nil {
typedef std::array<var, ratio> non_native_var_type;
};



/*
* Native element type.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,60 @@ namespace nil {
namespace marshalling {
namespace types {

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////// Marshalling the assignment table description.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

// TODO(we may consider to use this construct when marshalling the assignment table.)
template<typename TTypeBase>
using plonk_assignment_table_description = nil::marshalling::types::bundle<
TTypeBase, std::tuple<
nil::marshalling::types::integral<TTypeBase, std::size_t>, // witness_amount
nil::marshalling::types::integral<TTypeBase, std::size_t>, // public_input_amount
nil::marshalling::types::integral<TTypeBase, std::size_t>, // constant_amount
nil::marshalling::types::integral<TTypeBase, std::size_t>, // selector_amount

nil::marshalling::types::integral<TTypeBase, std::size_t>, // usable_rows
nil::marshalling::types::integral<TTypeBase, std::size_t> // rows_amount
>
>;

template<typename Endianness, typename FieldType>
plonk_assignment_table_description<nil::marshalling::field_type<Endianness>> fill_assignment_table_description(
const zk::snark::plonk_table_description<FieldType>& desc
) {
using TTypeBase = nil::marshalling::field_type<Endianness>;
using result_type = plonk_assignment_table_description<nil::marshalling::field_type<Endianness>>;
using value_type = typename FieldType::value_type;

return result_type(std::move(std::make_tuple(
nil::marshalling::types::integral<TTypeBase, std::size_t>(desc.witness_columns),
nil::marshalling::types::integral<TTypeBase, std::size_t>(desc.public_input_columns),
nil::marshalling::types::integral<TTypeBase, std::size_t>(desc.constant_columns),
nil::marshalling::types::integral<TTypeBase, std::size_t>(desc.selector_columns),
nil::marshalling::types::integral<TTypeBase, std::size_t>(desc.usable_rows_amount),
nil::marshalling::types::integral<TTypeBase, std::size_t>(desc.rows_amount))));
}

template<typename Endianness, typename FieldType>
zk::snark::plonk_table_description<FieldType> make_assignment_table_description(
const plonk_assignment_table_description<nil::marshalling::field_type<Endianness>> &filled_description) {

zk::snark::plonk_table_description<FieldType> desc(
std::get<0>(filled_description.value()).value(),
std::get<1>(filled_description.value()).value(),
std::get<2>(filled_description.value()).value(),
std::get<3>(filled_description.value()).value(),
std::get<4>(filled_description.value()).value(),
std::get<5>(filled_description.value()).value()
);
return desc;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////// Marshalling the assignment table.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

template<typename TTypeBase, typename PlonkTable>
using plonk_assignment_table = nil::marshalling::types::bundle<
TTypeBase, std::tuple<
Expand Down Expand Up @@ -143,7 +197,7 @@ namespace nil {
plonk_assignment_table<nil::marshalling::field_type<Endianness>, PlonkTable> fill_assignment_table(
std::size_t usable_rows,
const PlonkTable &assignments
){
) {
using TTypeBase = nil::marshalling::field_type<Endianness>;
using result_type = plonk_assignment_table<nil::marshalling::field_type<Endianness>, PlonkTable>;
using value_type = typename PlonkTable::field_type::value_type;
Expand Down Expand Up @@ -228,6 +282,8 @@ namespace nil {
typename PlonkTable::public_table_type(public_inputs, constants, selectors)
));
}


} //namespace types
} // namespace marshalling
} // namespace crypto3
Expand Down
39 changes: 39 additions & 0 deletions libs/marshalling/zk/test/plonk_assignment_table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,30 @@ void print_hex_byteblob(std::ostream &os, TIter iter_begin, TIter iter_end, bool
}
}

template<typename Endianness, typename PlonkTableDescription>
void test_assignment_table_description(const PlonkTableDescription& val) {
using TTypeBase = nil::marshalling::field_type<Endianness>;
using FieldType = typename PlonkTableDescription::field_type;
using value_marshalling_type = nil::crypto3::marshalling::types::plonk_assignment_table_description<TTypeBase>;

auto filled_val = types::fill_assignment_table_description<Endianness, FieldType>(val);
auto table_desc = types::make_assignment_table_description<Endianness, FieldType>(filled_val);
BOOST_CHECK(val == table_desc);

std::vector<std::uint8_t> cv;
cv.resize(filled_val.length(), 0x00);

auto write_iter = cv.begin();
nil::marshalling::status_type status = filled_val.write(write_iter, cv.size());
value_marshalling_type test_val_read;
auto read_iter = cv.begin();
status = test_val_read.read(read_iter, cv.size());
BOOST_CHECK(status == nil::marshalling::status_type::success);
table_desc = types::make_assignment_table_description<Endianness, FieldType>(test_val_read);

BOOST_CHECK(val == table_desc);
}

template<typename Endianness, typename PlonkTable>
void test_assignment_table(std::size_t usable_rows, PlonkTable val, std::string folder_name = "") {
using TTypeBase = nil::marshalling::field_type<Endianness>;
Expand Down Expand Up @@ -148,7 +172,10 @@ BOOST_FIXTURE_TEST_CASE(assignment_table_marshalling_test, test_tools::random_te
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments, "circuit1");
else
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments);

test_assignment_table_description<Endianness, plonk_table_description<field_type>>(desc);
}

BOOST_AUTO_TEST_SUITE_END()

BOOST_AUTO_TEST_SUITE(placeholder_circuit2)
Expand Down Expand Up @@ -209,6 +236,8 @@ BOOST_FIXTURE_TEST_CASE(assignment_table_marshalling_test, test_tools::random_te
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments, "circuit2");
else
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments);

test_assignment_table_description<Endianness, plonk_table_description<field_type>>(desc);
}
BOOST_AUTO_TEST_SUITE_END()

Expand Down Expand Up @@ -266,6 +295,8 @@ BOOST_FIXTURE_TEST_CASE(assignment_table_marshalling_test, test_tools::random_te
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments, "circuit3");
else
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments);

test_assignment_table_description<Endianness, plonk_table_description<field_type>>(desc);
}
BOOST_AUTO_TEST_SUITE_END()

Expand Down Expand Up @@ -325,6 +356,8 @@ BOOST_FIXTURE_TEST_CASE(assignment_table_marshalling_test, test_tools::random_te
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments, "circuit4");
else
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments);

test_assignment_table_description<Endianness, plonk_table_description<field_type>>(desc);
}
BOOST_AUTO_TEST_SUITE_END()

Expand Down Expand Up @@ -386,6 +419,8 @@ BOOST_FIXTURE_TEST_CASE(assignment_table_marshalling_test, test_tools::random_te
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments, "circuit5");
else
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments);

test_assignment_table_description<Endianness, plonk_table_description<field_type>>(desc);
}
BOOST_AUTO_TEST_SUITE_END()

Expand Down Expand Up @@ -442,6 +477,8 @@ BOOST_FIXTURE_TEST_CASE(assignment_table_marshalling_test, test_tools::random_te
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments, "circuit6");
else
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments);

test_assignment_table_description<Endianness, plonk_table_description<field_type>>(desc);
}
BOOST_AUTO_TEST_SUITE_END()

Expand Down Expand Up @@ -498,5 +535,7 @@ BOOST_FIXTURE_TEST_CASE(assignment_table_marshalling_test, test_tools::random_te
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments, "circuit7");
else
test_assignment_table<Endianness, typename policy_type::variable_assignment_type>(desc.usable_rows_amount, assignments);

test_assignment_table_description<Endianness, plonk_table_description<field_type>>(desc);
}
BOOST_AUTO_TEST_SUITE_END()
39 changes: 24 additions & 15 deletions libs/zk/include/nil/crypto3/zk/commitments/batched_commitment.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,13 @@ namespace nil {
}
}

// This function is called from verifier directly, without actually committing to the
// polynomials.
void state_commited(std::size_t index) {
_locked[index] = true;
_points[index].resize(_polys[index].size());
}

protected:
math::polynomial<typename field_type::value_type> get_V(
const std::vector<typename field_type::value_type> &points) const {
Expand Down Expand Up @@ -160,16 +167,16 @@ namespace nil {
std::vector<std::vector<typename field_type::value_type>> get_unique_point_sets_list() const{
std::vector<std::vector<typename field_type::value_type>> unique_points;

for(auto const &[k, point]:_points){
for( std::size_t i = 0; i < point.size(); i++ ){
for (auto const &[k, point]:_points) {
for (std::size_t i = 0; i < point.size(); i++) {
bool found = false;
for( std::size_t j = 0; j < unique_points.size(); j++ ){
for (std::size_t j = 0; j < unique_points.size(); j++) {
if( unique_points[j] == point[i] ){
found = true;
break;
}
}
if( !found ){
if (!found) {
unique_points.push_back(point[i]);
}
}
Expand Down Expand Up @@ -198,12 +205,6 @@ namespace nil {
return eval_map;
}


void state_commited(std::size_t index){
_locked[index] = true;
_points[index].resize(_polys[index].size());
}

void eval_polys() {
for(auto const &[k, poly] : _polys) {
_z.set_batch_size(k, poly.size());
Expand Down Expand Up @@ -249,7 +250,7 @@ namespace nil {
// We can add points only after polynomails are commited.
BOOST_ASSERT(_locked[batch_id]);

for(std::size_t i = 0; i < _points[batch_id].size(); i++){
for (std::size_t i = 0; i < _points[batch_id].size(); i++) {
_points[batch_id][i].push_back(point);
}
}
Expand All @@ -260,6 +261,11 @@ namespace nil {
// We can add points only after polynomails are commited.
BOOST_ASSERT(_locked[batch_id]);

// When called from verifier, this vector is not properly resized, so we resize to
// the required size when needed.
if (poly_id + 1 > _points[batch_id].size())
_points[batch_id].resize(poly_id + 1);

_points[batch_id][poly_id].push_back(point);
}

Expand All @@ -272,13 +278,16 @@ namespace nil {
}

// This function don't check evaluation points repeats
void append_eval_points(std::size_t batch_id, std::size_t poly_id, std::set<typename field_type::value_type> points){
BOOST_ASSERT(_locked[batch_id]); // We can add points only after polynomails are commited.
void append_eval_points(std::size_t batch_id, std::size_t poly_id,
std::set<typename field_type::value_type> points) {
// We can add points only after polynomails are commited.
BOOST_ASSERT(_locked[batch_id]);

_points[batch_id][poly_id].insert(_points[batch_id][poly_id].end(), points.begin(), points.end());
}

void set_batch_size(std::size_t batch_id, std::size_t batch_size){
if( _points.find(batch_id) == _points.end() ){
void set_batch_size(std::size_t batch_id, std::size_t batch_size) {
if (_points.find(batch_id) == _points.end()) {
_points[batch_id] = {};
}
_points[batch_id].resize(batch_size);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1087,7 +1087,7 @@ namespace nil {
}
}

//Calculate combinedQ values
// Calculate combinedQ values
typename FRI::field_type::value_type theta_acc = FRI::field_type::value_type::one();
typename FRI::polynomial_values_type y;
typename FRI::polynomial_values_type combined_eval_values;
Expand Down Expand Up @@ -1123,7 +1123,8 @@ namespace nil {
typename FRI::polynomial_values_type y_next;
for (std::size_t i = 0; i < fri_params.step_list.size(); i++) {
coset_size = 1 << fri_params.step_list[i];
if (query_proof.round_proofs[i].p.root() != proof.fri_roots[i]) return false;
if (query_proof.round_proofs[i].p.root() != proof.fri_roots[i])
return false;

std::tie(s, s_indices) = calculate_s<FRI>(x_index, fri_params.step_list[i],
fri_params.D[t]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,12 @@ namespace nil {
namespace zk {
namespace snark {

// TODO(martun): this class actually does not depend on the FieldType.
template<typename FieldType>
struct plonk_table_description {
// Needed for marshalling.
using field_type = FieldType;

std::size_t witness_columns;
std::size_t public_input_columns;
std::size_t constant_columns;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,14 @@ namespace nil {
static std::size_t permutation_partitions_num(
std::size_t permutation_size,
std::size_t max_quotient_chunks
){
if( permutation_size == 0 ) return 0;
if( max_quotient_chunks == 0 ){
) {
if (permutation_size == 0) return 0;
if (max_quotient_chunks == 0) {
return 1;
}
return (permutation_size % (max_quotient_chunks - 1) == 0)? permutation_size / (max_quotient_chunks - 1) : permutation_size / (max_quotient_chunks - 1) + 1;
return (permutation_size % (max_quotient_chunks - 1) == 0) ?
permutation_size / (max_quotient_chunks - 1) :
permutation_size / (max_quotient_chunks - 1) + 1;
}

struct preprocessed_data_type {
Expand Down Expand Up @@ -160,6 +162,8 @@ namespace nil {
std::uint32_t permutation_parts;
std::uint32_t lookup_parts;

common_data_type(const common_data_type& other) = default;

// Constructor with pregenerated domain
common_data_type(
std::shared_ptr<math::evaluation_domain<FieldType>> D,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -375,8 +375,9 @@ namespace nil {
if( constraint_system.copy_constraints().size() > 0 )
_commitment_scheme.append_eval_point(PERMUTATION_BATCH, 0, _proof.eval_proof.challenge * _omega);

if(_is_lookup_enabled){
_commitment_scheme.append_eval_point(PERMUTATION_BATCH, preprocessed_public_data.common_data.permutation_parts , _proof.eval_proof.challenge * _omega);
if(_is_lookup_enabled) {
_commitment_scheme.append_eval_point(PERMUTATION_BATCH, preprocessed_public_data.common_data.permutation_parts,
_proof.eval_proof.challenge * _omega);
_commitment_scheme.append_eval_point(LOOKUP_BATCH, _proof.eval_proof.challenge);
_commitment_scheme.append_eval_point(LOOKUP_BATCH, _proof.eval_proof.challenge * _omega);
_commitment_scheme.append_eval_point(LOOKUP_BATCH, _proof.eval_proof.challenge *
Expand All @@ -391,7 +392,7 @@ namespace nil {
std::size_t start_index = preprocessed_public_data.identity_polynomials.size() +
preprocessed_public_data.permutation_polynomials.size() + 2;

for( i = 0; i < start_index; i++){
for( i = 0; i < start_index; i++) {
_commitment_scheme.append_eval_point(FIXED_VALUES_BATCH, i, _proof.eval_proof.challenge);
}

Expand Down
Loading

0 comments on commit fb2e0f1

Please sign in to comment.