diff --git a/libraries/appbase b/libraries/appbase index 9c57bbbee4..54cc7fb4f9 160000 --- a/libraries/appbase +++ b/libraries/appbase @@ -1 +1 @@ -Subproject commit 9c57bbbee43dbc7f46a558760086b6e8bf8f2940 +Subproject commit 54cc7fb4f9a3dbbe2c71bdf23f9342c9c01b9673 diff --git a/libraries/chain/block_log.cpp b/libraries/chain/block_log.cpp index 87744676ca..88bd85cf10 100644 --- a/libraries/chain/block_log.cpp +++ b/libraries/chain/block_log.cpp @@ -1371,16 +1371,61 @@ namespace eosio { namespace chain { } // static - std::optional block_log::extract_genesis_state(const std::filesystem::path& block_dir) { - std::filesystem::path p(block_dir / "blocks.log"); - for_each_file_in_dir_matches(block_dir, R"(blocks-1-\d+\.log)", - [&p](std::filesystem::path log_path) { p = std::move(log_path); }); - return block_log_data(p).get_genesis_state(); + std::optional block_log::extract_chain_context(const std::filesystem::path& block_dir, + const std::filesystem::path& retained_dir) { + std::filesystem::path first_block_file; + if (!retained_dir.empty() && std::filesystem::exists(retained_dir)) { + for_each_file_in_dir_matches(retained_dir, R"(blocks-1-\d+\.log)", + [&](std::filesystem::path log_path) { + first_block_file = std::move(log_path); + }); + } + + if (first_block_file.empty() && std::filesystem::exists(block_dir / "blocks.log")) { + first_block_file = block_dir / "blocks.log"; + } + + if (!first_block_file.empty()) { + return block_log_data(first_block_file).get_preamble().chain_context; + } + + if (!retained_dir.empty() && std::filesystem::exists(retained_dir)) { + const std::regex my_filter(R"(blocks-\d+-\d+\.log)"); + std::smatch what; + std::filesystem::directory_iterator end_itr; // Default ctor yields past-the-end + for (std::filesystem::directory_iterator p(retained_dir); p != end_itr; ++p) { + // Skip if not a file + if (!std::filesystem::is_regular_file(p->status())) + continue; + // skip if it does not match the pattern + std::string file = p->path().filename().string(); + if (!std::regex_match(file, what, my_filter)) + continue; + return block_log_data(p->path()).chain_id(); + } + } + return {}; + } + + // static + std::optional block_log::extract_genesis_state(const std::filesystem::path& block_dir, + const std::filesystem::path& retained_dir) { + auto context = extract_chain_context(block_dir, retained_dir); + if (!context || std::holds_alternative(*context)) + return {}; + return std::get(*context); } // static - chain_id_type block_log::extract_chain_id(const std::filesystem::path& data_dir) { - return block_log_data(data_dir / "blocks.log").chain_id(); + std::optional block_log::extract_chain_id(const std::filesystem::path& block_dir, + const std::filesystem::path& retained_dir) { + auto context = extract_chain_context(block_dir, retained_dir); + if (!context) + return {}; + return std::visit(overloaded{ + [](const chain_id_type& id){ return id; }, + [](const genesis_state& gs){ return gs.compute_chain_id(); } + } , *context); } // static @@ -1538,7 +1583,7 @@ namespace eosio { namespace chain { ilog("blocks.log and blocks.index agree on number of blocks"); if (interval == 0) { - interval = std::max((log_bundle.log_index.num_blocks() + 7u) >> 3, 1u); + interval = std::max((log_bundle.log_index.num_blocks() + 7) >> 3, 1U); } uint32_t expected_block_num = log_bundle.log_data.first_block_num(); diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 9a01f45cdc..d114a2b3a9 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -402,11 +402,13 @@ struct controller_impl { } } - void dmlog_applied_transaction(const transaction_trace_ptr& t) { + void dmlog_applied_transaction(const transaction_trace_ptr& t, const signed_transaction* trx = nullptr) { // dmlog_applied_transaction is called by push_scheduled_transaction // where transient transactions are not possible, and by push_transaction // only when the transaction is not transient if (auto dm_logger = get_deep_mind_logger(false)) { + if (trx && is_onblock(*t)) + dm_logger->on_onblock(*trx); dm_logger->on_applied_transaction(self.head_block_num() + 1, t); } } @@ -1627,7 +1629,7 @@ struct controller_impl { emit(self.accepted_transaction, trx); } - dmlog_applied_transaction(trace); + dmlog_applied_transaction(trace, &trn); emit(self.applied_transaction, std::tie(trace, trx->packed_trx())); } } @@ -2665,11 +2667,6 @@ struct controller_impl { trx.set_reference_block( self.head_block_id() ); } - // onblock transaction cannot be transient - if (auto dm_logger = get_deep_mind_logger(false)) { - dm_logger->on_onblock(trx); - } - return trx; } diff --git a/libraries/chain/include/eosio/chain/block_log.hpp b/libraries/chain/include/eosio/chain/block_log.hpp index f700aa1b07..611115cf39 100644 --- a/libraries/chain/include/eosio/chain/block_log.hpp +++ b/libraries/chain/include/eosio/chain/block_log.hpp @@ -82,9 +82,17 @@ namespace eosio { namespace chain { static std::filesystem::path repair_log( const std::filesystem::path& data_dir, uint32_t truncate_at_block = 0, const char* reversible_block_dir_name="" ); - static std::optional extract_genesis_state( const std::filesystem::path& data_dir ); + using chain_context = std::variant; + static std::optional extract_chain_context(const std::filesystem::path& data_dir, + const std::filesystem::path& retained_dir); - static chain_id_type extract_chain_id( const std::filesystem::path& data_dir ); + static std::optional + extract_genesis_state(const std::filesystem::path& data_dir, + const std::filesystem::path& retained_dir = std::filesystem::path{}); + + static std::optional + extract_chain_id(const std::filesystem::path& data_dir, + const std::filesystem::path& retained_dir = std::filesystem::path{}); static void construct_index(const std::filesystem::path& block_file_name, const std::filesystem::path& index_file_name); diff --git a/libraries/chain/include/eosio/chain/log_index.hpp b/libraries/chain/include/eosio/chain/log_index.hpp index 477134d535..82ca91a0d1 100644 --- a/libraries/chain/include/eosio/chain/log_index.hpp +++ b/libraries/chain/include/eosio/chain/log_index.hpp @@ -31,7 +31,7 @@ class log_index { bool is_open() const { return file_.is_open(); } uint64_t back() { return nth_block_position(num_blocks()-1); } - unsigned num_blocks() const { return num_blocks_; } + uint32_t num_blocks() const { return num_blocks_; } uint64_t nth_block_position(uint32_t n) { file_.seek(n*sizeof(uint64_t)); uint64_t r; diff --git a/libraries/testing/tester.cpp b/libraries/testing/tester.cpp index b35e33b640..c3608b1549 100644 --- a/libraries/testing/tester.cpp +++ b/libraries/testing/tester.cpp @@ -301,11 +301,14 @@ namespace eosio { namespace testing { if( !expected_chain_id ) { expected_chain_id = controller::extract_chain_id_from_db( cfg.state_dir ); if( !expected_chain_id ) { - if( std::filesystem::is_regular_file( cfg.blocks_dir / "blocks.log" ) ) { - expected_chain_id = block_log::extract_chain_id( cfg.blocks_dir ); - } else { - expected_chain_id = genesis_state().compute_chain_id(); + std::filesystem::path retained_dir; + auto partitioned_config = std::get_if(&cfg.blog); + if (partitioned_config) { + retained_dir = partitioned_config->retained_dir; + if (retained_dir.is_relative()) + retained_dir = cfg.blocks_dir/retained_dir; } + expected_chain_id = block_log::extract_chain_id( cfg.blocks_dir, retained_dir ); } } diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index 598d73911e..3d775d1e32 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -629,45 +629,6 @@ void chain_plugin::plugin_initialize(const variables_map& options) { if( options.count( "terminate-at-block" )) my->chain_config->terminate_at_block = options.at( "terminate-at-block" ).as(); - if( options.count( "extract-genesis-json" ) || options.at( "print-genesis-json" ).as()) { - std::optional gs; - - if( std::filesystem::exists( my->blocks_dir / "blocks.log" )) { - gs = block_log::extract_genesis_state( my->blocks_dir ); - EOS_ASSERT( gs, - plugin_config_exception, - "Block log at '${path}' does not contain a genesis state, it only has the chain-id.", - ("path", (my->blocks_dir / "blocks.log")) - ); - } else { - wlog( "No blocks.log found at '${p}'. Using default genesis state.", - ("p", (my->blocks_dir / "blocks.log"))); - gs.emplace(); - } - - if( options.at( "print-genesis-json" ).as()) { - ilog( "Genesis JSON:\n${genesis}", ("genesis", json::to_pretty_string( *gs ))); - } - - if( options.count( "extract-genesis-json" )) { - auto p = options.at( "extract-genesis-json" ).as(); - - if( p.is_relative()) { - p = std::filesystem::current_path() / p; - } - - EOS_ASSERT( fc::json::save_to_file( *gs, p, true ), - misc_exception, - "Error occurred while writing genesis JSON to '${path}'", - ("path", p) - ); - - ilog( "Saved genesis JSON to '${path}'", ("path", p) ); - } - - EOS_THROW( extract_genesis_state_exception, "extracted genesis state from blocks.log" ); - } - // move fork_db to new location upgrade_from_reversible_to_fork_db( my.get() ); @@ -678,18 +639,22 @@ void chain_plugin::plugin_initialize(const variables_map& options) { EOS_ASSERT(!has_partitioned_block_log_options || !has_retain_blocks_option, plugin_config_exception, "block-log-retain-blocks cannot be specified together with blocks-retained-dir, blocks-archive-dir or blocks-log-stride or max-retained-block-files."); - + std::filesystem::path retained_dir; if (has_partitioned_block_log_options) { + retained_dir = options.count("blocks-retained-dir") ? options.at("blocks-retained-dir").as() + : std::filesystem::path(""); + if (retained_dir.is_relative()) + retained_dir = std::filesystem::path{my->blocks_dir}/retained_dir; + my->chain_config->blog = eosio::chain::partitioned_blocklog_config{ - .retained_dir = options.count("blocks-retained-dir") ? options.at("blocks-retained-dir").as() - : std::filesystem::path(""), + .retained_dir = retained_dir, .archive_dir = options.count("blocks-archive-dir") ? options.at("blocks-archive-dir").as() - : std::filesystem::path("archive"), + : std::filesystem::path("archive"), .stride = options.count("blocks-log-stride") ? options.at("blocks-log-stride").as() : UINT32_MAX, .max_retained_files = options.count("max-retained-block-files") - ? options.at("max-retained-block-files").as() - : UINT32_MAX, + ? options.at("max-retained-block-files").as() + : UINT32_MAX, }; } else if(has_retain_blocks_option) { uint32_t block_log_retain_blocks = options.at("block-log-retain-blocks").as(); @@ -703,6 +668,42 @@ void chain_plugin::plugin_initialize(const variables_map& options) { } } + + + if( options.count( "extract-genesis-json" ) || options.at( "print-genesis-json" ).as()) { + std::optional gs; + + gs = block_log::extract_genesis_state( my->blocks_dir, retained_dir ); + EOS_ASSERT( gs, + plugin_config_exception, + "Block log at '${path}' does not contain a genesis state, it only has the chain-id.", + ("path", (my->blocks_dir / "blocks.log").generic_string()) + ); + + + if( options.at( "print-genesis-json" ).as()) { + ilog( "Genesis JSON:\n${genesis}", ("genesis", json::to_pretty_string( *gs ))); + } + + if( options.count( "extract-genesis-json" )) { + auto p = options.at( "extract-genesis-json" ).as(); + + if( p.is_relative()) { + p = std::filesystem::current_path() / p; + } + + EOS_ASSERT( fc::json::save_to_file( *gs, p, true ), + misc_exception, + "Error occurred while writing genesis JSON to '${path}'", + ("path", p.generic_string()) + ); + + ilog( "Saved genesis JSON to '${path}'", ("path", p.generic_string()) ); + } + + EOS_THROW( extract_genesis_state_exception, "extracted genesis state from blocks.log" ); + } + if( options.at( "delete-all-blocks" ).as()) { ilog( "Deleting state database and blocks" ); if( options.at( "truncate-at-block" ).as() > 0 ) @@ -746,41 +747,35 @@ void chain_plugin::plugin_initialize(const variables_map& options) { plugin_config_exception, "Snapshot can only be used to initialize an empty database." ); - if( std::filesystem::is_regular_file( my->blocks_dir / "blocks.log" )) { - auto block_log_genesis = block_log::extract_genesis_state(my->blocks_dir); - if( block_log_genesis ) { - const auto& block_log_chain_id = block_log_genesis->compute_chain_id(); - EOS_ASSERT( *chain_id == block_log_chain_id, - plugin_config_exception, - "snapshot chain ID (${snapshot_chain_id}) does not match the chain ID from the genesis state in the block log (${block_log_chain_id})", - ("snapshot_chain_id", *chain_id) - ("block_log_chain_id", block_log_chain_id) - ); - } else { - const auto& block_log_chain_id = block_log::extract_chain_id(my->blocks_dir); - EOS_ASSERT( *chain_id == block_log_chain_id, + auto block_log_chain_id = block_log::extract_chain_id(my->blocks_dir, retained_dir); + + if (block_log_chain_id) { + EOS_ASSERT( *chain_id == *block_log_chain_id, plugin_config_exception, "snapshot chain ID (${snapshot_chain_id}) does not match the chain ID (${block_log_chain_id}) in the block log", ("snapshot_chain_id", *chain_id) - ("block_log_chain_id", block_log_chain_id) + ("block_log_chain_id", *block_log_chain_id) ); - } } } else { chain_id = controller::extract_chain_id_from_db( my->chain_config->state_dir ); + auto chain_context = block_log::extract_chain_context( my->blocks_dir, retained_dir ); std::optional block_log_genesis; - std::optional block_log_chain_id; - - if( std::filesystem::is_regular_file( my->blocks_dir / "blocks.log" ) ) { - block_log_genesis = block_log::extract_genesis_state( my->blocks_dir ); - if( block_log_genesis ) { - block_log_chain_id = block_log_genesis->compute_chain_id(); - } else { - block_log_chain_id = block_log::extract_chain_id( my->blocks_dir ); - } + std::optional block_log_chain_id; + + if (chain_context) { + std::visit(overloaded { + [&](const genesis_state& gs) { + block_log_genesis = gs; + block_log_chain_id = gs.compute_chain_id(); + }, + [&](const chain_id_type& id) { + block_log_chain_id = id; + } + }, *chain_context); if( chain_id ) { EOS_ASSERT( *block_log_chain_id == *chain_id, block_log_exception, diff --git a/plugins/http_plugin/http_plugin.cpp b/plugins/http_plugin/http_plugin.cpp index 9b224604db..bd97965829 100644 --- a/plugins/http_plugin/http_plugin.cpp +++ b/plugins/http_plugin/http_plugin.cpp @@ -73,6 +73,7 @@ namespace eosio { // It's a programming error when the control flow reaches this point, // please make sure all the category names are returned from above statements. assert(false && "No correspding category name for the category value"); + return ""; } std::string category_plugin_name(api_category category) { @@ -94,6 +95,7 @@ namespace eosio { // It's a programming error when the control flow reaches this point, // please make sure all the plugin names are returned from above statements. assert(false && "No correspding plugin for the category value"); + return {}; } std::string category_names(api_category_set set) { diff --git a/plugins/producer_plugin/test/test_read_only_trx.cpp b/plugins/producer_plugin/test/test_read_only_trx.cpp index 5030d9713d..2016d73b57 100644 --- a/plugins/producer_plugin/test/test_read_only_trx.cpp +++ b/plugins/producer_plugin/test/test_read_only_trx.cpp @@ -64,7 +64,11 @@ void test_configs_common(std::vector& specific_args, app_init_statu // app->initialize() returns a boolean. BOOST_CHECK_EQUAL cannot compare // a boolean with a app_init_status directly bool rc = (expected_status == app_init_status::succeeded) ? true : false; - BOOST_CHECK_EQUAL( app->initialize( argv.size(), (char**) &argv[0]), rc ); + bool result = false; + try { + result = app->initialize( argv.size(), (char**) &argv[0]); + } catch(...) {} + BOOST_CHECK_EQUAL( result, rc ); } // --read-only-thread not allowed on producer node diff --git a/programs/leap-util/actions/blocklog.cpp b/programs/leap-util/actions/blocklog.cpp index d87514b8db..cc983315d0 100644 --- a/programs/leap-util/actions/blocklog.cpp +++ b/programs/leap-util/actions/blocklog.cpp @@ -166,32 +166,33 @@ int blocklog_actions::extract_blocks() { } int blocklog_actions::do_genesis() { - std::optional gs; std::filesystem::path bld = opt->blocks_dir; - auto full_path = (bld / "blocks.log").generic_string(); - if(std::filesystem::exists(bld / "blocks.log")) { - gs = block_log::extract_genesis_state(opt->blocks_dir); - if(!gs) { - std::cerr << "Block log at '" << full_path - << "' does not contain a genesis state, it only has the chain-id." << std::endl; - return -1; - } - } else { - std::cerr << "No blocks.log found at '" << full_path << "'." << std::endl; + auto context = block_log::extract_chain_context(opt->blocks_dir,opt->blocks_dir); + + if (!context) { + std::cerr << "No blocks log found at '" << opt->blocks_dir.c_str() << "'." << std::endl; return -1; } + if(!std::holds_alternative(*context)) { + std::cerr << "Block log at '" << opt->blocks_dir.c_str() + << "' does not contain a genesis state, it only has the chain-id." << std::endl; + return -1; + } + + const genesis_state& gs = std::get(*context); + // just print if output not set if(opt->output_file.empty()) { - std::cout << json::to_pretty_string(*gs) << std::endl; + std::cout << json::to_pretty_string(gs) << std::endl; } else { std::filesystem::path p = opt->output_file; if(p.is_relative()) { p = std::filesystem::current_path() / p; } - if(!fc::json::save_to_file(*gs, p, true)) { + if(!fc::json::save_to_file(gs, p, true)) { std::cerr << "Error occurred while writing genesis JSON to '" << p.generic_string() << "'" << std::endl; return -1; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f1f4708e96..9bc971a671 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -69,6 +69,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/launcher.py ${CMAKE_CURRENT_BINARY_DI configure_file(${CMAKE_CURRENT_SOURCE_DIR}/auto_bp_peering_test.py ${CMAKE_CURRENT_BINARY_DIR}/auto_bp_peering_test.py COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/auto_bp_peering_test_shape.json ${CMAKE_CURRENT_BINARY_DIR}/auto_bp_peering_test_shape.json COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gelf_test.py ${CMAKE_CURRENT_BINARY_DIR}/gelf_test.py COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/split_blocklog_replay_test.py ${CMAKE_CURRENT_BINARY_DIR}/split_blocklog_replay_test.py COPYONLY) if(DEFINED ENV{GITHUB_ACTIONS}) set(UNSHARE "--unshared") @@ -262,9 +263,6 @@ set_property(TEST light_validation_sync_test PROPERTY LABELS nonparallelizable_t add_test(NAME auto_bp_peering_test COMMAND tests/auto_bp_peering_test.py ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) set_property(TEST auto_bp_peering_test PROPERTY LABELS long_running_tests) -add_test(NAME gelf_test COMMAND tests/gelf_test.py ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) -set_property(TEST gelf_test PROPERTY LABELS nonparallelizable_tests) - if(ENABLE_COVERAGE_TESTING) set(Coverage_NAME ${PROJECT_NAME}_coverage) diff --git a/tests/split_blocklog_replay_test.py b/tests/split_blocklog_replay_test.py new file mode 100755 index 0000000000..ae7c24ffd8 --- /dev/null +++ b/tests/split_blocklog_replay_test.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +import os +import shutil +import time +import signal +from TestHarness import Node, TestHelper, Utils + +node_id = 1 +nodeos = Node(TestHelper.LOCAL_HOST, TestHelper.DEFAULT_PORT, node_id) +data_dir = Utils.getNodeDataDir(node_id) +config_dir = Utils.getNodeConfigDir(node_id) +if os.path.exists(data_dir): + shutil.rmtree(data_dir) +os.makedirs(data_dir) +if not os.path.exists(config_dir): + os.makedirs(config_dir) + +try: + start_nodeos_cmd = f"{Utils.EosServerPath} -e -p eosio --data-dir={data_dir} --config-dir={config_dir} --blocks-log-stride 10" \ + " --plugin=eosio::http_plugin --plugin=eosio::chain_api_plugin --http-server-address=localhost:8888" + + nodeos.launchCmd(start_nodeos_cmd, node_id) + time.sleep(2) + nodeos.waitForBlock(30) + nodeos.kill(signal.SIGTERM) + + nodeos.relaunch(chainArg="--replay-blockchain") + + time.sleep(2) + assert nodeos.waitForBlock(31) +finally: + # clean up + Node.killAllNodeos() diff --git a/unittests/block_log_extract.cpp b/unittests/block_log_extract.cpp index a4c5c6ce59..49fa0a87eb 100644 --- a/unittests/block_log_extract.cpp +++ b/unittests/block_log_extract.cpp @@ -57,7 +57,9 @@ BOOST_FIXTURE_TEST_CASE(extract_from_middle, block_log_extract_fixture) try { block_log new_log(output_dir.path()); auto id = gs.compute_chain_id(); - BOOST_REQUIRE_EQUAL(new_log.extract_chain_id(output_dir.path()), id); + auto extracted_id = new_log.extract_chain_id(output_dir.path()); + BOOST_REQUIRE(extracted_id.has_value()); + BOOST_REQUIRE_EQUAL(*extracted_id, id); BOOST_REQUIRE_EQUAL(new_log.first_block_num(), 3); BOOST_REQUIRE_EQUAL(new_log.head()->block_num(), 7); @@ -73,7 +75,9 @@ BOOST_FIXTURE_TEST_CASE(extract_from_start, block_log_extract_fixture) try { block_log new_log(output_dir.path()); auto id = gs.compute_chain_id(); - BOOST_REQUIRE_EQUAL(new_log.extract_chain_id(output_dir.path()), id); + auto extracted_id = new_log.extract_chain_id(output_dir.path()); + BOOST_REQUIRE(extracted_id.has_value()); + BOOST_REQUIRE_EQUAL(*extracted_id, id); BOOST_REQUIRE_EQUAL(new_log.first_block_num(), 1); BOOST_REQUIRE_EQUAL(new_log.head()->block_num(), 7); @@ -92,7 +96,9 @@ BOOST_FIXTURE_TEST_CASE(reextract_from_start, block_log_extract_fixture) try { block_log new_log(output_dir2.path()); auto id = gs.compute_chain_id(); - BOOST_REQUIRE_EQUAL(new_log.extract_chain_id(output_dir2.path()), id); + auto extracted_id = new_log.extract_chain_id(output_dir2.path()); + BOOST_REQUIRE(extracted_id.has_value()); + BOOST_REQUIRE_EQUAL(*extracted_id, id); BOOST_REQUIRE_EQUAL(new_log.first_block_num(), 1); BOOST_REQUIRE_EQUAL(new_log.head()->block_num(), 6); @@ -107,7 +113,9 @@ BOOST_FIXTURE_TEST_CASE(extract_to_end, block_log_extract_fixture) try { block_log new_log(output_dir.path()); auto id = gs.compute_chain_id(); - BOOST_REQUIRE_EQUAL(new_log.extract_chain_id(output_dir.path()), id); + auto extracted_id = new_log.extract_chain_id(output_dir.path()); + BOOST_REQUIRE(extracted_id.has_value()); + BOOST_REQUIRE_EQUAL(*extracted_id, id); BOOST_REQUIRE_EQUAL(new_log.first_block_num(), 5); BOOST_REQUIRE_EQUAL(new_log.head()->block_num(), 12); diff --git a/unittests/deep-mind/deep-mind.log b/unittests/deep-mind/deep-mind.log index 1ae670da49..27f01404ec 100644 --- a/unittests/deep-mind/deep-mind.log +++ b/unittests/deep-mind/deep-mind.log @@ -23,17 +23,17 @@ DMLOG ABIDUMP ABI eosio DmVvc2lvOjphYmkvMS4wBwxhY2NvdW50X25hbWUEbmFtZQ9wZXJtaXNz DMLOG ABIDUMP END DMLOG START_BLOCK 2 DMLOG FEATURE_OP ACTIVATE 0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd {"feature_digest":"0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd","subjective_restrictions":{"enabled":true,"preactivation_required":false,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"64fe7df32e9b86be2b296b3f81dfd527f84e82b98e363bc97e40bc7a83733310","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"PREACTIVATE_FEATURE"}]} -DMLOG TRX_OP CREATE onblock ef240e45433c433de4061120632aa06e32ec3e77048abf55c62e0612c22548ed 01e10b5e01005a31e44100000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274003b3d4b000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044423079ed372a4dda0bf89c3a594df409eaa8c1535451b7d5ca6a3d7a376912000000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304001,"value_ex":0,"consumed":0},"cpu_usage":{"last_ordinal":1262304001,"value_ex":579,"consumed":100},"ram_usage":2724} +DMLOG TRX_OP CREATE onblock ef240e45433c433de4061120632aa06e32ec3e77048abf55c62e0612c22548ed 01e10b5e01005a31e44100000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274003b3d4b000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044423079ed372a4dda0bf89c3a594df409eaa8c1535451b7d5ca6a3d7a376912000000000000000000 DMLOG APPLIED_TRANSACTION 2 ef240e45433c433de4061120632aa06e32ec3e77048abf55c62e0612c22548ed02000000013b3d4b010000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e801006400000000000000000000000000000000000000000001010000010000000000ea305506d4766d9dbedb630ad9546f583a9809539cf09d38fd1554b4216503113ff4e501000000000000000100000000000000010000000000ea3055010000000000000000000000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274003b3d4b000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044423079ed372a4dda0bf89c3a594df409eaa8c1535451b7d5ca6a3d7a37691200000000000000000000000000000000ef240e45433c433de4061120632aa06e32ec3e77048abf55c62e0612c22548ed02000000013b3d4b010000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e80000000000000000 DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":0,"value_ex":0,"consumed":0},"average_block_cpu_usage":{"last_ordinal":0,"value_ex":0,"consumed":0},"pending_net_usage":0,"pending_cpu_usage":100,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1048576,"virtual_cpu_limit":200000} DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":2,"value_ex":0,"consumed":0},"average_block_cpu_usage":{"last_ordinal":2,"value_ex":833334,"consumed":100},"pending_net_usage":0,"pending_cpu_usage":0,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1049625,"virtual_cpu_limit":200200} DMLOG ACCEPTED_BLOCK 2 02000000020000000000000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010001000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba10100000000000000010000000000ea305502000000010000000000ea305500000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add80100000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e8013b3d4b0000000000ea30550000000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba1000000000000000000000000000000000000000000000000000000000000000062267e8b11d7d8f28e1f991a4de2b08cf92500861af2795765bdc9263cd6f4cd000000000001000021010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd0020701fd1d2d6fbca71ad1df5bd09a987d6863f301b93acfc1c34857e4b2f53821a0b4ca8483cf594f845f3f4fc155dbbc98009cb9c7b7b60d449f922dc00abcb0f0000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef26198000000000001010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd0001013b3d4b0000000000ea30550000000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba1000000000000000000000000000000000000000000000000000000000000000062267e8b11d7d8f28e1f991a4de2b08cf92500861af2795765bdc9263cd6f4cd000000000001000021010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd0020701fd1d2d6fbca71ad1df5bd09a987d6863f301b93acfc1c34857e4b2f53821a0b4ca8483cf594f845f3f4fc155dbbc98009cb9c7b7b60d449f922dc00abcb0f000000 DMLOG START_BLOCK 3 -DMLOG TRX_OP CREATE onblock da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb4 01e10b5e02005132b41600000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329801013b3d4b0000000000ea30550000000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba1000000000000000000000000000000000000000000000000000000000000000062267e8b11d7d8f28e1f991a4de2b08cf92500861af2795765bdc9263cd6f4cd000000000001000021010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd000000 DMLOG CREATION_OP ROOT 0 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":0,"consumed":0},"cpu_usage":{"last_ordinal":1262304002,"value_ex":1157,"consumed":101},"ram_usage":2724} +DMLOG TRX_OP CREATE onblock da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb4 01e10b5e02005132b41600000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329801013b3d4b0000000000ea30550000000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba1000000000000000000000000000000000000000000000000000000000000000062267e8b11d7d8f28e1f991a4de2b08cf92500861af2795765bdc9263cd6f4cd000000000001000021010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd000000 DMLOG APPLIED_TRANSACTION 3 da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb403000000023b3d4b01000000034b2b890c59dad3c04fd9300057ba6285196dc55f32e988a49d6059cd01006400000000000000000000000000000000000000000001010000010000000000ea3055ccfe3b56076237b0b6da2f580652ee1420231b96d3d96b28183769ac932c9e5902000000000000000200000000000000010000000000ea3055020000000000000000000000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329801013b3d4b0000000000ea30550000000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba1000000000000000000000000000000000000000000000000000000000000000062267e8b11d7d8f28e1f991a4de2b08cf92500861af2795765bdc9263cd6f4cd000000000001000021010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd00000000000000000000da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb403000000023b3d4b01000000034b2b890c59dad3c04fd9300057ba6285196dc55f32e988a49d6059cd0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RAM_OP 0 eosio code add setcode eosio 180494 177770 @@ -141,9 +141,9 @@ DMLOG FEATURE_OP ACTIVATE bcd2a26394b36614fd4894241d3c451ab0f6fd110958c342307362 DMLOG FEATURE_OP ACTIVATE d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40 {"feature_digest":"d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"8139e99247b87f18ef7eae99f07f00ea3adf39ed53f4d2da3f44e6aa0bfd7c62","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"CONFIGURABLE_WASM_LIMITS2"}]} DMLOG FEATURE_OP ACTIVATE 6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc {"feature_digest":"6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"68d6405cb8df3de95bd834ebb408196578500a9f818ff62ccc68f60b932f7d82","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"CRYPTO_PRIMITIVES"}]} DMLOG FEATURE_OP ACTIVATE 35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b {"feature_digest":"35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"e5d7992006e628a38c5e6c28dd55ff5e57ea682079bf41fef9b3cced0f46b491","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"GET_BLOCK_NUM"}]} -DMLOG TRX_OP CREATE onblock 89d482b30a16a7019245292abb20393bdde4ccd1ff2331b1039efc77ef70b7b9 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e86c50d366bd80731342402e85b2ddc0052985fd31301156b938d7325ded2582756e40bfbc4f83b79f8de2f5d0c5394ffcc2f724830bb6b5ed9dcd5dbb4a091398000000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304003,"value_ex":54635,"consumed":1},"cpu_usage":{"last_ordinal":1262304003,"value_ex":233234,"consumed":101},"ram_usage":180802} +DMLOG TRX_OP CREATE onblock 89d482b30a16a7019245292abb20393bdde4ccd1ff2331b1039efc77ef70b7b9 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e86c50d366bd80731342402e85b2ddc0052985fd31301156b938d7325ded2582756e40bfbc4f83b79f8de2f5d0c5394ffcc2f724830bb6b5ed9dcd5dbb4a091398000000000000000000 DMLOG APPLIED_TRANSACTION 4 89d482b30a16a7019245292abb20393bdde4ccd1ff2331b1039efc77ef70b7b904000000033b3d4b01000000044444a224a7e16ae04e24e6640d6a909fb89ca6e5e8c1e5397e1e03ef01006400000000000000000000000000000000000000000001010000010000000000ea30552786c63374c90aa8c0387b85266147ed008f53eb19b299f255e57ea78b33f69417000000000000001700000000000000010000000000ea3055170000000000000001010000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e86c50d366bd80731342402e85b2ddc0052985fd31301156b938d7325ded2582756e40bfbc4f83b79f8de2f5d0c5394ffcc2f724830bb6b5ed9dcd5dbb4a0913980000000000000000000000000000000089d482b30a16a7019245292abb20393bdde4ccd1ff2331b1039efc77ef70b7b904000000033b3d4b01000000044444a224a7e16ae04e24e6640d6a909fb89ca6e5e8c1e5397e1e03ef0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RAM_OP 0 eosio code update setcode eosio 199492 18690 @@ -158,9 +158,9 @@ DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":3,"value_ex DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":4,"value_ex":144011111,"consumed":7999},"average_block_cpu_usage":{"last_ordinal":4,"value_ex":366368114,"consumed":4433},"pending_net_usage":0,"pending_cpu_usage":0,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1051726,"virtual_cpu_limit":200600} DMLOG ACCEPTED_BLOCK 4 04000000040000000300000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010003000000034b2b890c59dad3c04fd9300057ba6285196dc55f32e988a49d6059cd2d5b1b639d6ae94fcdd0536b224644931573d1ccb2a0c548613cd1feea18888ba1daaeb8ca4a99a2fdb182ebb462ceb26de69d76f024586207a1159226ea43de0300000000000000010000000000ea305504000000010000000000ea305503000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010000000000044444a224a7e16ae04e24e6640d6a909fb89ca6e5e8c1e5397e1e03ef033b3d4b0000000000ea30550000000000034b2b890c59dad3c04fd9300057ba6285196dc55f32e988a49d6059cdded9794b7e6d10923376031cef59e6d6d809ee653bcc37297cb644078a507a6bd26c416dc790f2b35815f1d6741bc63e1c235f13e809df666ddea0ba2e5f45c80000000000010000c104121a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b001f5505dc47adebb683205c6cd618df9385777f5ffb29d307479ace7cc07533ec5d3b9e648ee95c2a1dbea8d971cd9e980c6185867556035db58109f2678ce179e30000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef26198000000000001130ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72412652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670735c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c25443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b468dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974286bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d0001033b3d4b0000000000ea30550000000000034b2b890c59dad3c04fd9300057ba6285196dc55f32e988a49d6059cdded9794b7e6d10923376031cef59e6d6d809ee653bcc37297cb644078a507a6bd26c416dc790f2b35815f1d6741bc63e1c235f13e809df666ddea0ba2e5f45c80000000000010000c104121a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b001f5505dc47adebb683205c6cd618df9385777f5ffb29d307479ace7cc07533ec5d3b9e648ee95c2a1dbea8d971cd9e980c6185867556035db58109f2678ce179e30200d0070000dc060101002026bcc48f2a2332b2fcb39133cc9226405049c824dba512d79415009b403b107d7dade3a3173c6cc9657b7662dd1fd267156e076ac91df0aea1d8172e65d676fe0100b13578daed3c0b90645755f7f33e3dfdba77df862569665773fb31606fdcc8246c66c710cdbe91ec872424c480c10fb3bd33bd3bddf3dd9e9e65d7c2edc56ce1f2b10a1525099602150d0906ab02456128ac4d245504b58c24a108258a965552201acb2a410a89e773efebd73d33614327912a9964a7efbbef9e73ef3dff73eeed09ff317a8b166ffef2e3e705fc48fc25be3efe46f8bdef15ef7ae0e17c87f8c837afbcf22fefcc75fd393cd45717b147de215f765888c3aadb158775177f7ba7e147760f0b79fab0d73d7d1abafc2efe409fe60f95fd3e6ddf89c3018251bf3c0df84e3b4c80f6340d94d023bb841861e10560a769795497401899821ef5b43fa61b4b27a2d923d3479b4bb3d3cd893d42634fa9b1bcda5c9eaeafae36da1d21b12b9e596bb71b4b9de97663a6d13cd1680b0fbbfdfa91651822b05de6f1d3ab73f52baf9a108a70f7faaee09edca8abaeb892fb62dbd76eae341667af9818e7ee208f69641ad633b7d069be5af8f8ecf55006795c2303482258f032ac777abe714a04d863561b9de9230bcb33f33373f5e6d2f44abd5d5f6c741aed5568cecc376679c7c162637166e5940809e6d8f78329e0b08b11f54a7b796579b5318b8dd9b51918234688aa8e849de66283c9b71dd1d6673a40d0dc684255586937973aabd30bbc9a8b1c8972bb291256e0de6a67b9dd20f645d4d56e1c5f6b424f7dad33274ad8b58517d63cd15c681c83d596b1f325d8d96eac2eafb5671ad30bcdc56667556cc1372fdb781fd38d93622b41aeb41bb4ec7aa7317db451efacb51b2226aaf1b2f9617b73d5bd9d76c367c53666393c2f2f4dcfd63bf5e9d5e6af36c445d40d7867a773ef9818dbf202393db33cdb102fc1fe226c1e49885b273e95a1636d651697857ddb7b949c83b54bbdff3af1d26db1d816c771292ea8f8e2822a5c22652c2bfc5390f643560af8290ad094ee9f2ac882829f82e7cb15592efb5a0a195cacbb323d735e445d91fed323d9473822fdfacacac229f18a918ba44865547ae39b7ee1cdbff84bbff296e9d9c6d1e247df2daff3445c8bbea28511f1e5f1981146bec1db3775e6cc7f3f71efd93bffeeaeae51f08cddf16b7ce8beff8bbff9bb1fb8f78dbdde6b5cef47fff6f3a2d7fd33d87de66b0f7cf3fce3efcee1f8593bfa530ffec7adbdde6ba1f7db7ffcc4173ef2a1c71fcae1d84738ce3cf1d90f3f35d5eb4db9f7ccb7eec8f7be967b3ff69dbffffaddb9f9aee3ee4f7eeb8bf9c1fbb1f753ff75f7fbefcaf71ea0b1e77fe73b7d630f52efeffdf5379ec8f7dec078bffc271ff8e283b9e95e4fdd8f3df0f14fdf7965aff7267feabdf73ef5d457de7367dfe09b7d23782be71fbce349718bb72fa5e7a71efff8377ffddf456ca2c11f3f37dcf1a96fcf80e0edfd0852115f11b5a5ee2a98b42c52b115ba525153ef81e7343e91c856a226e0897bcfee4bb411ad746b2b5d399e8809e8004095c61d23ae477068cb168e37121a5519c16bb94fa4dd03f8367def7911cbc8e848896842caeecb618ef904de4ca81200c30ca59a123df467f6612f4e938a6b05e28d5e2d551796268dd851956a9f06fcf12b135196a9a8f21ad3445d5796466d13a224a2c8882840f1fd89c8079d17f67711172bf6ea7369f47a5ec857c57c22c78070b0f42f09d844819a31b4bcac85af45fcaa517a34b286af60c5f3f116e8f9aa688d89e8c305582192b30618e09797a8f9347c1defff21d83f7556556414c014e2ada38676eea505a2b587bdadaa7628005a6f0cad532f07ed65d0a5a1a0e3a1a0b70f055d190a7ae750d06628e8b1a1a06b4341ef1e0a7a7c28e83d43414f0e057dcd50d0e7453fb8dc0c5ce5c05506fe3080cbef0f2e07c0115844df915a76d569b23be3f38926b38373c5adb83025aa5e1a57d1a02968fb60e2f08551ad6aa0d0de02ce436561fca9c23b8c67822b84389b785393e7ce567d78d78575190fde55bd12dbdf54eea7b5ddcbd61720f76a304d0e76af16381ddafb5655e0ec386b44a63c51a901d3cd686240d39b5e033ccea73be9c9563c026b2cb4766980341a3f3c9cc8db8b9103cd07561f440dec2398fef7435802f98087db7f5af0fe352820fa01684d815daec04777af8e611a01e8120f97ac0921d1c0832da277bbeb5f3ff16f57800b10e8450ed2fa00227e7502f41e379a377efe61763b0678378eef692df11ea68f17ab37d0b077fd050e03c1887725021711034d6aadc4c736ec03569804ae5d6925a16d1b8d688185f884988d029f9014f0c33385f9781c0885fd00047bc151013fc7ee3944a24d5a6cbbf438ef9cc6d44066e6ecc3843acc1308761c7648a13da166a1090e88b8185f35ca780a791a59425aacf1c5893fa1f6102961647c2bb274ea349055be0d7efdda9b76c01a90668226cdb880f403c0ddc4055d533b13851fe6268057f826860fe6564aa0ca3057419e2ab0819d25e40434ed7a693b1a6c583c1121a2c355e120c5756574dc97453c5325f1af2b8bdebc205707500daa02506a8c57e65ac876501b4321050a83421c0a70000b044a3261aae2272e7627e187099f26df7d36d0234e2f311e505558f618cf297005a0bce06690bb3e29034ceb83f8d73030d80f4107a804ae02175652107bc0f37e5c2374e2c2029238fe0f5407561957133fedb2edf84f1453248f9fbedd3b54c646fcca6a98ca6a017b81ba1c19cd27e1188caf824e49901c3fae8eb2d0062cb456460324fcb80980d6b60304d8b56adc52b8fe9042b7f4a9cf9296042664e10a310cf114ef30bdb46f10ca7f7504f080c92802f9c0981a2f350006b6230273e293425755cae6a444468c46b5aa65dabecf66a484562c3265b2621159b112bc032be69b08ad58c45aea3b2bf6c9476805ca9450c89483652be66330da22bb19e1b4c001b4625e66c57c67c5ecf468b500054ed93364a496b00cd4a06a84734548359e3232457c61b0a788d0f050e307126a9353f322da6dea8a7b9a2f41ed40fa820965f003f50ad0a3dd82373b9daced4c7cb2382036a85a3ebe8ce123ca54cbc05380aa85f295a9d608cd6789ad415841af006301f5208420989495d8c328b0df671da0f8d504d11d4a2b30cfa40506ac73152cc418597eb4a982d9f01932966a5facc834b005fd06751ac97ec0633b48bf023686011a438c77802f199530f682e7b8f70c84f480f6f4802d126b0a4d15b28e26e019ff80e551a737b7c88da079ab51f0eea15946bb63836c8f788dfe17d685161276b3670a25a016278455583328c00cfa6806fdcc0c8200a17df882eef96da00c980672f1b493445f232ee1989e1ebd2973ee1aa1d11a4ed5a0a5a8350e2d49ad496821b8a6712fc1d63d600b0a27ae161793aec7d07a29b52ad0da8e4030e06a11521f8e0bb2717e36cec325f0fc93efc0a9dfc159e199f3cf88dbcf4247c5767cf5dadb294ca0a7a72fbdfd2cbe2c9cc3c76f6fc557156c7f3724a01ab4bfa76fa7659f3d7b96350fa6895fe0692a442024da366a21212fa216922fee4bb3e47c7a291bd2730f6741184a23d804930bc20c0981228e422c7697967ed79a647c8fbf807af3696511d801c623483ffae47d4fa216a6f761a31abab1206434cc4b9fb8efc9cbc040827683bde9242198e5e0d08e24c4e5800517148b8145ad2cc4bb303492e40dd005a08ca2d7a82c2490ff49544f819a0eab26b9c72c34e04108dea2180f8c6f60734b5e6ec8cea7d0024753951a737270431ece024113cf225921503ee1f50ac47699be617409dd34353ecf510c097e34341e394d9ad29234a429614710e08a7837bc0d39daf351ed04aed6c368881d30600083012b0a7145214282d372ee59a2f991687e607b38130564d8e94167f498d29eb34431e95b8a1b22ef0e53810b535872e0552339381d4ffcf9d45fbbbf1a90d79110e7834f0ccfa17fbc0577a3881296e7be5ba0b206024d02a6d0645589b8cf8a297d1bc18469777f5959d4a48da556fc86513281840b8247df5293e8e75b6a021961533eca09c8487c8b8838c441cf0e9efec632c584269c8f7fce02520465c29be80d587294e788832f8f3f7001881da9047a1afffc28f945b0607faa155ab09efd42e31d5ff23c9b3191993191993191376382cd98c8cc98c8cc98f8ff67c6c01fed483f0399e34ee0d54fa79fa6161ba8e8f7fb5d0e57a884e595425ee123f34a5b5e493b85a216f34adac928d3b4bc82d63d60bc9857125d30f10a5bcc2b89ccf49057d8c7bc72e3fc6c9ce7720b8d44d48344d47d44d4fd44d43922ea1c11754644dde3154d13bfc0d3548840cc2b6c31afb0c5bc8268257e39c52cc09d7b7e1410fcb005042afe310a02bef410e709cca83f93d2735ea497d441f8fae38957b6358702565cc809908de53a437ac63b44eee89555c55998e7b2304042cff1a5a316810586219053c9a8972f615ec2193b2760e86d2996f5d293c7d3c2817c6ea5b3b16cb25f2b35ac1c97cdcb7549f0052e2dc2e0fd47483640f2a8629918ef930996081485e72803b6c034c61f98db417f0bab2c355bd3225cf96c1ba3bd1a2663353586f542aa8b38ee939060b9718ca21475e0d9e02e4138e9e0e4b3c059808b070068e129859e992c531e5968c553a35c732924544ea1fd95b8aa628b7acf485bd1b3a54fc8bd3546bd9ace8728563e44cbb8fd91befae8e58202215e32058e182a3d238e03a19e91c713d5b9ff2cb2260d5b90850655346a67e4f1b20d9228e6f339e653102c91bbc2b80883611731791868e3070f641642587a6399abaecc232f72317d308f549b4ffc9b7284633cc8ea00d2e52c9930beade8dea1fab2880207e65ea2e78d3c44e125d0e36a215c1202dbd55c48ee42d46fab45dae51eb8274c3cba379465fa0cfc8428e8444a78a9d2ef4197e67c4361bea1b19000f98626c1d556788d8664838bd8982f00ed2025a8eade5a6c44ebd68041782f039230d13cd57f608a8328fe482dda3a05f11187fa05ae7f62c4ef5118ee22faad363b7840290da2017a76463eaf8a762b7fdc6c156d42ddc6927b704335bb95c5fe736240c1080fcafd3e869e84a7c7a8743289824f0a40551eece51c0975cb157ab9c4a077e99b139f4bd472af46dde71a3696be6bb6dcb94b1f64ac57b2364de6b4e91aa74d6724aad30d439a37d8f893e769e3d0f9375279cc80ff6be797f37a032e0ff43b334758740b8cbe5c405a693037c1a45a1c882bce21dea760439ecb6136db50c56ea8f2836ea86281bfdf867cebc693f5bb82bcda77236337321e1854c80daa38fa54360909b0b216308de8cc20ae16f0a3521d21528d9802961ee29791f5861d7d48cba8dfc7a159264a65d574df5205abcdde40a5d91b23b3e05bb50315dfce1f311f0081fe54587f0a2eb6a16debf8d028ad88bd48bc778ab4d0e0f903f8203063f1a8f52a86e49bb18e51decffd220972f57e0fac7b80f5fe80d688050520f8e116566390fcada4805707ba586ef7d285563282188a88b96809bfd24a22b2afa6c819bf971eccd8d7e23a658931682e491e6c9952aa3ae9b947042afe368922927651e97d10ce229d40446684d2f2c844a648af50950b3c8c174d55573a13d35c1ef172bef3af34955b47723904791b4d07817400c8a75a1b39511da1a6a04cb03967af02ae929ca84f4ed447278a35a610a559630d639d130d73859324c0c442b31fd558b37d1d3b502c50e0d1d58d5c418709fd0ed0dd84b6c29368c7108d041dc918a29121459c204286447890099dc010bcef01ee2bda6f7de4c1967d07f03ebe2b3306c5c57560487990213e533a807d4596da452aaf61593fa25748ed11c79002d599606b052415e851c444c07584ae1424b874a2f93c8b0b43db498b49e9e3eb49441082b165e5c43f0c7411b8a97b25ab5e4ca03926f090c82e2cc03a786235c7b31f308b6b155a4ea90497fa6d0933f106a387ec5cc9fa6fc74a908930c53c8c2a9810385c8bfa4f12e5cf03c7fc350c27f07887aa753af5d61294a010e209f6cf28841aab7d9ec3a3b1ed7720bcd06415500ed0108160a1448c60e0d7db4da5b5f9be702f552f178210858abc85002b6a8129ce5723d603b06f10c348148e80d959c40e143b3eb1915464e4e846422f9ed8082b4f396992287a5bb87c285136b73279b79050da32e85616db2d5955b4831208db93b6078935e74607a6cca31811e1468be0c32a126b2660ad68a73924a528aa5cd2364cc24b4920c3650cab0a1c56791c568d70a9142660e10cd8ee05ce6e85fd760fd79bf0d1295d5020bbb795ed9ec8d93de9e0c9d4fa4ecd0ad6eef9836aa699e0b24ac55ddad0161b086ee5235eaae386561b4d9915a38c2b29e31b5b81fcbca47890f7af32d5c3c85b5bed188cddbcaac7aeda1d7af36da9090e55b14e4d38a4b39a7e967a687cd3673565de6a9281cbac261eb8f5520f0fad26397f14504d6567b69a9435f8f7c487a3774a0ad406cf8a5f88c8d606a5607a6e748e15da3fe58eed36b97676fd600aa3f83ce4c2ae9d6d048da1c8855d3b7b6ed0f150d0db8782ae0c05bd7328683314f4d850d0b5a1a0770f053d3e14f49ea1a0278782be6628e875d7ce3603bfc06b679b69f846d7cedef7c3520485f4852c183984f778be4711933de87b7a1363bae172fc81e5f8b81c9f8de914a54aeeaa4b1a57f9865d16856417cdf07a01e1edbfe4e2e36595d09a5e9fcf90f11c0f231d94df117bb9a54891eb637cb98597a8f87649112fb70426a2cb2d015d6e29620201599e09f0720b5f08c2d4b7ef72cb88292221471cac5bfe089ac911dc174ebbee728b72975b94bba207c1133c0c5ed12bda3c12270a90123c1f67ac1c68e72fab59a20d5c59d3f6ca5a855b7c658d8a248020e40ac93f034d0a5c22f1f91a99dcab6fe3eac8cd994f8b5bf1647605eb735a7bee44e5874612fa448078ef5bde8779de17f2bc0f99f7851cefc30be1bd6f42e4bdef60dd827daa2058de8717c4fb7003de8719ef7de63dcf373cefedf5d5ab334e3e29b5ee3fbce7545373b40671dee4e2fd7c0c2ee8ce027f65c0f878c0eedb0376778f80ef29daf0b5a6c693e07e4a08368771170f037730af28a5a300173a21bafdee432eba654329d0ce12a8072e022b152eb78b29b7db4aa7f3fcfd81ef71c15b0f6c8ebf0d40970f38d9a34c48df8317d340bc60912063b740f21276b8ceddbe5a6ccd5d2611eb2eb078587e5128d43267d1a54d00037b37974278266f4044cae10c37c6e90f04819c6cf81855de3aeaee2b0478af84614a7952445f9154b450b9fd733dc2c8ab54ccf91fefdac35d7b9bef5a6fb46bcd3e70fdae75ffae6397cf795cc87118f5c618e58053b67b8e6f1b1d60f2252c10944ab16854f196c7a6fd279474390d1588e9da479ab4129b3ad65a57293105adcbc5582a8fefa02abc40d9153db1e00b25ee664c4dd56838a4bbf204caf9f11d0915d7f1545fd0acd19dba77917abd14a27abd8852e8e430643994b62874951ae73387679d7ecb854cbf65f3e99db687681bbcf52a1f824e83ca7fe2e14ce5430c22fdbe8cc9cbaef1af579681708c260ed14c849c0c0f9a8959c80c7bb24281199651d064e1718c978be1d6ef57b1271bd82c85809caea6559af34599e43ef922cc02025eed0f8c3741a50750d9cb669009c5bf3c1afdcf7ab3c40a01d93e4c058aa45191eeafdaca817e91ec945d818f2b805fc7936007d5dfa93c414ecc043ba8a463e732feeb379c6b83d3c79c5556f4ff28d90fb6343407a46ac03abc50f7317be46de84b171cae507d767beecb17aac4a75e5ebbc75b5751d838dbe12b851bd9562fae8ff69b6a3ab2a55bc75cfdb1676a826eca93553cc88720028b531ed5015d15b9d2a2d7ecbef3c5298fab4eaa2aec8977c4851e4a86e85e229daf494a3df6ba3a5dcc9721f11805fa4a94ab7cf0111bf1d1f1c96f706dde5be7e65eccdabc3de00ed1a2afafcd1fb187db7db579cc5a2617b0366fa9ea2355b5bdcc9f04842f57f2c3d760ce06a86a6bac1a565670c1505636f7736573c73aa3e399d13e9109364a5103a4ef1e62e3ba2c154f481163bf4d8d3ee4cb527f497d7d517d72b157541fe7a2bae2a23a857414fdabac20adb282b4ca0ad28a0bd2dcea2fb94f6e5072cf95da8933546affa3df7e74eca6b24cef86cf5ca51d47e8f4b71ebdfb223cb747fec8ce86757689d23cb9d0abad031f6d6d1d39daabadff409b42cab8d6645fe53dbb00edaaeff4ed9a8d8ad1f4151557959754952743deabcae3418d2dc303d222be26b92bf59de8905bf6b3339df759c9a3ea7189cbea11ddaf85416f6bbd4a8ad780db464f01c8b900ed56c791a75ba4bd5d4bcbb2c967ee78c973c74b24bbb672aef86c490c6a80e4fd20767b7937ca7d6582a5d35d74f807feda8476c7adc3d98a70bdadd06c2b34db8a70d056a05de0fb1f7c99b9d5f327e18141150cf98b3e035e2b1c74cbf64b1ff06879566b51c97c904c7c595d58bb3ace5fe9c03331d8139fc5d0c5264e2b4576e53cee3d17f8608d9f4b74bb04268a8f2195c7d906dc40f77576090bb1d90c6260063130033d3fbfc84e4ad92574ca1e29597456667be8dc7b87ce3d3b74ee79373eefe6b319bebb0fb8c7f6aa31a3507bed552d11fd8bc70710e745cea1a3462b32bbfcbc4509694fd6f80b59a40a052a596401b03ab08163f7dda58c81c8cdd61efa44243bea9d6cd195e4752242ae9788273311a138a39fecd4d52f28d4d52f2bf65a8e1517c50e2517c2ec7ea1b60ba876e563de8df078ebf0b0f1c4af39262a9e1b7d6e342389a0afae3a111beba35e5eca72d453eba9a7d653af276eeefb1f0371d0792ae67c10bf2593bbe48ca4ae9030e2b7644998e99a204b5c0dcfca21e44bf43c5fee40eccc1de5ce7d576e2a2b5bc42b5e4f2618bf3a836200c46b733c83be0cff144400de906274fe86430003ecb72cc0fce35d109fac2702e35776e8eb6d74b5cd435df0ca744b80bd1187c6907a1fa7c818298733611cee8e8dc5848dd75dfc0cefe2cbecd16e66ecf27a9b11ee79c1cfb769241f213339630e9969c3db9df33136dd84d8f627c1317dc3d7f41736a25347ebcd85c6ace92c9bfac2c2f24cbdd3302bf5638d55b1b6d438b9d298e9c0cb46bbbddc36cd2573b479b2313b7de454a7b16a669697563bedb599ce725b74e61a66798987f19fbb3133f5a5a5e58e39d280d602ce30db6c03b68553c2fda4ef7c48444f79f609ff3c0ee06bd4174dbdd3692cae7478556f6d376949ab1d83b33496664551d83fc3033861a51d93fd359eab8d58692f77966796178c1bd35c35b890de5fece13f80a5e09f7e6ef30a5cab0fff02f8b77ca405dbc101ab0c00c3db7520c634b6794ea0d8e2da42a739dd5c9a6d9c144c1ffc9b40cda563d978612935032f6046c6bb8ab09dfa9105e8386aeaf07eaed1469277dab091f5932f2ecf368f9eda645e3b811d734113f05f1d6a3b2ececcd5978e0135dacdc57afb94996f9c326f9d6b2c5994b89bfa9245bc294171dffdf43cd6e80811022d0bf06f04fe15e15f24f04fb108d15c3a515f68ce9a13f576b3be847bc2ad3c17a1045b1b795f4b00d7ff02b86d754e00d007000082010101001f5be06ae972efdca372f145881855ab035fc9b761243d0042d6d39703ea6e94a86cd3b37db4b18cdc3f21d6403bc80f91005cf01ed88a02858ec4a7b9fe9ba77f0100e60778da8d56bd6f1c45149ffb3edf25966308c6292882682205e24bb0ac54a6a0a1a0e0a340262c733bef6e47b73bbb9999bdf3414d116890e88284228420852ba7890c85752d121209690205d081c4ffc09bd9bdddbd353e3cc57ebcf7e6cdbcf77eef37d3faa3fb418dbcf7f4f131c151310ff2f7b577cdeba17b385b10dcffa7d7fb627d2eb9b3be0aa1e2e1cd9bb4cf5fd97ab957d9e8fba13b72141f0a2e860e8db5174aaea797c754722ab4738ade195fdb6ca313c7a3ca23d546381120eb8206503792aeeb813b5271d07b75bb4d5dcdc75403a9ac0e80ea5882c3f810942e5aad64ae497d457b129417faac1973a1aff7ea2398aa73f87026c0879edebb854edd30165a6d462003ae3028e1f830063f33694c28d7eabc7966b24ba78743aa6758f6a29def7a940b27a212c3d52015b9f04c40f7d35409d04eace810ac93ed1b97349543d065ad13b93a5d66d34cd6920a653285712cbab8de7ba14f154e00b9d46a2df7ed034ce83495bfe88642c3be7606124ce6954d5c6127220ece6aca40a4a68588dd285ed8c862c4997659c465179b01267899c1f3650f3e1f80e641963206039012181aed3bb01f7149addd840b164e52ab8b652f0cfc2c6fcf1925173e17e0a46ac53f9a2fb07152cb20d29e556f6ddbf4e4f02aaaba2e152ef87629525d4dfee6685c2bc3b969f6cf59b1553a38157167cc49b5953682edbd4e3e3bf9cfb14baa35fce94471dfe7ae839fcd449e6eaa8d3b18598ff5058f753764907ce969947c7525dc8eb98400e6cb0a845b3209a7bb129b3c4cc9207b240c917779d3b202e48256887a194aec43058221d8396bd9cdf576da28d1a6928dfe54833a912424207497ae594ec2c6290c41aa05cb93795f48cf7a244316bbb8a99ca6aae7336116651ece69c47a0e93372744b694115bc6d254a4521fc830b0fe9b0a34b26ea9ec35142599e918bdcf0324be52215790ac1c6bd3b0b4d4314d9dc4980a4c8b15052df465aa5f72d41c0706090d93989d9571304602c4ac25ff162ec956b08ada52a4229566f2f1dfec69d689241f97826a71e51871e2b86d8d4286ceda0a93c4621f9e3d5994bd5b9d586450aefd2f943b71c468da4af5a5ad644298e3bd6eecf352770b470ca9b6ed9f0237258a4520ade1417ce54b3c94f35391fc70e7caeb9f7cfbda022f90dd1f9fde3ff8fa8d62afe3b83aaa7df759deab64f7abbb97d9c3bbc506c4f1fba38f9f7c93f5d3e7ef6cff0aece068117938ee41707094a16c7e7d98438c909fde3cf20e674548e1d87de9d3c359060d428e1fbdfff68359a1d8383efc7eefc12c2b2b8e9d9f519097d00477fcd79fbf146b6503f6df7a52ac88b9c9dca38f7fdbaaf1ed1b84e4f70dbcf59ce182525976da937f01d36959fa0000 DMLOG START_BLOCK 5 -DMLOG TRX_OP CREATE onblock 48f08a7ea5ea23750c7f9b142fb4bb947bb3fc73d42fc59f26339f2487773087 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed3232b905033b3d4b0000000000ea30550000000000034b2b890c59dad3c04fd9300057ba6285196dc55f32e988a49d6059cdded9794b7e6d10923376031cef59e6d6d809ee653bcc37297cb644078a507a6bd26c416dc790f2b35815f1d6741bc63e1c235f13e809df666ddea0ba2e5f45c80000000000010000c104121a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b000000 DMLOG CREATION_OP ROOT 0 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304004,"value_ex":100468,"consumed":1},"cpu_usage":{"last_ordinal":1262304004,"value_ex":256961,"consumed":101},"ram_usage":199629} +DMLOG TRX_OP CREATE onblock 48f08a7ea5ea23750c7f9b142fb4bb947bb3fc73d42fc59f26339f2487773087 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed3232b905033b3d4b0000000000ea30550000000000034b2b890c59dad3c04fd9300057ba6285196dc55f32e988a49d6059cdded9794b7e6d10923376031cef59e6d6d809ee653bcc37297cb644078a507a6bd26c416dc790f2b35815f1d6741bc63e1c235f13e809df666ddea0ba2e5f45c80000000000010000c104121a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b000000 DMLOG APPLIED_TRANSACTION 5 48f08a7ea5ea23750c7f9b142fb4bb947bb3fc73d42fc59f26339f248777308705000000043b3d4b010000000596867aec674ebb58c23ffcafefab5119fdbdbb08736a63fbdc64e75101006400000000000000000000000000000000000000000001010000010000000000ea3055080cda2e60a87185264b067ea2e9e32dceeca3c6727a538c215223e312a9327d1a000000000000001a00000000000000010000000000ea30551a0000000000000002020000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed3232b905033b3d4b0000000000ea30550000000000034b2b890c59dad3c04fd9300057ba6285196dc55f32e988a49d6059cdded9794b7e6d10923376031cef59e6d6d809ee653bcc37297cb644078a507a6bd26c416dc790f2b35815f1d6741bc63e1c235f13e809df666ddea0ba2e5f45c80000000000010000c104121a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b0000000000000000000048f08a7ea5ea23750c7f9b142fb4bb947bb3fc73d42fc59f26339f248777308705000000043b3d4b010000000596867aec674ebb58c23ffcafefab5119fdbdbb08736a63fbdc64e7510000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG PERM_OP INS 0 9 {"usage_id":8,"parent":0,"owner":"alice","name":"owner","last_updated":"2020-01-01T00:00:02.000","auth":{"threshold":1,"keys":[{"key":"EOS6JvuLaCqV8qHbSqUBVRPMo9N7V3vgE8YqHmweG568YmTDJ3opq","weight":1}],"accounts":[{"permission":{"actor":"alice","permission":"eosio.code"},"weight":1}],"waits":[]}} diff --git a/unittests/partitioned_block_log_tests.cpp b/unittests/partitioned_block_log_tests.cpp index b44872ac61..7e70fc9b86 100644 --- a/unittests/partitioned_block_log_tests.cpp +++ b/unittests/partitioned_block_log_tests.cpp @@ -21,6 +21,17 @@ void remove_existing_states(eosio::chain::controller::config& config) { std::filesystem::create_directories(state_path); } +std::filesystem::path get_retained_dir(const eosio::chain::controller::config& cfg) { + std::filesystem::path retained_dir; + auto paritioned_config = std::get_if(&cfg.blog); + if (paritioned_config) { + retained_dir = paritioned_config->retained_dir; + if (retained_dir.is_relative()) + retained_dir = cfg.blocks_dir / retained_dir; + } + return retained_dir; +} + struct restart_from_block_log_test_fixture { eosio::testing::tester chain; uint32_t cutoff_block_num; @@ -47,12 +58,13 @@ struct restart_from_block_log_test_fixture { void restart_chain() { eosio::chain::controller::config copied_config = chain.get_config(); + auto genesis = eosio::chain::block_log::extract_genesis_state(copied_config.blocks_dir, + get_retained_dir(copied_config)); + BOOST_REQUIRE(genesis); + copied_config.blog = eosio::chain::basic_blocklog_config{}; - auto genesis = eosio::chain::block_log::extract_genesis_state(chain.get_config().blocks_dir); - BOOST_REQUIRE(genesis); - // remove the state files to make sure we are starting from block log remove_existing_states(copied_config); eosio::testing::tester from_block_log_chain(copied_config, *genesis); @@ -173,7 +185,8 @@ BOOST_AUTO_TEST_CASE(test_split_log_util1) { uint32_t head_block_num = chain.control->head_block_num(); eosio::chain::controller::config copied_config = chain.get_config(); - auto genesis = eosio::chain::block_log::extract_genesis_state(chain.get_config().blocks_dir); + auto genesis = eosio::chain::block_log::extract_genesis_state(chain.get_config().blocks_dir, + get_retained_dir(chain.get_config())); BOOST_REQUIRE(genesis); chain.close(); @@ -269,8 +282,9 @@ void split_log_replay(uint32_t replay_max_retained_block_files) { true); chain.produce_blocks(150); - eosio::chain::controller::config copied_config = chain.get_config(); - auto genesis = eosio::chain::block_log::extract_genesis_state(chain.get_config().blocks_dir); + auto copied_config = chain.get_config(); + auto genesis = + eosio::chain::block_log::extract_genesis_state(copied_config.blocks_dir, get_retained_dir(copied_config)); BOOST_REQUIRE(genesis); chain.close(); @@ -326,7 +340,7 @@ BOOST_AUTO_TEST_CASE(test_restart_without_blocks_log_file) { chain.produce_blocks(160); eosio::chain::controller::config copied_config = chain.get_config(); - auto genesis = eosio::chain::block_log::extract_genesis_state(chain.get_config().blocks_dir); + auto genesis = eosio::chain::block_log::extract_genesis_state(chain.get_config().blocks_dir, get_retained_dir(copied_config)); BOOST_REQUIRE(genesis); chain.close();