From bc56f3c18ab748bc8c63b31cbc434928031c56ce Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Thu, 27 Jul 2023 14:48:29 -0500 Subject: [PATCH 1/8] GH-1403 Automatically set disable-replay-opts when SHiP enabled --- libraries/chain/controller.cpp | 4 ++++ libraries/chain/include/eosio/chain/controller.hpp | 2 ++ plugins/chain_plugin/chain_plugin.cpp | 4 ++-- plugins/state_history_plugin/state_history_plugin.cpp | 9 ++++++--- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index c3fa424eaf..18ce7079d8 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -3050,6 +3050,10 @@ void controller::set_key_blacklist( const flat_set& new_key_bla my->conf.key_blacklist = new_key_blacklist; } +void controller::disable_replay_opts() { + my->conf.disable_replay_opts = true; +} + uint32_t controller::head_block_num()const { return my->head->block_num; } diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index 68da901025..0d1d15285b 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -217,6 +217,8 @@ namespace eosio { namespace chain { void set_action_blacklist( const flat_set< pair >& ); void set_key_blacklist( const flat_set& ); + void disable_replay_opts(); + uint32_t head_block_num()const; time_point head_block_time()const; block_id_type head_block_id()const; diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index 6073a8637d..6875ae1665 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -383,6 +383,8 @@ void chain_plugin::set_program_options(options_description& cli, options_descrip "Duration (in seconds) a successful transaction's Finality Status will remain available from being first identified.") ("transaction-finality-status-failure-duration-sec", bpo::value()->default_value(config::default_max_transaction_finality_status_failure_duration_sec), "Duration (in seconds) a failed transaction's Finality Status will remain available from being first identified.") + ("disable-replay-opts", bpo::bool_switch()->default_value(false), + "disable optimizations that specifically target replay") ("integrity-hash-on-start", bpo::bool_switch(), "Log the state integrity hash on startup") ("integrity-hash-on-stop", bpo::bool_switch(), "Log the state integrity hash on shutdown"); @@ -403,8 +405,6 @@ void chain_plugin::set_program_options(options_description& cli, options_descrip "extract build environment information as JSON, write into specified file, and exit") ("force-all-checks", bpo::bool_switch()->default_value(false), "do not skip any validation checks while replaying blocks (useful for replaying blocks from untrusted source)") - ("disable-replay-opts", bpo::bool_switch()->default_value(false), - "disable optimizations that specifically target replay") ("replay-blockchain", bpo::bool_switch()->default_value(false), "clear chain state database and replay all blocks") ("hard-replay-blockchain", bpo::bool_switch()->default_value(false), diff --git a/plugins/state_history_plugin/state_history_plugin.cpp b/plugins/state_history_plugin/state_history_plugin.cpp index 2407fdb2a4..67d2f41492 100644 --- a/plugins/state_history_plugin/state_history_plugin.cpp +++ b/plugins/state_history_plugin/state_history_plugin.cpp @@ -314,12 +314,15 @@ void state_history_plugin::set_program_options(options_description& cli, options void state_history_plugin_impl::plugin_initialize(const variables_map& options) { try { - EOS_ASSERT(options.at("disable-replay-opts").as(), plugin_exception, - "state_history_plugin requires --disable-replay-opts"); - chain_plug = app().find_plugin(); EOS_ASSERT(chain_plug, chain::missing_chain_plugin_exception, ""); auto& chain = chain_plug->chain(); + + if (!options.at("disable-replay-opts").as()) { + ilog("Setting disable-replay-opts=true required by state_history_plugin"); + chain.disable_replay_opts(); + } + applied_transaction_connection.emplace(chain.applied_transaction.connect( [&](std::tuple t) { on_applied_transaction(std::get<0>(t), std::get<1>(t)); From 5510a7821e2448ae43df0bf91265f2cfe8147861 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Fri, 28 Jul 2023 12:27:47 -0500 Subject: [PATCH 2/8] GH-1403 No need for chainbase if not actually logging delta data --- .../eosio/state_history/serialization.hpp | 178 ++++++++++++------ .../eosio/state_history/trace_converter.hpp | 2 +- libraries/state_history/trace_converter.cpp | 4 +- .../state_history_plugin.cpp | 2 +- unittests/state_history_tests.cpp | 4 +- 5 files changed, 125 insertions(+), 65 deletions(-) diff --git a/libraries/state_history/include/eosio/state_history/serialization.hpp b/libraries/state_history/include/eosio/state_history/serialization.hpp index e7eab0e9dc..e5d3ca7f66 100644 --- a/libraries/state_history/include/eosio/state_history/serialization.hpp +++ b/libraries/state_history/include/eosio/state_history/serialization.hpp @@ -22,11 +22,25 @@ struct history_serial_wrapper { const T& obj; }; +template +struct history_serial_wrapper_stateless { + history_serial_wrapper_stateless(const history_serial_wrapper& w) + : obj(w.obj) {} + explicit history_serial_wrapper_stateless(const T& t) + : obj(t) {} + const T& obj; +}; + template history_serial_wrapper> make_history_serial_wrapper(const chainbase::database& db, const T& obj) { return {db, obj}; } +template +history_serial_wrapper_stateless> make_history_serial_wrapper(const T& obj) { + return history_serial_wrapper_stateless>{obj}; +} + template struct history_context_wrapper { const chainbase::database& db; @@ -35,11 +49,27 @@ struct history_context_wrapper { }; template -history_context_wrapper, std::decay_t> make_history_context_wrapper(const chainbase::database& db, - const P& context, const T& obj) { +struct history_context_wrapper_stateless { + history_context_wrapper_stateless(const history_context_wrapper& w) + : context(w.context), obj(w.obj) {} + history_context_wrapper_stateless(const P& c, const T& t) + : context(c), obj(t) {} + const P& context; + const T& obj; +}; + +template +history_context_wrapper, std::decay_t> +make_history_context_wrapper(const chainbase::database& db, const P& context, const T& obj) { return {db, context, obj}; } +template +history_context_wrapper_stateless, std::decay_t> +make_history_context_wrapper(const P& context, const T& obj) { + return {context, obj}; +} + namespace fc { template @@ -56,12 +86,20 @@ datastream& history_serialize_container(datastream& ds, const chainbase: } template -datastream& history_serialize_container(datastream& ds, const chainbase::database& db, +datastream& history_serialize_container(datastream& ds, const T& v) { + fc::raw::pack(ds, unsigned_int(v.size())); + for (auto& x : v) + ds << make_history_serial_wrapper(x); + return ds; +} + +template +datastream& history_serialize_container(datastream& ds, const std::vector>& v) { fc::raw::pack(ds, unsigned_int(v.size())); for (auto& x : v) { EOS_ASSERT(!!x, eosio::chain::plugin_exception, "null inside container"); - ds << make_history_serial_wrapper(db, *x); + ds << make_history_serial_wrapper(*x); } return ds; } @@ -76,6 +114,16 @@ datastream& history_context_serialize_container(datastream& ds, const ch return ds; } +template +datastream& history_context_serialize_container(datastream& ds, const P& context, + const std::vector& v) { + fc::raw::pack(ds, unsigned_int(v.size())); + for (const auto& x : v) { + ds << make_history_context_wrapper(context, x); + } + return ds; +} + template datastream& operator<<(datastream& ds, const eosio::state_history::big_vector_wrapper& obj) { FC_ASSERT(obj.obj.size() <= 1024 * 1024 * 1024); @@ -114,20 +162,31 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless>& obj) { + return history_serialize_container(ds, obj.obj); +} + template datastream& operator<<(datastream& ds, const history_context_wrapper>& obj) { return history_context_serialize_container(ds, obj.db, obj.context, obj.obj); } +template +datastream& operator<<(datastream& ds, const history_context_wrapper_stateless>& obj) { + return history_context_serialize_container(ds, obj.context, obj.obj); +} + template -datastream& operator<<(datastream& ds, const history_serial_wrapper>& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless>& obj) { fc::raw::pack(ds, obj.obj.first); fc::raw::pack(ds, obj.obj.second); return ds; } template -datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, + const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.name.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.creation_date)); @@ -136,8 +195,8 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper -datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, + const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.name.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.is_privileged())); @@ -153,7 +212,8 @@ datastream& operator<<(datastream& } template -datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, + const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.vm_type)); fc::raw::pack(ds, as_type(obj.obj.vm_version)); @@ -163,7 +223,8 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper -datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, + const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.code.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.scope.to_uint64_t())); @@ -173,9 +234,8 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper -datastream& -operator<<(datastream& ds, - const history_context_wrapper& obj) { +datastream& operator<<(datastream& ds, + const history_context_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.context.code.to_uint64_t())); fc::raw::pack(ds, as_type(obj.context.scope.to_uint64_t())); @@ -231,36 +291,36 @@ datastream& serialize_secondary_index(datastream& ds, const eosio::chain template datastream& -operator<<(datastream& ds, - const history_context_wrapper& obj) { +operator<<(datastream& ds, + const history_context_wrapper_stateless& obj) { return serialize_secondary_index(ds, obj.context, obj.obj); } template datastream& -operator<<(datastream& ds, - const history_context_wrapper& obj) { +operator<<(datastream& ds, + const history_context_wrapper_stateless& obj) { return serialize_secondary_index(ds, obj.context, obj.obj); } template datastream& -operator<<(datastream& ds, - const history_context_wrapper& obj) { +operator<<(datastream& ds, + const history_context_wrapper_stateless& obj) { return serialize_secondary_index(ds, obj.context, obj.obj); } template datastream& -operator<<(datastream& ds, - const history_context_wrapper& obj) { +operator<<(datastream& ds, + const history_context_wrapper_stateless& obj) { return serialize_secondary_index(ds, obj.context, obj.obj); } template datastream& -operator<<(datastream& ds, - const history_context_wrapper& obj) { +operator<<(datastream& ds, + const history_context_wrapper_stateless& obj) { return serialize_secondary_index(ds, obj.context, obj.obj); } @@ -290,7 +350,7 @@ datastream& operator<<(datastream& } template -datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(1)); fc::raw::pack(ds, as_type(obj.obj.max_block_net_usage)); fc::raw::pack(ds, as_type(obj.obj.target_block_net_usage_pct)); @@ -314,7 +374,7 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper -datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.max_mutable_global_bytes)); fc::raw::pack(ds, as_type(obj.obj.max_table_elements)); @@ -337,16 +397,16 @@ datastream& operator<<(datastream& fc::raw::pack(ds, as_type>(obj.obj.proposed_schedule_block_num)); fc::raw::pack(ds, make_history_serial_wrapper( obj.db, as_type(obj.obj.proposed_schedule))); - fc::raw::pack(ds, make_history_serial_wrapper(obj.db, as_type(obj.obj.configuration))); + fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.configuration))); fc::raw::pack(ds, as_type(obj.obj.chain_id)); fc::raw::pack(ds, - make_history_serial_wrapper(obj.db, as_type(obj.obj.wasm_configuration))); + make_history_serial_wrapper(as_type(obj.obj.wasm_configuration))); return ds; } template datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { + const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.sender.to_uint64_t())); fc::raw::pack(ds, as_type<__uint128_t>(obj.obj.sender_id)); @@ -359,7 +419,7 @@ datastream& operator<<(datastream& template datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { + const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.feature_digest)); fc::raw::pack(ds, as_type(obj.obj.activation_block_num)); @@ -374,14 +434,14 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper -datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, as_type(obj.obj.key)); fc::raw::pack(ds, as_type(obj.obj.weight)); return ds; } template -datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, as_type(obj.obj.actor.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.permission.to_uint64_t())); return ds; @@ -389,14 +449,14 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { - fc::raw::pack(ds, make_history_serial_wrapper(obj.db, as_type(obj.obj.permission))); + const history_serial_wrapper_stateless& obj) { + fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.permission))); fc::raw::pack(ds, as_type(obj.obj.weight)); return ds; } template -datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, as_type(obj.obj.wait_sec)); fc::raw::pack(ds, as_type(obj.obj.weight)); return ds; @@ -438,7 +498,7 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { + const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.account.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.code.to_uint64_t())); @@ -449,7 +509,7 @@ datastream& operator<<(datastream& template datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { + const history_serial_wrapper_stateless& obj) { EOS_ASSERT(!obj.obj.pending, eosio::chain::plugin_exception, "accepted_block sent while resource_limits_object in pending state"); fc::raw::pack(ds, fc::unsigned_int(0)); @@ -462,7 +522,7 @@ datastream& operator<<(datastream& template datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { + const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.last_ordinal)); fc::raw::pack(ds, as_type(obj.obj.value_ex)); @@ -476,9 +536,9 @@ datastream& operator<<(datastream& fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.owner.to_uint64_t())); fc::raw::pack(ds, make_history_serial_wrapper( - obj.db, as_type(obj.obj.net_usage))); + as_type(obj.obj.net_usage))); fc::raw::pack(ds, make_history_serial_wrapper( - obj.db, as_type(obj.obj.cpu_usage))); + as_type(obj.obj.cpu_usage))); fc::raw::pack(ds, as_type(obj.obj.ram_usage)); return ds; } @@ -488,9 +548,9 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); - fc::raw::pack(ds, make_history_serial_wrapper(obj.db, as_type( + fc::raw::pack(ds, make_history_serial_wrapper(as_type( obj.obj.average_block_net_usage))); - fc::raw::pack(ds, make_history_serial_wrapper(obj.db, as_type( + fc::raw::pack(ds, make_history_serial_wrapper(as_type( obj.obj.average_block_cpu_usage))); fc::raw::pack(ds, as_type(obj.obj.total_net_weight)); fc::raw::pack(ds, as_type(obj.obj.total_cpu_weight)); @@ -502,7 +562,7 @@ operator<<(datastream& template datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { + const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.numerator)); fc::raw::pack(ds, as_type(obj.obj.denominator)); @@ -518,9 +578,9 @@ datastream& operator<<(datastream& fc::raw::pack(ds, as_type(obj.obj.periods)); fc::raw::pack(ds, as_type(obj.obj.max_multiplier)); fc::raw::pack( - ds, make_history_serial_wrapper(obj.db, as_type(obj.obj.contract_rate))); + ds, make_history_serial_wrapper(as_type(obj.obj.contract_rate))); fc::raw::pack( - ds, make_history_serial_wrapper(obj.db, as_type(obj.obj.expand_rate))); + ds, make_history_serial_wrapper(as_type(obj.obj.expand_rate))); return ds; } @@ -541,29 +601,29 @@ operator<<(datastream& }; template -datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, as_type(obj.obj.account.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.name.to_uint64_t())); - history_serialize_container(ds, obj.db, as_type>(obj.obj.authorization)); + history_serialize_container(ds, as_type>(obj.obj.authorization)); fc::raw::pack(ds, as_type(obj.obj.data)); return ds; } template -datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.receiver.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.act_digest)); fc::raw::pack(ds, as_type(obj.obj.global_sequence)); fc::raw::pack(ds, as_type(obj.obj.recv_sequence)); - history_serialize_container(ds, obj.db, as_type>(obj.obj.auth_sequence)); + history_serialize_container(ds, as_type>(obj.obj.auth_sequence)); fc::raw::pack(ds, as_type(obj.obj.code_sequence)); fc::raw::pack(ds, as_type(obj.obj.abi_sequence)); return ds; } template -datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, as_type(obj.obj.account.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.delta)); return ds; @@ -587,24 +647,24 @@ inline std::optional cap_error_code(const std::optional& err } template -datastream& operator<<(datastream& ds, const history_context_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_context_wrapper_stateless& obj) { bool debug_mode = obj.context; fc::raw::pack(ds, fc::unsigned_int(1)); fc::raw::pack(ds, as_type(obj.obj.action_ordinal)); fc::raw::pack(ds, as_type(obj.obj.creator_action_ordinal)); fc::raw::pack(ds, bool(obj.obj.receipt)); if (obj.obj.receipt) { - fc::raw::pack(ds, make_history_serial_wrapper(obj.db, as_type(*obj.obj.receipt))); + fc::raw::pack(ds, make_history_serial_wrapper(as_type(*obj.obj.receipt))); } fc::raw::pack(ds, as_type(obj.obj.receiver.to_uint64_t())); - fc::raw::pack(ds, make_history_serial_wrapper(obj.db, as_type(obj.obj.act))); + fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.act))); fc::raw::pack(ds, as_type(obj.obj.context_free)); fc::raw::pack(ds, as_type(debug_mode ? obj.obj.elapsed.count() : 0)); if (debug_mode) fc::raw::pack(ds, as_type(obj.obj.console)); else fc::raw::pack(ds, std::string{}); - history_serialize_container(ds, obj.db, as_type>(obj.obj.account_ram_deltas)); + history_serialize_container(ds, as_type>(obj.obj.account_ram_deltas)); std::optional e; if (obj.obj.except) { @@ -624,7 +684,7 @@ datastream& operator<<(datastream& ds, const history_context_wrapper datastream& operator<<( datastream& ds, - const history_context_wrapper, eosio::state_history::augmented_transaction_trace>& obj) { + const history_context_wrapper_stateless, eosio::state_history::augmented_transaction_trace>& obj) { auto& trace = *obj.obj.trace; bool debug_mode = obj.context.second; fc::raw::pack(ds, fc::unsigned_int(0)); @@ -644,13 +704,13 @@ datastream& operator<<( fc::raw::pack(ds, as_type(debug_mode ? trace.elapsed.count() : 0)); fc::raw::pack(ds, as_type(trace.net_usage)); fc::raw::pack(ds, as_type(trace.scheduled)); - history_context_serialize_container(ds, obj.db, debug_mode, + history_context_serialize_container(ds, debug_mode, as_type>(trace.action_traces)); fc::raw::pack(ds, bool(trace.account_ram_delta)); if (trace.account_ram_delta) { fc::raw::pack( - ds, make_history_serial_wrapper(obj.db, as_type(*trace.account_ram_delta))); + ds, make_history_serial_wrapper(as_type(*trace.account_ram_delta))); } std::optional e; @@ -671,7 +731,7 @@ datastream& operator<<( std::pair context = std::make_pair(stat, debug_mode); fc::raw::pack( // ds, make_history_context_wrapper( - obj.db, context, + context, eosio::state_history::augmented_transaction_trace{trace.failed_dtrx_trace, obj.obj.partial})); } @@ -697,9 +757,9 @@ datastream& operator<<( template datastream& operator<<(datastream& ds, - const history_context_wrapper& obj) { + const history_context_wrapper_stateless& obj) { std::pair context = std::make_pair(eosio::chain::transaction_receipt_header::hard_fail, obj.context); - ds << make_history_context_wrapper(obj.db, context, obj.obj); + ds << make_history_context_wrapper(context, obj.obj); return ds; } diff --git a/libraries/state_history/include/eosio/state_history/trace_converter.hpp b/libraries/state_history/include/eosio/state_history/trace_converter.hpp index 8a7b9ca209..b25aefedf9 100644 --- a/libraries/state_history/include/eosio/state_history/trace_converter.hpp +++ b/libraries/state_history/include/eosio/state_history/trace_converter.hpp @@ -15,7 +15,7 @@ struct trace_converter { std::optional onblock_trace; void add_transaction(const transaction_trace_ptr& trace, const chain::packed_transaction_ptr& transaction); - void pack(boost::iostreams::filtering_ostreambuf& ds, const chainbase::database& db, bool trace_debug_mode, const block_state_ptr& block_state); + void pack(boost::iostreams::filtering_ostreambuf& ds, bool trace_debug_mode, const block_state_ptr& block_state); }; } // namespace state_history diff --git a/libraries/state_history/trace_converter.cpp b/libraries/state_history/trace_converter.cpp index 7999cf46d0..48a8733895 100644 --- a/libraries/state_history/trace_converter.cpp +++ b/libraries/state_history/trace_converter.cpp @@ -15,7 +15,7 @@ void trace_converter::add_transaction(const transaction_trace_ptr& trace, const } } -void trace_converter::pack(boost::iostreams::filtering_ostreambuf& obuf, const chainbase::database& db, bool trace_debug_mode, const block_state_ptr& block_state) { +void trace_converter::pack(boost::iostreams::filtering_ostreambuf& obuf, bool trace_debug_mode, const block_state_ptr& block_state) { std::vector traces; if (onblock_trace) traces.push_back(*onblock_trace); @@ -34,7 +34,7 @@ void trace_converter::pack(boost::iostreams::filtering_ostreambuf& obuf, const c onblock_trace.reset(); fc::datastream ds{obuf}; - return fc::raw::pack(ds, make_history_context_wrapper(db, trace_debug_mode, traces)); + return fc::raw::pack(ds, make_history_context_wrapper(trace_debug_mode, traces)); } } // namespace state_history diff --git a/plugins/state_history_plugin/state_history_plugin.cpp b/plugins/state_history_plugin/state_history_plugin.cpp index 67d2f41492..763514e9ba 100644 --- a/plugins/state_history_plugin/state_history_plugin.cpp +++ b/plugins/state_history_plugin/state_history_plugin.cpp @@ -250,7 +250,7 @@ struct state_history_plugin_impl : std::enable_shared_from_thisid, .payload_size = 0}; trace_log->pack_and_write_entry(header, block_state->block->previous, [this, &block_state](auto&& buf) { - trace_converter.pack(buf, chain_plug->chain().db(), trace_debug_mode, block_state); + trace_converter.pack(buf, trace_debug_mode, block_state); }); } diff --git a/unittests/state_history_tests.cpp b/unittests/state_history_tests.cpp index 59ba60f711..d395ace769 100644 --- a/unittests/state_history_tests.cpp +++ b/unittests/state_history_tests.cpp @@ -624,8 +624,8 @@ struct state_history_tester : state_history_tester_logs, tester { .block_id = block_state->id, .payload_size = 0}; - traces_log.pack_and_write_entry(header, block_state->block->previous, [this, &control, &block_state](auto&& buf) { - trace_converter.pack(buf, control.db(), false, block_state); + traces_log.pack_and_write_entry(header, block_state->block->previous, [this, &block_state](auto&& buf) { + trace_converter.pack(buf, false, block_state); }); chain_state_log.pack_and_write_entry(header, block_state->header.previous, [&control](auto&& buf) { From 9cc01d8a9c2171816bbeb5dfb5aeef8ed40493c1 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Fri, 28 Jul 2023 12:34:14 -0500 Subject: [PATCH 3/8] GH-1403 Only disable-replay-opts if chain-state-history is enabled as not actually needed for trace data. --- plugins/state_history_plugin/state_history_plugin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/state_history_plugin/state_history_plugin.cpp b/plugins/state_history_plugin/state_history_plugin.cpp index 763514e9ba..9535661d92 100644 --- a/plugins/state_history_plugin/state_history_plugin.cpp +++ b/plugins/state_history_plugin/state_history_plugin.cpp @@ -318,8 +318,8 @@ void state_history_plugin_impl::plugin_initialize(const variables_map& options) EOS_ASSERT(chain_plug, chain::missing_chain_plugin_exception, ""); auto& chain = chain_plug->chain(); - if (!options.at("disable-replay-opts").as()) { - ilog("Setting disable-replay-opts=true required by state_history_plugin"); + if (!options.at("disable-replay-opts").as() && options.at("chain-state-history").as()) { + ilog("Setting disable-replay-opts=true required by state_history_plugin chain-state-history=true option"); chain.disable_replay_opts(); } From 461ea9cd3c8f9d336ad63b768f553801ed4b3b0d Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Fri, 28 Jul 2023 12:54:03 -0500 Subject: [PATCH 4/8] GH-1403 Remove disable-replay-opts from docs as no longer required. --- .../02_usage/01_nodeos-configuration.md | 3 +-- .../03_plugins/state_history_plugin/index.md | 17 ----------------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/docs/01_nodeos/02_usage/01_nodeos-configuration.md b/docs/01_nodeos/02_usage/01_nodeos-configuration.md index 1ab5db8933..4db966a433 100644 --- a/docs/01_nodeos/02_usage/01_nodeos-configuration.md +++ b/docs/01_nodeos/02_usage/01_nodeos-configuration.md @@ -29,7 +29,6 @@ nodeos \ --plugin eosio::http_plugin \ --plugin eosio::state_history_plugin \ --contracts-console \ - --disable-replay-opts \ --access-control-allow-origin='*' \ --http-validate-host=false \ --verbose-http-errors \ @@ -46,7 +45,7 @@ The above `nodeos` command starts a producing node by: * setting the blockchain data directory (`--data-dir`) * setting the `config.ini` directory (`--config-dir`) * loading plugins `producer_plugin`, `chain_plugin`, `http_plugin`, `state_history_plugin` (`--plugin`) -* passing `chain_plugin` options (`--contracts-console`, `--disable-replay-opts`) +* passing `chain_plugin` options (`--contracts-console`) * passing `http-plugin` options (`--access-control-allow-origin`, `--http-validate-host`, `--verbose-http-errors`) * passing `state_history` options (`--state-history-dir`, `--trace-history`, `--chain-state-history`) * redirecting both `stdout` and `stderr` to the `nodeos.log` file diff --git a/docs/01_nodeos/03_plugins/state_history_plugin/index.md b/docs/01_nodeos/03_plugins/state_history_plugin/index.md index 6538a5b79e..ea75cbf104 100644 --- a/docs/01_nodeos/03_plugins/state_history_plugin/index.md +++ b/docs/01_nodeos/03_plugins/state_history_plugin/index.md @@ -51,23 +51,6 @@ Config Options for eosio::state_history_plugin: number of most recent blocks ``` -## Examples - -## Dependencies - -* [`chain_plugin`](../chain_plugin/index.md) - -### Load Dependency Examples - -```console -# config.ini -plugin = eosio::chain_plugin --disable-replay-opts -``` -```sh -# command-line -nodeos ... --plugin eosio::chain_plugin --disable-replay-opts -``` - ## How-To Guides * [How to fast start without history on existing chains](10_how-to-fast-start-without-old-history.md) From cc3e8680a69e0440442fe2191d8f5f3e2139ac4e Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Fri, 28 Jul 2023 12:54:33 -0500 Subject: [PATCH 5/8] GH-1403 Remove disable-replay-opts from tests as no longer required. --- plugins/state_history_plugin/tests/plugin_config_test.cpp | 4 ++-- tests/nodeos_forked_chain_test.py | 2 +- tests/resource_monitor_plugin_test.py | 4 ++-- tests/ship_streamer_test.py | 2 +- tests/ship_test.py | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/state_history_plugin/tests/plugin_config_test.cpp b/plugins/state_history_plugin/tests/plugin_config_test.cpp index 48bf085757..7222965cdc 100644 --- a/plugins/state_history_plugin/tests/plugin_config_test.cpp +++ b/plugins/state_history_plugin/tests/plugin_config_test.cpp @@ -11,7 +11,7 @@ BOOST_AUTO_TEST_CASE(state_history_plugin_default_tests) { auto tmp_path = tmp.path().string(); std::array args = {"test_state_history", "--trace-history", "--state-history-stride", "10", - "--disable-replay-opts", "--data-dir", tmp_path.c_str()}; + "--data-dir", tmp_path.c_str()}; BOOST_CHECK(app->initialize(args.size(), const_cast(args.data()))); auto& plugin = app->get_plugin(); @@ -28,7 +28,7 @@ BOOST_AUTO_TEST_CASE(state_history_plugin_retain_blocks_tests) { auto tmp_path = tmp.path().string(); std::array args = {"test_state_history", "--trace-history", "--state-history-log-retain-blocks", "4242", - "--disable-replay-opts", "--data-dir", tmp_path.c_str()}; + "--data-dir", tmp_path.c_str()}; BOOST_CHECK(app->initialize(args.size(), const_cast(args.data()))); auto& plugin = app->get_plugin(); diff --git a/tests/nodeos_forked_chain_test.py b/tests/nodeos_forked_chain_test.py index b998d15a59..d70a0387c4 100755 --- a/tests/nodeos_forked_chain_test.py +++ b/tests/nodeos_forked_chain_test.py @@ -154,7 +154,7 @@ def getMinHeadAndLib(prodNodes): Print("Stand up cluster") specificExtraNodeosArgs={} shipNodeNum = 0 - specificExtraNodeosArgs[shipNodeNum]="--plugin eosio::state_history_plugin --disable-replay-opts" + specificExtraNodeosArgs[shipNodeNum]="--plugin eosio::state_history_plugin" # producer nodes will be mapped to 0 through totalProducerNodes-1, so the number totalProducerNodes will be the non-producing node specificExtraNodeosArgs[totalProducerNodes]="--plugin eosio::test_control_api_plugin" diff --git a/tests/resource_monitor_plugin_test.py b/tests/resource_monitor_plugin_test.py index b946247a08..5b53793620 100755 --- a/tests/resource_monitor_plugin_test.py +++ b/tests/resource_monitor_plugin_test.py @@ -175,9 +175,9 @@ def testAll(): testCommon("Resmon not enabled: no arguments", "", ["interval set to 2", "threshold set to 90", "Shutdown flag when threshold exceeded set to true", "Creating and starting monitor thread", "snapshots's file system to be monitored", "blocks's file system to be monitored", "state's file system to be monitored"]) # default arguments with registered directories - testCommon("Resmon not enabled: Producer, Chain, State History and Trace Api", "--plugin eosio::state_history_plugin --state-history-dir=/tmp/state-history --disable-replay-opts --plugin eosio::trace_api_plugin --trace-dir=/tmp/trace --trace-no-abis", ["interval set to 2", "threshold set to 90", "Shutdown flag when threshold exceeded set to true", "snapshots's file system to be monitored", "blocks's file system to be monitored", "state's file system to be monitored", "state-history's file system to be monitored", "trace's file system to be monitored", "Creating and starting monitor thread"]) + testCommon("Resmon not enabled: Producer, Chain, State History and Trace Api", "--plugin eosio::state_history_plugin --state-history-dir=/tmp/state-history --plugin eosio::trace_api_plugin --trace-dir=/tmp/trace --trace-no-abis", ["interval set to 2", "threshold set to 90", "Shutdown flag when threshold exceeded set to true", "snapshots's file system to be monitored", "blocks's file system to be monitored", "state's file system to be monitored", "state-history's file system to be monitored", "trace's file system to be monitored", "Creating and starting monitor thread"]) - testCommon("Resmon enabled: Producer, Chain, State History and Trace Api", "--plugin eosio::resource_monitor_plugin --plugin eosio::state_history_plugin --state-history-dir=/tmp/state-history --disable-replay-opts --plugin eosio::trace_api_plugin --trace-dir=/tmp/trace --trace-no-abis --resource-monitor-space-threshold=80 --resource-monitor-interval-seconds=3", ["snapshots's file system to be monitored", "blocks's file system to be monitored", "state's file system to be monitored", "state-history's file system to be monitored", "trace's file system to be monitored", "Creating and starting monitor thread", "threshold set to 80", "interval set to 3", "Shutdown flag when threshold exceeded set to true"]) + testCommon("Resmon enabled: Producer, Chain, State History and Trace Api", "--plugin eosio::resource_monitor_plugin --plugin eosio::state_history_plugin --state-history-dir=/tmp/state-history --plugin eosio::trace_api_plugin --trace-dir=/tmp/trace --trace-no-abis --resource-monitor-space-threshold=80 --resource-monitor-interval-seconds=3", ["snapshots's file system to be monitored", "blocks's file system to be monitored", "state's file system to be monitored", "state-history's file system to be monitored", "trace's file system to be monitored", "Creating and starting monitor thread", "threshold set to 80", "interval set to 3", "Shutdown flag when threshold exceeded set to true"]) # Only test minimum warning threshold (i.e. 6) to trigger warning as much as possible testInterval("Resmon enabled: set warning interval", diff --git a/tests/ship_streamer_test.py b/tests/ship_streamer_test.py index 580a010966..e5710c5e36 100755 --- a/tests/ship_streamer_test.py +++ b/tests/ship_streamer_test.py @@ -70,7 +70,7 @@ def getLatestSnapshot(nodeId): shipNodeNum = 1 specificExtraNodeosArgs={} - specificExtraNodeosArgs[shipNodeNum]="--plugin eosio::state_history_plugin --disable-replay-opts --trace-history --chain-state-history --plugin eosio::net_api_plugin --plugin eosio::producer_api_plugin " + specificExtraNodeosArgs[shipNodeNum]="--plugin eosio::state_history_plugin --trace-history --chain-state-history --plugin eosio::net_api_plugin --plugin eosio::producer_api_plugin " # producer nodes will be mapped to 0 through totalProducerNodes-1, so the number totalProducerNodes will be the non-producing node specificExtraNodeosArgs[totalProducerNodes]="--plugin eosio::test_control_api_plugin " diff --git a/tests/ship_test.py b/tests/ship_test.py index c8d3fbee9a..08ead9be2c 100755 --- a/tests/ship_test.py +++ b/tests/ship_test.py @@ -57,7 +57,7 @@ specificExtraNodeosArgs={} # non-producing nodes are at the end of the cluster's nodes, so reserving the last one for state_history_plugin shipNodeNum = totalNodes - 1 - specificExtraNodeosArgs[shipNodeNum]="--plugin eosio::state_history_plugin --disable-replay-opts --sync-fetch-span 200 --plugin eosio::net_api_plugin " + specificExtraNodeosArgs[shipNodeNum]="--plugin eosio::state_history_plugin --sync-fetch-span 200 --plugin eosio::net_api_plugin " if args.unix_socket: specificExtraNodeosArgs[shipNodeNum] += "--state-history-unix-socket-path ship.sock" From 4857c06e710c74267d872e0d25604c8731f21738 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Sat, 29 Jul 2023 09:11:39 -0500 Subject: [PATCH 6/8] GH-1403 Normalize indentation --- .../eosio/state_history/serialization.hpp | 155 ++++++------------ 1 file changed, 48 insertions(+), 107 deletions(-) diff --git a/libraries/state_history/include/eosio/state_history/serialization.hpp b/libraries/state_history/include/eosio/state_history/serialization.hpp index e5d3ca7f66..fcceb7083d 100644 --- a/libraries/state_history/include/eosio/state_history/serialization.hpp +++ b/libraries/state_history/include/eosio/state_history/serialization.hpp @@ -28,7 +28,7 @@ struct history_serial_wrapper_stateless { : obj(w.obj) {} explicit history_serial_wrapper_stateless(const T& t) : obj(t) {} - const T& obj; + const T& obj; }; template @@ -54,8 +54,8 @@ struct history_context_wrapper_stateless { : context(w.context), obj(w.obj) {} history_context_wrapper_stateless(const P& c, const T& t) : context(c), obj(t) {} - const P& context; - const T& obj; + const P& context; + const T& obj; }; template @@ -94,8 +94,7 @@ datastream& history_serialize_container(datastream& ds, const T& v) { } template -datastream& history_serialize_container(datastream& ds, - const std::vector>& v) { +datastream& history_serialize_container(datastream& ds, const std::vector>& v) { fc::raw::pack(ds, unsigned_int(v.size())); for (auto& x : v) { EOS_ASSERT(!!x, eosio::chain::plugin_exception, "null inside container"); @@ -105,8 +104,7 @@ datastream& history_serialize_container(datastream& ds, } template -datastream& history_context_serialize_container(datastream& ds, const chainbase::database& db, const P& context, - const std::vector& v) { +datastream& history_context_serialize_container(datastream& ds, const chainbase::database& db, const P& context, const std::vector& v) { fc::raw::pack(ds, unsigned_int(v.size())); for (const auto& x : v) { ds << make_history_context_wrapper(db, context, x); @@ -115,8 +113,7 @@ datastream& history_context_serialize_container(datastream& ds, const ch } template -datastream& history_context_serialize_container(datastream& ds, const P& context, - const std::vector& v) { +datastream& history_context_serialize_container(datastream& ds, const P& context, const std::vector& v) { fc::raw::pack(ds, unsigned_int(v.size())); for (const auto& x : v) { ds << make_history_context_wrapper(context, x); @@ -185,8 +182,7 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper_stat } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.name.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.creation_date)); @@ -195,8 +191,7 @@ datastream& operator<<(datastream& ds, } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.name.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.is_privileged())); @@ -212,8 +207,7 @@ datastream& operator<<(datastream& ds, } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.vm_type)); fc::raw::pack(ds, as_type(obj.obj.vm_version)); @@ -223,8 +217,7 @@ datastream& operator<<(datastream& ds, } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.code.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.scope.to_uint64_t())); @@ -234,8 +227,7 @@ datastream& operator<<(datastream& ds, } template -datastream& operator<<(datastream& ds, - const history_context_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_context_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.context.code.to_uint64_t())); fc::raw::pack(ds, as_type(obj.context.scope.to_uint64_t())); @@ -277,8 +269,7 @@ void serialize_secondary_index_data(datastream& ds, const eosio::chain::key2 } template -datastream& serialize_secondary_index(datastream& ds, const eosio::chain::table_id_object& context, - const T& obj) { +datastream& serialize_secondary_index(datastream& ds, const eosio::chain::table_id_object& context, const T& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(context.code.to_uint64_t())); fc::raw::pack(ds, as_type(context.scope.to_uint64_t())); @@ -290,46 +281,34 @@ datastream& serialize_secondary_index(datastream& ds, const eosio::chain } template -datastream& -operator<<(datastream& ds, - const history_context_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_context_wrapper_stateless& obj) { return serialize_secondary_index(ds, obj.context, obj.obj); } template -datastream& -operator<<(datastream& ds, - const history_context_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_context_wrapper_stateless& obj) { return serialize_secondary_index(ds, obj.context, obj.obj); } template -datastream& -operator<<(datastream& ds, - const history_context_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_context_wrapper_stateless& obj) { return serialize_secondary_index(ds, obj.context, obj.obj); } template -datastream& -operator<<(datastream& ds, - const history_context_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_context_wrapper_stateless& obj) { return serialize_secondary_index(ds, obj.context, obj.obj); } template -datastream& -operator<<(datastream& ds, - const history_context_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_context_wrapper_stateless& obj) { return serialize_secondary_index(ds, obj.context, obj.obj); } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { fc::raw::pack(ds, as_type(obj.obj.threshold)); - history_serialize_container(ds, obj.db, - as_type>(obj.obj.keys)); + history_serialize_container(ds, obj.db, as_type>(obj.obj.keys)); } template @@ -344,8 +323,7 @@ template datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { fc::raw::pack(ds, as_type(obj.obj.version)); - history_serialize_container( - ds, obj.db, as_type>(obj.obj.producers)); + history_serialize_container(ds, obj.db, as_type>(obj.obj.producers)); return ds; } @@ -391,22 +369,18 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper_stat } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { fc::raw::pack(ds, fc::unsigned_int(1)); fc::raw::pack(ds, as_type>(obj.obj.proposed_schedule_block_num)); - fc::raw::pack(ds, make_history_serial_wrapper( - obj.db, as_type(obj.obj.proposed_schedule))); + fc::raw::pack(ds, make_history_serial_wrapper(obj.db, as_type(obj.obj.proposed_schedule))); fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.configuration))); fc::raw::pack(ds, as_type(obj.obj.chain_id)); - fc::raw::pack(ds, - make_history_serial_wrapper(as_type(obj.obj.wasm_configuration))); + fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.wasm_configuration))); return ds; } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.sender.to_uint64_t())); fc::raw::pack(ds, as_type<__uint128_t>(obj.obj.sender_id)); @@ -417,9 +391,7 @@ datastream& operator<<(datastream& } template -datastream& -operator<<(datastream& ds, - const history_serial_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.feature_digest)); fc::raw::pack(ds, as_type(obj.obj.activation_block_num)); @@ -448,8 +420,7 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper_stat } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.permission))); fc::raw::pack(ds, as_type(obj.obj.weight)); return ds; @@ -497,8 +468,7 @@ datastream& operator<<(datastream& ds, const history_serial_wrapper -datastream& operator<<(datastream& ds, - const history_serial_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.account.to_uint64_t())); fc::raw::pack(ds, as_type(obj.obj.code.to_uint64_t())); @@ -508,8 +478,7 @@ datastream& operator<<(datastream& } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { EOS_ASSERT(!obj.obj.pending, eosio::chain::plugin_exception, "accepted_block sent while resource_limits_object in pending state"); fc::raw::pack(ds, fc::unsigned_int(0)); @@ -521,8 +490,7 @@ datastream& operator<<(datastream& } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.last_ordinal)); fc::raw::pack(ds, as_type(obj.obj.value_ex)); @@ -531,27 +499,20 @@ datastream& operator<<(datastream& } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.owner.to_uint64_t())); - fc::raw::pack(ds, make_history_serial_wrapper( - as_type(obj.obj.net_usage))); - fc::raw::pack(ds, make_history_serial_wrapper( - as_type(obj.obj.cpu_usage))); + fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.net_usage))); + fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.cpu_usage))); fc::raw::pack(ds, as_type(obj.obj.ram_usage)); return ds; } template -datastream& -operator<<(datastream& ds, - const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); - fc::raw::pack(ds, make_history_serial_wrapper(as_type( - obj.obj.average_block_net_usage))); - fc::raw::pack(ds, make_history_serial_wrapper(as_type( - obj.obj.average_block_cpu_usage))); + fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.average_block_net_usage))); + fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.average_block_cpu_usage))); fc::raw::pack(ds, as_type(obj.obj.total_net_weight)); fc::raw::pack(ds, as_type(obj.obj.total_cpu_weight)); fc::raw::pack(ds, as_type(obj.obj.total_ram_bytes)); @@ -561,8 +522,7 @@ operator<<(datastream& } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper_stateless& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.numerator)); fc::raw::pack(ds, as_type(obj.obj.denominator)); @@ -570,31 +530,23 @@ datastream& operator<<(datastream& } template -datastream& operator<<(datastream& ds, - const history_serial_wrapper& obj) { +datastream& operator<<(datastream& ds, const history_serial_wrapper& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); fc::raw::pack(ds, as_type(obj.obj.target)); fc::raw::pack(ds, as_type(obj.obj.max)); fc::raw::pack(ds, as_type(obj.obj.periods)); fc::raw::pack(ds, as_type(obj.obj.max_multiplier)); - fc::raw::pack( - ds, make_history_serial_wrapper(as_type(obj.obj.contract_rate))); - fc::raw::pack( - ds, make_history_serial_wrapper(as_type(obj.obj.expand_rate))); + fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.contract_rate))); + fc::raw::pack(ds, make_history_serial_wrapper(as_type(obj.obj.expand_rate))); return ds; } template datastream& -operator<<(datastream& ds, - const history_serial_wrapper& obj) { +operator<<(datastream& ds, const history_serial_wrapper& obj) { fc::raw::pack(ds, fc::unsigned_int(0)); - fc::raw::pack( - ds, make_history_serial_wrapper( - obj.db, as_type(obj.obj.cpu_limit_parameters))); - fc::raw::pack( - ds, make_history_serial_wrapper( - obj.db, as_type(obj.obj.net_limit_parameters))); + fc::raw::pack(ds, make_history_serial_wrapper(obj.db, as_type(obj.obj.cpu_limit_parameters))); + fc::raw::pack(ds, make_history_serial_wrapper(obj.db, as_type(obj.obj.net_limit_parameters))); fc::raw::pack(ds, as_type(obj.obj.account_cpu_usage_average_window)); fc::raw::pack(ds, as_type(obj.obj.account_net_usage_average_window)); return ds; @@ -674,17 +626,14 @@ datastream& operator<<(datastream& ds, const history_context_wrapper_sta e = "Y"; } fc::raw::pack(ds, as_type>(e)); - fc::raw::pack(ds, - as_type>(debug_mode ? obj.obj.error_code : cap_error_code(obj.obj.error_code))); + fc::raw::pack(ds, as_type>(debug_mode ? obj.obj.error_code : cap_error_code(obj.obj.error_code))); fc::raw::pack(ds, as_type(obj.obj.return_value)); return ds; } template -datastream& operator<<( - datastream& ds, - const history_context_wrapper_stateless, eosio::state_history::augmented_transaction_trace>& obj) { +datastream& operator<<(datastream& ds, const history_context_wrapper_stateless, eosio::state_history::augmented_transaction_trace>& obj) { auto& trace = *obj.obj.trace; bool debug_mode = obj.context.second; fc::raw::pack(ds, fc::unsigned_int(0)); @@ -704,13 +653,11 @@ datastream& operator<<( fc::raw::pack(ds, as_type(debug_mode ? trace.elapsed.count() : 0)); fc::raw::pack(ds, as_type(trace.net_usage)); fc::raw::pack(ds, as_type(trace.scheduled)); - history_context_serialize_container(ds, debug_mode, - as_type>(trace.action_traces)); + history_context_serialize_container(ds, debug_mode, as_type>(trace.action_traces)); fc::raw::pack(ds, bool(trace.account_ram_delta)); if (trace.account_ram_delta) { - fc::raw::pack( - ds, make_history_serial_wrapper(as_type(*trace.account_ram_delta))); + fc::raw::pack(ds, make_history_serial_wrapper(as_type(*trace.account_ram_delta))); } std::optional e; @@ -729,10 +676,7 @@ datastream& operator<<( if (trace.receipt && trace.receipt->status.value == eosio::chain::transaction_receipt_header::soft_fail) stat = eosio::chain::transaction_receipt_header::soft_fail; std::pair context = std::make_pair(stat, debug_mode); - fc::raw::pack( // - ds, make_history_context_wrapper( - context, - eosio::state_history::augmented_transaction_trace{trace.failed_dtrx_trace, obj.obj.partial})); + fc::raw::pack(ds, make_history_context_wrapper(context, eosio::state_history::augmented_transaction_trace{trace.failed_dtrx_trace, obj.obj.partial})); } bool include_partial = obj.obj.partial && !trace.failed_dtrx_trace; @@ -755,9 +699,7 @@ datastream& operator<<( } template -datastream& -operator<<(datastream& ds, - const history_context_wrapper_stateless& obj) { +datastream& operator<<(datastream& ds, const history_context_wrapper_stateless& obj) { std::pair context = std::make_pair(eosio::chain::transaction_receipt_header::hard_fail, obj.context); ds << make_history_context_wrapper(context, obj.obj); return ds; @@ -785,5 +727,4 @@ datastream& operator<<(datastream& ds, const eosio::state_history::get_b return ds; } - } // namespace fc From a72ed7df344c1a1df9fb5547433092d7e32e1a1e Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Mon, 31 Jul 2023 10:25:05 -0500 Subject: [PATCH 7/8] GH-1403 Rename disable_replay_opts() to set_disable_replay_opts(bool v) --- libraries/chain/controller.cpp | 4 ++-- libraries/chain/include/eosio/chain/controller.hpp | 2 +- plugins/state_history_plugin/state_history_plugin.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 18ce7079d8..3825d839d4 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -3050,8 +3050,8 @@ void controller::set_key_blacklist( const flat_set& new_key_bla my->conf.key_blacklist = new_key_blacklist; } -void controller::disable_replay_opts() { - my->conf.disable_replay_opts = true; +void controller::set_disable_replay_opts( bool v ) { + my->conf.disable_replay_opts = v; } uint32_t controller::head_block_num()const { diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index 0d1d15285b..e0d40bf21c 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -217,7 +217,7 @@ namespace eosio { namespace chain { void set_action_blacklist( const flat_set< pair >& ); void set_key_blacklist( const flat_set& ); - void disable_replay_opts(); + void set_disable_replay_opts( bool v ); uint32_t head_block_num()const; time_point head_block_time()const; diff --git a/plugins/state_history_plugin/state_history_plugin.cpp b/plugins/state_history_plugin/state_history_plugin.cpp index 9535661d92..f117996f14 100644 --- a/plugins/state_history_plugin/state_history_plugin.cpp +++ b/plugins/state_history_plugin/state_history_plugin.cpp @@ -320,7 +320,7 @@ void state_history_plugin_impl::plugin_initialize(const variables_map& options) if (!options.at("disable-replay-opts").as() && options.at("chain-state-history").as()) { ilog("Setting disable-replay-opts=true required by state_history_plugin chain-state-history=true option"); - chain.disable_replay_opts(); + chain.set_disable_replay_opts(true); } applied_transaction_connection.emplace(chain.applied_transaction.connect( From 38323386a961794bcdb89713546fb4bbdf53c5dd Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Mon, 31 Jul 2023 10:25:45 -0500 Subject: [PATCH 8/8] GH-1403 Use derivation instead of composition --- .../eosio/state_history/serialization.hpp | 45 +++++++------------ 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/libraries/state_history/include/eosio/state_history/serialization.hpp b/libraries/state_history/include/eosio/state_history/serialization.hpp index fcceb7083d..7c1298a311 100644 --- a/libraries/state_history/include/eosio/state_history/serialization.hpp +++ b/libraries/state_history/include/eosio/state_history/serialization.hpp @@ -16,53 +16,36 @@ #include -template -struct history_serial_wrapper { - const chainbase::database& db; - const T& obj; -}; - template struct history_serial_wrapper_stateless { - history_serial_wrapper_stateless(const history_serial_wrapper& w) - : obj(w.obj) {} - explicit history_serial_wrapper_stateless(const T& t) - : obj(t) {} const T& obj; }; template -history_serial_wrapper> make_history_serial_wrapper(const chainbase::database& db, const T& obj) { - return {db, obj}; -} +struct history_serial_wrapper : public history_serial_wrapper_stateless { + const chainbase::database& db; +}; template history_serial_wrapper_stateless> make_history_serial_wrapper(const T& obj) { - return history_serial_wrapper_stateless>{obj}; + return {obj}; } -template -struct history_context_wrapper { - const chainbase::database& db; - const P& context; - const T& obj; -}; +template +history_serial_wrapper> make_history_serial_wrapper(const chainbase::database& db, const T& obj) { + return {{obj}, db}; +} template struct history_context_wrapper_stateless { - history_context_wrapper_stateless(const history_context_wrapper& w) - : context(w.context), obj(w.obj) {} - history_context_wrapper_stateless(const P& c, const T& t) - : context(c), obj(t) {} const P& context; const T& obj; }; template -history_context_wrapper, std::decay_t> -make_history_context_wrapper(const chainbase::database& db, const P& context, const T& obj) { - return {db, context, obj}; -} +struct history_context_wrapper : public history_context_wrapper_stateless { + const chainbase::database& db; +}; template history_context_wrapper_stateless, std::decay_t> @@ -70,6 +53,12 @@ make_history_context_wrapper(const P& context, const T& obj) { return {context, obj}; } +template +history_context_wrapper, std::decay_t> +make_history_context_wrapper(const chainbase::database& db, const P& context, const T& obj) { + return {{context, obj}, db}; +} + namespace fc { template