From 29308849da179fb8190df8cda51776c2d41cf187 Mon Sep 17 00:00:00 2001 From: Daniel Kogtev Date: Mon, 23 Dec 2024 17:07:56 +0000 Subject: [PATCH] assigner: add trace match check --- .../nil/proof-generator/assigner/assigner.hpp | 21 ++-- .../nil/proof-generator/assigner/bytecode.hpp | 8 +- .../nil/proof-generator/assigner/copy.hpp | 16 +-- .../nil/proof-generator/assigner/options.hpp | 15 +++ .../nil/proof-generator/assigner/rw.hpp | 8 +- .../proof-generator/assigner/trace_parser.hpp | 111 ++++++++++++++++-- .../nil/proof-generator/assigner/zkevm.hpp | 24 ++-- .../libs/assigner/proto/trace.proto | 7 +- .../broken_index/increment_simple.pb.bc.bin | Bin 0 -> 9852 bytes .../broken_index/increment_simple.pb.copy.bin | Bin 0 -> 244 bytes .../broken_index/increment_simple.pb.exp.bin | 1 + .../broken_index/increment_simple.pb.mpt.bin | 1 + .../broken_index/increment_simple.pb.rw.bin | Bin 0 -> 28942 bytes .../increment_simple.pb.zkevm.bin | Bin 0 -> 92728 bytes .../test_zkevm_bbf_circuits.cpp | 18 ++- 15 files changed, 186 insertions(+), 44 deletions(-) create mode 100644 proof-producer/libs/assigner/include/nil/proof-generator/assigner/options.hpp create mode 100644 proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.bc.bin create mode 100644 proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.copy.bin create mode 100644 proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.exp.bin create mode 100644 proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.mpt.bin create mode 100644 proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.rw.bin create mode 100644 proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.zkevm.bin diff --git a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/assigner.hpp b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/assigner.hpp index 0904d8d4af..0b1738d9ca 100644 --- a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/assigner.hpp +++ b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/assigner.hpp @@ -3,19 +3,25 @@ #include +#include #include #include #include #include +#include namespace nil { namespace proof_generator { + using AssignmentTableFiller = std::function( + crypto3::zk::snark::plonk_assignment_table& assignment_table, + const boost::filesystem::path& trace_base_path, + const AssignerOptions& options) + >; + template - std::map( - nil::crypto3::zk::snark::plonk_assignment_table& assignment_table, - const boost::filesystem::path& trace_base_path)>> circuit_selector = { + std::map circuit_selector = { {circuits::BYTECODE, fill_bytecode_assignment_table}, {circuits::RW, fill_rw_assignment_table}, {circuits::ZKEVM, fill_zkevm_assignment_table}, @@ -60,15 +66,16 @@ namespace nil { } template - std::optional fill_assignment_table_single_thread(nil::crypto3::zk::snark::plonk_assignment_table& assignment_table, - nil::crypto3::zk::snark::plonk_table_description& desc, + std::optional fill_assignment_table_single_thread(crypto3::zk::snark::plonk_assignment_table& assignment_table, + crypto3::zk::snark::plonk_table_description& desc, const std::string& circuit_name, - const boost::filesystem::path& trace_base_path) { + const boost::filesystem::path& trace_base_path, + const AssignerOptions& options = {}) { auto find_it = circuit_selector.find(circuit_name); if (find_it == circuit_selector.end()) { return "Unknown circuit name " + circuit_name; } - const auto err = find_it->second(assignment_table, trace_base_path); + const auto err = find_it->second(assignment_table, trace_base_path, options); if (err) { return err; } diff --git a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/bytecode.hpp b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/bytecode.hpp index 757063f95e..8b38beeafd 100644 --- a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/bytecode.hpp +++ b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/bytecode.hpp @@ -8,6 +8,7 @@ #include #include #include +#include #include namespace nil { @@ -16,7 +17,8 @@ namespace nil { /// @brief Fill assignment table template std::optional fill_bytecode_assignment_table(nil::crypto3::zk::snark::plonk_assignment_table& assignment_table, - const boost::filesystem::path& trace_base_path) { + const boost::filesystem::path& trace_base_path, + const AssignerOptions& options) { // TODO: print full name here, not only base BOOST_LOG_TRIVIAL(debug) << "fill bytecode table from " << trace_base_path << "\n"; @@ -28,12 +30,12 @@ namespace nil { input.rlc_challenge = limits::RLC_CHALLENGE; const auto bytecode_trace_path = get_bytecode_trace_path(trace_base_path); - const auto contract_bytecodes = deserialize_bytecodes_from_file(bytecode_trace_path); + const auto contract_bytecodes = deserialize_bytecodes_from_file(bytecode_trace_path, options); if (!contract_bytecodes) { return "can't read bytecode trace from file: " + bytecode_trace_path.string(); } - for (const auto& bytecode_it : contract_bytecodes.value()) { + for (const auto& bytecode_it : contract_bytecodes->value) { const auto raw_bytecode = string_to_bytes(bytecode_it.second); input.bytecodes.new_buffer(raw_bytecode); input.keccak_buffers.new_buffer(raw_bytecode); diff --git a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/copy.hpp b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/copy.hpp index 2db30c4aa1..ab54f8361c 100644 --- a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/copy.hpp +++ b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/copy.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -19,7 +20,8 @@ namespace nil { /// @brief Fill assignment table template std::optional fill_copy_events_assignment_table(nil::crypto3::zk::snark::plonk_assignment_table& assignment_table, - const boost::filesystem::path& trace_base_path) { + const boost::filesystem::path& trace_base_path, + const AssignerOptions& options) { BOOST_LOG_TRIVIAL(debug) << "fill copy table from " << trace_base_path << "\n"; using ComponentType = nil::blueprint::bbf::copy; @@ -30,29 +32,29 @@ namespace nil { input.rlc_challenge = limits::RLC_CHALLENGE; const auto copy_trace_path = get_copy_trace_path(trace_base_path); - auto copy_events = deserialize_copy_events_from_file(copy_trace_path); + auto copy_events = deserialize_copy_events_from_file(copy_trace_path, options); if (!copy_events) { return "can't read copy events from file: " + copy_trace_path.string(); } - input.copy_events = std::move(copy_events.value()); + input.copy_events = std::move(copy_events->value); const auto bytecode_trace_path = get_bytecode_trace_path(trace_base_path); - const auto contract_bytecodes = deserialize_bytecodes_from_file(bytecode_trace_path); + const auto contract_bytecodes = deserialize_bytecodes_from_file(bytecode_trace_path, options, copy_events->index); if (!contract_bytecodes) { return "can't read bytecode trace from file: " + bytecode_trace_path.string(); } - for (const auto& bytecode_it : contract_bytecodes.value()) { + for (const auto& bytecode_it : contract_bytecodes->value) { const auto raw_bytecode = string_to_bytes(bytecode_it.second); input.bytecodes.new_buffer(raw_bytecode); input.keccak_buffers.new_buffer(raw_bytecode); } const auto rw_trace_path = get_rw_trace_path(trace_base_path); - auto rw_operations = deserialize_rw_traces_from_file(rw_trace_path); + auto rw_operations = deserialize_rw_traces_from_file(rw_trace_path, options, copy_events->index); if (!rw_operations) { return "can't read rw operations trace from file: " + rw_trace_path.string(); } - input.rw_operations = std::move(rw_operations.value()); + input.rw_operations = std::move(rw_operations->value); auto start = std::chrono::high_resolution_clock::now(); ComponentType instance( diff --git a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/options.hpp b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/options.hpp new file mode 100644 index 0000000000..4aab3f6577 --- /dev/null +++ b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/options.hpp @@ -0,0 +1,15 @@ +#ifndef PROOF_GENERATOR_LIBS_ASSIGNER_OPTIONS_HPP_ +#define PROOF_GENERATOR_LIBS_ASSIGNER_OPTIONS_HPP_ + +namespace nil { + namespace proof_generator { + + struct AssignerOptions { + bool ignore_index_mismatch{}; + }; + + + } // proof_generator +} // namespace nil + +#endif // PROOF_GENERATOR_LIBS_ASSIGNER_OPTIONS_HPP_ diff --git a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/rw.hpp b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/rw.hpp index 05a7c4d395..89a4f34441 100644 --- a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/rw.hpp +++ b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/rw.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -17,7 +18,8 @@ namespace nil { /// @brief Fill assignment table template std::optional fill_rw_assignment_table(nil::crypto3::zk::snark::plonk_assignment_table& assignment_table, - const boost::filesystem::path& trace_base_path) { + const boost::filesystem::path& trace_base_path, + const AssignerOptions& options) { BOOST_LOG_TRIVIAL(debug) << "fill rw table from " << trace_base_path << "\n"; using ComponentType = nil::blueprint::bbf::rw; @@ -25,13 +27,13 @@ namespace nil { typename nil::blueprint::bbf::context context_object(assignment_table, limits::max_rows); const auto rw_trace_path = get_rw_trace_path(trace_base_path); - auto input = deserialize_rw_traces_from_file(rw_trace_path); + auto input = deserialize_rw_traces_from_file(rw_trace_path, options); if (!input) { return "can't read rw from file: " + rw_trace_path.string(); } auto start = std::chrono::high_resolution_clock::now(); - ComponentType instance(context_object, input.value(), limits::max_rw_size, limits::max_mpt_size); + ComponentType instance(context_object, input->value, limits::max_rw_size, limits::max_mpt_size); auto duration = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start); std::cout << "FILL ASSIGNMENT TABLE: " << duration.count() << "\n"; return {}; diff --git a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/trace_parser.hpp b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/trace_parser.hpp index 7c7e14d5b0..cf53a1a512 100644 --- a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/trace_parser.hpp +++ b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/trace_parser.hpp @@ -1,6 +1,10 @@ #ifndef PROOF_GENERATOR_LIBS_ASSIGNER_TRACE_PARSER_HPP_ #define PROOF_GENERATOR_LIBS_ASSIGNER_TRACE_PARSER_HPP_ +#include +#include +#include +#include #include #include #include @@ -13,8 +17,10 @@ #include #include #include +#include #include +#include namespace nil { namespace proof_generator { @@ -137,11 +143,51 @@ namespace nil { return res; } - [[nodiscard]] std::optional> deserialize_bytecodes_from_file(const boost::filesystem::path& bytecode_trace_path) { + [[nodiscard]] std::string get_trace_extension(const boost::filesystem::path& trace_path) { + return trace_path.extension().string(); + } + + using TraceIndex = uint64_t; // value expected to be the same for all traces from the same set + using TraceIndexOpt = std::optional; + + inline bool check_trace_index(const AssignerOptions& options, TraceIndexOpt base, TraceIndex index) { + if (base.has_value() && index != *base) { + BOOST_LOG_TRIVIAL(warning) << "Trace index mismatch: expected " << *base << ", got " << index; + if (!options.ignore_index_mismatch) { + return false; + } + } + return true; + } + + + template + struct DeserializeResult { + TraceType value; + TraceIndex index; + }; + + template + using DeserializeResultOpt = std::optional>; + + using BytecodeTraces = std::unordered_map; // contract address -> bytecode + using RWTraces = blueprint::bbf::rw_operations_vector; + using ZKEVMTraces = std::vector; + using CopyEvents = std::vector; + using ExpTraces = std::vector; + + [[nodiscard]] DeserializeResultOpt deserialize_bytecodes_from_file( + const boost::filesystem::path& bytecode_trace_path, + const AssignerOptions& opts, + TraceIndexOpt base_index = {} + ) { const auto pb_traces = read_pb_traces_from_file(bytecode_trace_path); if (!pb_traces) { return std::nullopt; } + if (!check_trace_index(opts, base_index, pb_traces->trace_idx())) { + return std::nullopt; + } // Read executed op codes std::unordered_map contract_bytecodes; @@ -150,14 +196,24 @@ namespace nil { contract_bytecodes.emplace(bytecode.first, bytecode.second); } - return contract_bytecodes; + return DeserializeResult{ + std::move(contract_bytecodes), + pb_traces->trace_idx() + }; } - [[nodiscard]] std::optional deserialize_rw_traces_from_file(const boost::filesystem::path& rw_traces_path) { + [[nodiscard]] DeserializeResultOpt deserialize_rw_traces_from_file( + const boost::filesystem::path& rw_traces_path, + const AssignerOptions& opts, + TraceIndexOpt base_index = {} + ) { const auto pb_traces = read_pb_traces_from_file(rw_traces_path); if (!pb_traces) { return std::nullopt; } + if (!check_trace_index(opts, base_index, pb_traces->trace_idx())) { + return std::nullopt; + } blueprint::bbf::rw_operations_vector rw_traces; rw_traces.reserve(pb_traces->stack_ops_size() + pb_traces->memory_ops_size() + pb_traces->storage_ops_size() + 1); // +1 slot for start op @@ -208,14 +264,24 @@ namespace nil { << "memory " << pb_traces->memory_ops_size() << "\n" << "storage " << pb_traces->storage_ops_size() << "\n"; - return rw_traces; + return DeserializeResult{ + std::move(rw_traces), + pb_traces->trace_idx() + }; } - [[nodiscard]] std::optional> deserialize_zkevm_state_traces_from_file(const boost::filesystem::path& zkevm_traces_path) { + [[nodiscard]] DeserializeResultOpt deserialize_zkevm_state_traces_from_file( + const boost::filesystem::path& zkevm_traces_path, + const AssignerOptions& opts, + TraceIndexOpt base_index = {} + ) { const auto pb_traces = read_pb_traces_from_file(zkevm_traces_path); if (!pb_traces) { return std::nullopt; } + if (!check_trace_index(opts, base_index, pb_traces->trace_idx())) { + return std::nullopt; + } std::vector zkevm_states; zkevm_states.reserve(pb_traces->zkevm_states_size()); @@ -247,14 +313,24 @@ namespace nil { zkevm_states.back().error_opcode = static_cast(pb_state.error_opcode()); } - return zkevm_states; + return DeserializeResult{ + std::move(zkevm_states), + pb_traces->trace_idx() + }; } - [[nodiscard]] std::optional> deserialize_copy_events_from_file(const boost::filesystem::path& copy_traces_file) { + [[nodiscard]] DeserializeResultOpt deserialize_copy_events_from_file( + const boost::filesystem::path& copy_traces_file, + const AssignerOptions& opts, + TraceIndexOpt base_index = {} + ) { const auto pb_traces = read_pb_traces_from_file(copy_traces_file); if (!pb_traces) { return std::nullopt; } + if (!check_trace_index(opts, base_index, pb_traces->trace_idx())) { + return std::nullopt; + } namespace bbf = blueprint::bbf; @@ -286,26 +362,39 @@ namespace nil { copy_events.push_back(std::move(event)); } - return copy_events; + return DeserializeResult{ + std::move(copy_events), + pb_traces->trace_idx() + }; } - [[nodiscard]] std::optional> deserialize_exp_traces_from_file(const boost::filesystem::path& exp_traces_path) { + [[nodiscard]] DeserializeResultOpt deserialize_exp_traces_from_file( + const boost::filesystem::path& exp_traces_path, + const AssignerOptions& opts, + TraceIndexOpt base_index = {} + ) { const auto pb_traces = read_pb_traces_from_file(exp_traces_path); if (!pb_traces) { return std::nullopt; } + if (!check_trace_index(opts, base_index, pb_traces->trace_idx())) { + return std::nullopt; + } std::vector exps; exps.reserve(pb_traces->exp_ops_size()); for (const auto& pb_exp_op : pb_traces->exp_ops()) { - std::cout << "base: " << proto_uint256_to_zkevm_word(pb_exp_op.base()) << " , exponent: " << proto_uint256_to_zkevm_word(pb_exp_op.exponent()) << std::endl; + BOOST_LOG_TRIVIAL(trace) << "base: " << proto_uint256_to_zkevm_word(pb_exp_op.base()) << " , exponent: " << proto_uint256_to_zkevm_word(pb_exp_op.exponent()) << std::endl; exps.emplace_back( proto_uint256_to_zkevm_word(pb_exp_op.base()), proto_uint256_to_zkevm_word(pb_exp_op.exponent()) ); } - return exps; + return DeserializeResult{ + std::move(exps), + pb_traces->trace_idx() + }; } } // namespace proof_generator } // namespace nil diff --git a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/zkevm.hpp b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/zkevm.hpp index 9ccbcd87d8..34b13c236d 100644 --- a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/zkevm.hpp +++ b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/zkevm.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -17,7 +18,8 @@ namespace nil { /// @brief Fill assignment table template std::optional fill_zkevm_assignment_table(nil::crypto3::zk::snark::plonk_assignment_table& assignment_table, - const boost::filesystem::path& trace_base_path) { + const boost::filesystem::path& trace_base_path, + const AssignerOptions& options) { BOOST_LOG_TRIVIAL(debug) << "fill zkevm table from " << trace_base_path << "\n"; using ComponentType = nil::blueprint::bbf::zkevm; @@ -28,11 +30,11 @@ namespace nil { // bytecode const auto bytecode_trace_path = get_bytecode_trace_path(trace_base_path); - const auto contract_bytecodes = deserialize_bytecodes_from_file(bytecode_trace_path); + const auto contract_bytecodes = deserialize_bytecodes_from_file(bytecode_trace_path, options); if (!contract_bytecodes) { return "can't read bytecode from file: " + bytecode_trace_path.string(); } - for (const auto& bytecode_it : contract_bytecodes.value()) { + for (const auto& bytecode_it : contract_bytecodes->value) { const auto raw_bytecode = string_to_bytes(bytecode_it.second); input.bytecodes.new_buffer(raw_bytecode); input.keccak_buffers.new_buffer(raw_bytecode); @@ -40,33 +42,33 @@ namespace nil { // rw const auto rw_trace_path = get_rw_trace_path(trace_base_path); - auto rw_operations = deserialize_rw_traces_from_file(rw_trace_path); + auto rw_operations = deserialize_rw_traces_from_file(rw_trace_path, options, contract_bytecodes->index); if (!rw_operations) { return "can't read rw from file: " + rw_trace_path.string(); } - input.rw_operations = std::move(rw_operations.value()); + input.rw_operations = std::move(rw_operations->value); // states const auto zkevm_trace_path = get_zkevm_trace_path(trace_base_path); - const auto zkevm_states = deserialize_zkevm_state_traces_from_file(zkevm_trace_path); + const auto zkevm_states = deserialize_zkevm_state_traces_from_file(zkevm_trace_path, options, contract_bytecodes->index); if (!zkevm_states) { return "can't read zkevm states from file: " + zkevm_trace_path.string(); } - input.zkevm_states = zkevm_states.value(); + input.zkevm_states = std::move(zkevm_states->value); const auto copy_trace_path = get_copy_trace_path(trace_base_path); - const auto copy_events = deserialize_copy_events_from_file(copy_trace_path); + const auto copy_events = deserialize_copy_events_from_file(copy_trace_path, options, contract_bytecodes->index); if (!copy_events) { return "can't read copy events from file: " + copy_trace_path.string(); } - input.copy_events = copy_events.value(); + input.copy_events = std::move(copy_events->value); // const auto exp_trace_path = get_exp_trace_path(trace_base_path); - // const auto exp_operations = deserialize_exp_traces_from_file(exp_trace_path); + // const auto exp_operations = deserialize_exp_traces_from_file(exp_trace_path, options, contract_bytecodes->index); // if (!exp_operations) { // return "can't read exp operations from file: " + exp_trace_path.string(); // } - // input.exponentiations = exp_operations.value(); + // input.exponentiations = std::move(exp_operations->value); auto start = std::chrono::high_resolution_clock::now(); ComponentType instance( diff --git a/proof-producer/libs/assigner/proto/trace.proto b/proof-producer/libs/assigner/proto/trace.proto index f2444c110d..97370f246c 100644 --- a/proof-producer/libs/assigner/proto/trace.proto +++ b/proof-producer/libs/assigner/proto/trace.proto @@ -86,7 +86,7 @@ message MPTTraces { // HEX address to slots changes in address's storage map storage_traces_by_account = 1; repeated ContractTrieUpdateTrace contract_trie_traces = 2; - + uint64 trace_idx = 3; // some randomly chosen value that should be checked in the proof generator to ensure integrity of the passed traces } // types.SmartContract serialization @@ -157,6 +157,7 @@ message CopyEvent { // Traces collected for bytecode circuit message BytecodeTraces { map contract_bytecodes = 1; + uint64 trace_idx = 2; // some randomly chosen value that should be checked in the proof generator to ensure integrity of the passed traces } // Traces collected for rw circuit @@ -164,18 +165,22 @@ message RWTraces { repeated StackOp stack_ops = 1; repeated MemoryOp memory_ops = 2; repeated StorageOp storage_ops = 3; + uint64 trace_idx = 4; // some randomly chosen value that should be checked in the proof generator to ensure integrity of the passed traces } // Traces collected for zkevm circuit message ZKEVMTraces { repeated ZKEVMState zkevm_states = 1; + uint64 trace_idx = 2; // some randomly chosen value that should be checked in the proof generator to ensure integrity of the passed traces } // Traces collected for bytecode circuit message CopyTraces { repeated CopyEvent copy_events = 1; + uint64 trace_idx = 2; // some randomly chosen value that should be checked in the proof generator to ensure integrity of the passed traces } message ExpTraces { repeated ExpOp exp_ops = 1; + uint64 trace_idx = 2; // some randomly chosen value that should be checked in the proof generator to ensure integrity of the passed traces } diff --git a/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.bc.bin b/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.bc.bin new file mode 100644 index 0000000000000000000000000000000000000000..4de4a8ffbd2df61b9b86fd3681677c55131b2b83 GIT binary patch literal 9852 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 literal 0 HcmV?d00001 diff --git a/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.copy.bin b/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.copy.bin new file mode 100644 index 0000000000000000000000000000000000000000..24e53b63089466aba1f02ebbf1d393a4b5d86ea5 GIT binary patch literal 244 zcmd-w;$q=o6<`oz)mXqNz##FORY`$?0N~op$i>FNq~QYA_5h^qJg3q;MgrQ9r5W?) zDF0!wfA_zMp>Rr`TG@Vs5@cz7>{<9Ep>oJ-<^jbn%ze-$uyoq$=jTqZoEifFo0J*a literal 0 HcmV?d00001 diff --git a/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.exp.bin b/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.exp.bin new file mode 100644 index 0000000000..25560de2a5 --- /dev/null +++ b/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.exp.bin @@ -0,0 +1 @@ +¥–«çÎË©•\ \ No newline at end of file diff --git a/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.mpt.bin b/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.mpt.bin new file mode 100644 index 0000000000..c52032b9c6 --- /dev/null +++ b/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.mpt.bin @@ -0,0 +1 @@ +¥–«çÎË©•\ \ No newline at end of file diff --git a/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.rw.bin b/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.rw.bin new file mode 100644 index 0000000000000000000000000000000000000000..31d4940efad5ce8ae743c4be8d6d8426d227dc95 GIT binary patch literal 28942 zcmbW5srRS>B6-YaTILP8R%R0)BEgi!CDyx;e-)?UDUo;=R{wSO(ze@`n6&_!>m0$C7tGUNyQ3>)DO*=3H!2cIn5_-(z)$1>!HyDxK)p30CP z`IJE;{!uq*RPL9D;K$scpV^>mGUUgjK{Gp>AwLlf+A1RY$v%Uw&5)n!GiZcA?XLBr zN7ZAjmvb5NGtss7@#PHp*-sfZ;-Bj=Yy>~=hFxYiYF&o>LNshWy&W}8H847{TvhME&(atF;kT zXUgx}h=QypQ~n@o$toiHLsYaC@s3qIpDBOj+P3HEQl|WIRLi2eO!*U(>F?J_1b>QV z21E;MeWv`G^&eynneyk>QdAMq*WJKdY(z-@qE~l~nevzDZh-F&!8fc-6g6eaUq$E3 zrjY%$Yn;nHl5a+(m^Ek0-}LGb(YH|17Aaro+da-0MgG>E@lCsMS2E@AqBCZ8EmQv9 zvY;ts|KJ+;rT)>i#qLn%pQ5&ywPwmc_quwB{w4k)r`;DSz&kOxRwy$n1BC|a+*})u zTPm+DQ$}a#;}eGMnKDLe4)ix(>u?#X$snJ!4VOYq25XY1OvpXGKpP84I-PYb+h!OIN6A%ux=1`440{_ z8x0xRG=CEIgdv$8l(OvhaGBvt*^P;0rtkB)UC7SiGArnl;l1Hf9JFS2kJsTWiSX`}S=TkSqvFS@wFkEcB)FP%#flX-52W zxQ-vhhjzLD*^u81m$IM%D_)o{i?o55pMNCfEEQ$r@}(jp{vEizKBZawaIrr}8#|IE zY{JgbvZ8!h>Py*hkSz0eOL4vqetfF?LO3JQatTwWWr0mvGA809;>|v=WTbz`=%%awi?epz_McYTRKPY9{ zlB68qXoI04tkkMQwNsm6BnNf;@9X$C+67vgltZi;ge#JAm|aA5ksV=XQ(z~tDJe&N z4=$++YFf5ADaZU(E3<(hIv$Ld;g+PFVBKgMkX38l_jJU**h$~1%@qor(#LaX-^X)X zQfk;y(8B(toc5Q2jUqY|Tn2^*l5&<$=%=)dAJ+C929k5Zx!cexlXBjdvQtNL!FOI` zb8s*z7lY0j9!bijpf#(D?6PkyPj80PNvUJ0XjaZ9rCv+fO=L5Gq=BWPtTri)LHpJk zvL@gDSG9d4%|R*4&L!mvGkZW$tY03ot6I|%SE|Lg<;q;+X$G&Y3rT79HwT|GL~VZj zcHS40a=p(iUQWslt@%N8YanW8xge}d%FW>9twChB{3LL)5p@J-W#>?zl-oKIdqiE* z$x>0)kd!;Y^szaFcYP17)+wTUK{K2MB4RiO3EW&%6dTZ z*mv4t_f~UKo&=pTY)Q(~pf#(D>=_FNPs;72JZBh88NwIZi$y$JL@zb6s+>hcuX1=;lXOkcql+y(?H3(Wp#! zZ+=1VRwSb{?aMAGc0Va&7zQU+kuPI2?ZYklyhB!~T?~qDJVfKP3wyiUOcR^DcqYwJ!wPeeZ%y<$Xg#WLSPqSqy&miaq;j&&mBU;W`h)&{Jwye-0+aqJA zg=D2BwsxoWM4xBND%Oj#m)Wvfo44n$z)lR&Nsa8OACu6Uud?M7M;3%{v!#a3MV%r$ zt#$1IWL-pObR72fw~-+^%ZgFbfeKiW@pnvl$9YeBIkDJk(a57`v#O355{ z5Dji`O6L03>x%xLljF$d_B;d+?=J2JJCiosw0(ZxdvzwXRLIFSe%VH9?`ZY%M6ZE+y-N(Qzn; zQ?j06Fh2-4XdgYJjlIqSr8fEKoK4x$lx*&OPaIFlmY(+nlC6FEJdu)Z+FCG)h_?Il z%F}zZIwd>UezabkO36+?H=k%JB)eG3=F760l5!knPbf?e^m3K(tpQyG2Sz zYN^vH*~ifaVQotGv$^2GA1Md?Kv1(^UfD>gWYwUHMI+^)cJWbkYa%+ta>3b`kCek& z?sHK&L`PUI2rEX)QHDW_2&;liV532HtmpU^kCfxR&tl0)IiaOK^0zvY>OP}eI#N#d z8XcljeMYxzq|~sBs6k|>dtCuUXZoDP@{w}3_emhDWkGwMc-yTWDUVn%T8hr6|Y$x|JRJtw>e5ItkLAiS88=jl6MS)cRa!_ZO$S#hp1qH>w#Yah(-;tSB$mCupuR* z83vaH;TWxKkuNvax5q9}sxYX^a?L3j$1oVo?UWQTw2v)TM>t+v>={kasAtuQeX8EU zOSV@zM3ejUdp9Lh2G~nG`b0uDRqNV!6i0$++5p@v_B#i=S&&R;YeBL5c+oNpz6BA^ z)aEQ=bBJd79{9zGs5oek;RC#CIXe4z{RBPdAuG|k_Q~jr&C$`>DY!y&*;-KSFdYNyv!-_K&q;IyE8HY%!>g@Fc_FR1lu(eVZYx=`(JGr-K={6GV2# z&ztR5kem%lSvD;pwS7(x;W@2pn|W94yq>V#7d&AUx}b$@N0Xfyxb1bXeYV9xmWNss zwQaksU(!=tl8{N7*t%u?FH6W|_7-K!6EcNaR1?`$-`3Z(EhN)|QkJbq$n=5n@54U- zUpG?Jo8hlQT3bgllUF&od@B<&ORs3~{39x6xgcDXklDc{v<8utXkDAMO1t+F&GF}C zg;pnIZg5VPtxd?hV7^%u;e0>fynYz)x`gcMGvM_J+1qQti1zgv@CGcE!GNtnWCwb7 zu@SedA20gsm$wPGtR~UiZN?4TXBb-((x$@*Uf77Pvs@5vOUMllBWe&?yVkYUtK6;| zqMNK6gxeExE4XwvJY*fcPYc=YXddjD-GRGuQ1nDqTDTiGCd1$cID|WMkUeJ6uceSp z9fSee?_CRQfQY6I!ey~%(MEz~Ix9v?-x1t&%%b0VA)Bc+EwQ$c%+e(K{U?&*pq`bg z!X4*JxuisgWuq_5(b+nN`z<&nhSj*`dXEg*Jl~p)e_W2tXVu^|i*jUv?}BHJXkpL= z!|^#%s?9}96O#SxG|DFA$bn!W)-AG1KM*@DBnN$;$L+Kx=E$L-Pli)+q*%>;ooGukgtnIl*3|tR_dQgW<6%!jrzW zavL3@Q$aa~r*ovH&rlGa_CxmN&iMA&1xlR_+GBVoM{0Xc1(HWW4{Yvijy%@p?5*sh zCoC6)wK?*%_dFtd=7&;gr-tZxFcgO8a^yvyjuF1}r{>GO^6hafDD~P8ugPwL^EvV+ z7#_n*Ir28>g6$!E=ezLbx_o=SRKZ|d6YO*uUe1wG4DG4nU=WTT>>e~{m1!x`B>Ffxn3nOu*f@;CX_=rM1WO{KiNSC= zwj*hoq~&bc_0eRO3&NvmnZht=5#dxFOSC*AnKsx~#3-vu%XDVZn32u!XMwZtmxp9# zP|C7nX_@6q*{y@5*q_#gv{pQxmf69`7@kZ^Nzj_rMK;H`X6;{0%Us{uHEZosTITh+ zNcCx%-|HeFS`c(#%{8QDp>|-u+;K@MTMOpCF)d}Fc8QXO5iiC>$RWh@pnw=ONqwK@AOE_*<_=-^?OuV5umZHbNSGDZ62iGzFzBn?6FC zeJPBqUmlVxK`F~-jF79$qLCqM={Z&;*Lt>vq_uawStFz^xU#&A2(N3^=r@Z) z3$+KAjA8Kzxyde~3xw>J*0tX(`eGeDM~gzY*;-JnWQ26GwP-pQrR9!RjoL?Yw|AfA zX}QNNItOI;{aM-NM)JUqY-L)ncSTwr2IFA3G%b&U)~qhF$1G@16mRg=X?ene(X+BU zEl*j{mR+t<2%qU#Y>Bl=Megs-%+MXZeIwQsM|hK%S< zP?hEOr{yh&9F3(lE$^5`FD+zUI^rHlK~|4*K$%fl_UedA-AK#mEPL(Rrx#z(2*+sE z=o1*p*eslZy*PcLLe>nz_Oy&+XfJG@7{Vg0Y!NFX8t>clr6vSbS*`#B)c%Q{|IUtZx>mJ+?zh=TGDC-Je-+>h&1B6W zY|D{Z>>{fBI7^CsYc|nHX8YDQ+kbKKBuh$y))+p|k~u+ZRu|b^t!u-5XLYy4WFCt} zf7`G`vBFDA=_)+{>^ zlNDMj+Up=$$x=~P8Ix5(pX>nPYOQM9O=}Fv8Xbk*y}r;|)(pafFvg}YyHZqHPMYhSGd%2xEqRqZB8`|NRYzZ2(>}X8324}^p2)FsxDy=m{+kIdPb_A_ic049KwW2K!tca+d9R%Ttm^1{vvLwRBUcDk}>eU{i<~~)cV{%2y1*-_6 zt1K6UCu7pmXD|q_`A!P@>$xFn)w8wPw=+8xlQy1hl%0;r^`JFYMR=pn_|C*+T&(AH zK~xlrR#IMqvoRSTvn4nBqbOt(w63iizSzVVhG!3iJ+3G;i4~))HYStVL-1%KoT63j zuVSn!lBs@ddFH{YGCHEit(pk2dxk^0k=Ui=$ur9j=e=vz)Cf987CW9%#8>D2N`iToAU!$jCm^_X5`YuBDEbh+3UQstKIvrAF?mjsH2O1osL3HJ(Gr9Y1SnA{e5GuTnSE; zO*Q4pRc+lan~z$wX0!}9=gPG{=YBO;TD4}d(j#hPxgc!GmFqmGs6k{mw647nI5UXa zwb$q$$*<+gO)X@1$Q!%3t+{dwZQ=I9KM^-}*;m~4T}7n{?z;9|nLgB3o*?YV zl^H{Asf+$u1ldd$47MH*a%C37;6EoF6_?_n*|A~ik2Ct=KgJ(`!!Pr2AP#?khl6nV z6&?=8;a7Q>g~K1@VGM^q#KSlaf0&0uaQGuUd=G~|%0un#$9VWY4u717AK>sOcsLA) zKgq)narjd_%*NqQ^Du$KpW$H+4u6)1pTXhJ@$j=a{COVc;_w%E_z@0&k%ynd;V<#< zV;uf655EJ4zrw@M+6;n+Nt;FR2x&739wluy!79>b6g)=Stb)f$n_2J# zX|oGflb`6km!_nH{OxYuCV!`!o#gL!^A7oY-MmZwemC!tf6&eQE=7~Tixs;zunD({`TPfZ8t}ef7i{?gG7|pSxK^ z{!2H<_s@QBSV4vgf3J8>HOlF{YP8b@)flIXsx1QR8yR;s-`-%sHQnxQ%!ejRn2f}Q_Xa`uA1d^Lsjh5uA1$1Q&r-0 zOEt%-Lp9gwwrZYJr)s{_9n}J-yQ+mw_f(}$_f=(14^)es9&$Qu{VhsJ>40ec19Nt<8%`BxkHWqW$@ zcQmBUFMfK1wD|?wNt<8rCTa5v-Xd*&!4A^q7raf{{DPgN%`bR|wD|?^k~Y8KJ<{eE zyieNvf)7ZWU+^Jm^9w#AZGOSWq|Gn*gtYkupOQAe;4{+Z7kp0I{DLn?n_uuHY4Z!d zB5i)b*QCua_=dFk1>cf3zu-I4<`?WDZGORmf%Zt+{DPxMn_qDB!0aLXdcxmzEl}9p z0t*#3vp}iB<`pPY*sKDJ6gH=sQ7+_s#SbH zLMK&xKSHNed_O`pD!w0~(<;6np))GJAEC1I^Z;MP&WSm@VcKs{Ow>F&1Vo^MDrY}UG@nO!8O!^BILV(0oeajWnNAcoWSh72ZtqS%tUId|KhHG@n;^8_g#c z-cIwGg?G?=YT=zUpIdkr%_kS$P4n4>_t1QL;k`7UUw9wQ6&Qc8c#h`$!{=$vKYW4a z{KFS%&OdyK=KRB#Y0f`fM|1w+dYbbOH_)7axRK`k!%Z~jA8w{O|L_%>^ABI8Isb4A z&H0C~(VTy{mFE1zZ8YZ}zD{%g;TtsPA8w~P|L{$k^AF#mIsb46&H0CK)0}^}lji)x zcWBN(e3$0@!}n;;KYX9&{KF4u&OiK+<_eC#I$Jf^)&s8L@M@Z?IJ}1DIu5U;xst={ zXs+e(dYY>_yn*I=4sWEnqQjeLuIcb*nyWgzh32{rZ>71i!`o=C?eKP*t2?}d=K2or zq`AVwyJ)WQ@NSx`JiLeIIuGxqxzfY?Xs-3}ewwR2e1PV94_DG$@!^9s*L?U8%~c;h zOmp3bkI-EC;iELyez=O}>JJ~Ix&Fh)2iw=P?SJs^{kyWF{Vlkgw6A1v4{6`Y;9kBX7C7UU(VoB(!QO+D$>55 z!DFO-KZD0f`+^2fkoFA?R+IJ>4W1a2RfFeA`>qBrkoIK_UL@_?8oWf>*EM*VwC`)ME(;&qHoN%ihIYl5b#DvY zRM^Y{w-h$7K!?I+6}YXiIR!cuHlx5Dh0P~$S7EaW+*87pfHB7u}b?I!yhP= zsSY|VQXO(CR~>e$P#tkvtUBtnL{;UqRCUa0nd-RHa@7f^6{>2dm8z3Yt5m0)R;y~9 z)~HT9tyP_ITBkbev|d%~v_W;wX`|}A(}U9ch%>5dPG?oEPPM8wr*o?7PUlrO zoGz%^oi3_wI$cuTa=NVQaH>7I5n#7IyI^8IW?>9J6%ydaJs5`=+vTm zq&& z>T1TO@_X%daarQEmXZxO@+Q&^;R_vdZT)$nhx3db*W}RU(%ly#G#qcJ=G}H zET~I0T2%~||PBj;@aTclOL0{CLjaSWwzNMO=S^ynT zO;jy}L^VlO3Vl;GSycvE?^9HZoTjSEou;WOoTjT5JIzonahj=G>NHEW%&Azl+-bII zg;R-YrPCbMDyO-s)lTzNYnr@Av)~hO= zHmD9dZB!j{+N3({v{`k;X^ZNp(^gd#G+*zYZK`ALXWLcBopz{BIPFwbJMB`PblR;t z<+MjtWU3EIGYH>QFy5@9N)#_BMYI8cLy6$vdb;Id` zs@>_L>Za2r)h(yXst%_*)osY;y(r#W=hUpa?{r1=!0D>$p;L?M zk<&HRW2aWt6Q?%SQ>W{yXHc2mpEp#`-Ot)pFPv_wUOL@Uy@Jkay$;oDs8n@Z^#*ED zb*kP%6IFLq?;!kNdgD7;)#da;RnWitXD?NwoL;F$JH1woaeAW~>-1Jt==4rC&Z$dP zx1;swqz6R8yUbRMVWstEM|mP|a|fsG8|CNj1x9 zvZ~l=ifXpgR8@)7G}RoZ>8iO-GgR}OW~$~p%~CCJDpoCYnyo5zDj8zGli@A_f5o?x z<~{-5MRTVB@20s|fcMbcEx>ze?ib*FG1$>_7?gG9*bAJI}q`AX@FVWm%z?W(6GVqsu z4{7c*;72rf8t`M9dky#r&D{q4l;(Z|enxZ00Y9g?=YU_(+;zY&Y3@7VS2TAX@N1fT z5BLqu-3R=Z=KceIM{@@PchTH~zy{e1P2kBicPH=^n)?%YD$N}VJdNfa1)ffG zmjchAxle&-(%h-QvuN&B;9{D)6?ity{R&({bH@VDp}A*)=hED@!1HMCTj2RLcP{V( zntK;`A<`huc5iOf!EU9-N5T;?r-4rGucq7eS z4!nuxJ_p`RbEgAup}E(Ax6<70z}slB^N$@$EJ0c~#pMu+I z?x^6KH1|~SEteU(?)s z!Eb2pzTmes_h0ZknmaJKi{>5-E*Q%9zwKGzQ8f2q@MxMlF?bBky%;=}=57owq`4o1 z$I;x8!9_IpWbk;JyE1qJ&3zd>k><_}o;T G|NjE68l&j| literal 0 HcmV?d00001 diff --git a/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.zkevm.bin b/proof-producer/tests/bin/proof-producer/resources/traces/broken_index/increment_simple.pb.zkevm.bin new file mode 100644 index 0000000000000000000000000000000000000000..094cb7f56b3b8e359403fb49a435e695a95b71f7 GIT binary patch literal 92728 zcmcJYd304-cAt3s($X$%y0&iHE%>N)S=+ANy9eF7xA~}j`%k)cD{EKU zwr#gA?aSJgl(lPD8gwryYhM<0`=nc&c5O@AbZOnKv^`Z0&1ud5PV3fff_7zX+jb9H zmv;ZS)N$T*X~_PJ}zrr z7PRYH@=3eS9o|T`>=A3$tXXmrgzUpOO&*$)j)CZMk}Wa}*D;n{h{0ymI|%W|W_n*UbRB^@eT#ZCVG)Gz2aR>g ztfEt)M$MwP>G6=9^uLD?|JV|3Ze2X>Nga21`;97ODnfF4UoR1;Tr<+XP214E= z7NHv}NG5Z?I=%f&+*rai3~h?8F>PB2ZPyMAIC#y)3ke47$huCh#6W&Xml?7Q0{LE~ z(dOA2HQKfCsCo7cy1?M=A>a}N2Fg4$ss+W>Z&Cvj{znL*ivdQp?6M53nO{PU(&@k$ zRWtH`f*}7+F2I=UpctKi5q^yen2y069HXO*`>POziVvt>d;h74SK?&g2ZH=H zQw$Vo565UW<934JN~E1~cX#i|4nUFiM2u!I<@X?zub*R_Zd-cPB&&|mR3`sj2)RtM z3R7!I8Uu>7H8HAS#NUG;zIKucHfoZcj?rjF{s9EJ=_lEl7>!`uKZM}QB(pU)GM#OR z(PvEgLkQ*9PBKf6nq=oZ%1VS#8Y&&|AU5wEHM*I;3@uf*-t6ITErL)`P^n7qm zx-$ehJDmmf40puo8I16wDD^UR_Z&idy0!@i4q;BQ@1Ks-QD*)LgxMh*HQPl&yE`BWQuCQO z9b)9ahaeAk%#GBn8yP_UwKh)snfad}%;H}!iGMW{ZY{=o>*KVC5&s#2IKrtlGzC$o zH3efEG60lKG{k8q!~Y8e-m{5Ux{Ik8g`bPlHfHXH*&ilGQD4L{q9a2m=VBNy#%VJ% z_Qo*&e&mL8)ISI>s;I6nqP5K02gB+TLZeQQ8)zt^H8{j*_l?|f5aPKaTE&QcF&}Gs&t~2%35vtlifB5cj>4cy9DXEmm|0O~ zd$WitnQ=6R(e-CS6R_=A;YPXXM@2N2na5(7T|72!8WillETS
    KIUk>qg^jbg-c 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 zajec# { - protected: + public: using CurveType = nil::crypto3::algebra::curves::pallas; using HashType = nil::crypto3::hashes::keccak_1600<256>; using ConstraintSystem = nil::proof_generator::Prover::ConstraintSystem; @@ -95,3 +95,19 @@ INSTANTIATE_TEST_SUITE_P(MultiTxZkevm, ProverTests, ::testing::Values(Input{Mult // ./build/bin/nil wallet new --amount 100000000000000000 // ./build/bin/nil wallet deploy ./SimpleStorage.bin --abi ./SimpleStorage.abi // for i in {1..100}; do ./build/bin/nil wallet send-message 0x0001443b27c605cc3975e05e8eb68eef1913777c increment --abi ./SimpleStorage.abi --no-wait; done + + +// RW trace is picked from another trace set and has different trace_idx +TEST(ProverTest, TraceIndexMismatch) { + const std::string trace_base_path = std::string(TEST_DATA_DIR) + "/broken_index/increment_simple.pb"; + nil::proof_generator::Prover prover( + ProverTests::lambda, + ProverTests::expand_factor, + ProverTests::max_quotient_chunks, + ProverTests::grind, + ZKEVM + ); + + ASSERT_TRUE(prover.setup_prover()); + ASSERT_FALSE(prover.fill_assignment_table(trace_base_path)); +}