From d59dfb151b483a997baa928b0e32f30bb99a304a Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Wed, 13 Dec 2023 21:32:12 -0500 Subject: [PATCH 01/19] change accepted_block_header signal from block_state_legacy_ptr to std::tuple --- libraries/chain/controller.cpp | 6 +++--- libraries/chain/include/eosio/chain/controller.hpp | 2 +- .../include/eosio/chain/plugin_interface.hpp | 2 +- plugins/chain_plugin/chain_plugin.cpp | 4 ++-- plugins/net_plugin/net_plugin.cpp | 14 +++++++------- plugins/producer_plugin/producer_plugin.cpp | 13 +++++++++---- 6 files changed, 23 insertions(+), 18 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 960b949915..b6963aa7c6 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -1950,7 +1950,7 @@ struct controller_impl { if( s == controller::block_status::incomplete ) { fork_db.add( bsp ); fork_db.mark_valid( bsp ); - emit( self.accepted_block_header, bsp ); + emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header.producer) ); EOS_ASSERT( bsp == fork_db.head(), fork_database_exception, "committed block did not become the new head in fork database"); } else if (s != controller::block_status::irreversible) { fork_db.mark_valid( bsp ); @@ -2266,7 +2266,7 @@ struct controller_impl { trusted_producer_light_validation = true; }; - emit( self.accepted_block_header, bsp ); + emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header.producer) ); if( read_mode != db_read_mode::IRREVERSIBLE ) { maybe_switch_forks( br, fork_db.pending_head(), s, forked_branch_cb, trx_lookup ); @@ -2311,7 +2311,7 @@ struct controller_impl { fork_db.add( bsp, true ); } - emit( self.accepted_block_header, bsp ); + emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header.producer) ); controller::block_report br; if( s == controller::block_status::irreversible ) { diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index ca24e4da35..6d31cea2db 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -328,7 +328,7 @@ namespace eosio { namespace chain { signal block_start; // block_num signal pre_accepted_block; - signal accepted_block_header; + signal)> accepted_block_header; signal accepted_block; signal irreversible_block; signal accepted_transaction; diff --git a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp index 23205bc96a..c307d34527 100644 --- a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp +++ b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp @@ -16,7 +16,7 @@ namespace eosio::chain::plugin_interface { namespace channels { using pre_accepted_block = channel_decl; using rejected_block = channel_decl; - using accepted_block_header = channel_decl; + using accepted_block_header = channel_decl>; using accepted_block = channel_decl; using irreversible_block = channel_decl; using accepted_transaction = channel_decl; diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index f3ebc7d614..0860d2edfa 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -1033,8 +1033,8 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { }); accepted_block_header_connection = chain->accepted_block_header.connect( - [this]( const block_state_legacy_ptr& blk ) { - accepted_block_header_channel.publish( priority::medium, blk ); + [this]( std::tuple t ) { + accepted_block_header_channel.publish( priority::medium, t ); } ); accepted_block_connection = chain->accepted_block.connect( [this]( const block_state_legacy_ptr& blk ) { diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp index 991d095b7c..37e30ddf4b 100644 --- a/plugins/net_plugin/net_plugin.cpp +++ b/plugins/net_plugin/net_plugin.cpp @@ -528,7 +528,7 @@ namespace eosio { uint32_t get_chain_lib_num() const; uint32_t get_chain_head_num() const; - void on_accepted_block_header( const block_state_legacy_ptr& bs ); + void on_accepted_block_header( const signed_block_ptr& block, const block_id_type& id ); void on_accepted_block( const block_state_legacy_ptr& bs ); void transaction_ack(const std::pair&); @@ -3882,12 +3882,12 @@ namespace eosio { } // called from application thread - void net_plugin_impl::on_accepted_block_header(const block_state_legacy_ptr& bs) { + void net_plugin_impl::on_accepted_block_header(const signed_block_ptr& block, const block_id_type& id) { update_chain_info(); - dispatcher->strand.post([bs]() { - fc_dlog(logger, "signaled accepted_block_header, blk num = ${num}, id = ${id}", ("num", bs->block_num)("id", bs->id)); - my_impl->dispatcher->bcast_block(bs->block, bs->id); + dispatcher->strand.post([block, id]() { + fc_dlog(logger, "signaled accepted_block_header, blk num = ${num}, id = ${id}", ("num", block_header::num_from_id(id))("id", id)); + my_impl->dispatcher->bcast_block(block, id); }); } @@ -4284,8 +4284,8 @@ namespace eosio { { chain::controller& cc = chain_plug->chain(); - cc.accepted_block_header.connect( [my = shared_from_this()]( const block_state_legacy_ptr& s ) { - my->on_accepted_block_header( s ); + cc.accepted_block_header.connect( [my = shared_from_this()]( std::tuple t ) { + my->on_accepted_block_header( std::get<0>(t), std::get<1>(t) ); } ); cc.accepted_block.connect( [my = shared_from_this()]( const block_state_legacy_ptr& s ) { diff --git a/plugins/producer_plugin/producer_plugin.cpp b/plugins/producer_plugin/producer_plugin.cpp index 8ad75c7945..1b81e794c6 100644 --- a/plugins/producer_plugin/producer_plugin.cpp +++ b/plugins/producer_plugin/producer_plugin.cpp @@ -630,9 +630,9 @@ class producer_plugin_impl : public std::enable_shared_from_thisheader.producer)) - _producer_watermarks.consider_new_watermark(bsp->header.producer, bsp->block_num, bsp->block->timestamp); + void on_block_header(chain::account_name producer, uint32_t block_num, chain::block_timestamp_type timestamp) { + if (_producers.contains(producer)) + _producer_watermarks.consider_new_watermark(producer, block_num, timestamp); } void on_irreversible_block(const signed_block_ptr& lib) { @@ -1330,7 +1330,12 @@ void producer_plugin_impl::plugin_startup() { "node cannot have any producer-name configured because no block production is possible with no [api|p2p]-accepted-transactions"); _accepted_block_connection.emplace(chain.accepted_block.connect([this](const auto& bsp) { on_block(bsp); })); - _accepted_block_header_connection.emplace(chain.accepted_block_header.connect([this](const auto& bsp) { on_block_header(bsp); })); + _accepted_block_header_connection.emplace(chain.accepted_block_header.connect([this](std::tuple t) { + const auto& block = std::get<0>(t); + const auto& id = std::get<1>(t); + const auto& producer = std::get<2>(t); + on_block_header(producer, block_header::num_from_id(id), block->timestamp); + })); _irreversible_block_connection.emplace( chain.irreversible_block.connect([this](const auto& bsp) { on_irreversible_block(bsp->block); })); From 32448e2b3ea7c1ee27ee05391f87a4c7addb793a Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Wed, 13 Dec 2023 22:25:36 -0500 Subject: [PATCH 02/19] remove unused pre_accepted_block, bad_alloc, and accepted_transaction signals; remove previously commented signals --- libraries/chain/controller.cpp | 3 -- .../chain/include/eosio/chain/controller.hpp | 14 +-------- .../include/eosio/chain/plugin_interface.hpp | 2 -- plugins/chain_plugin/chain_plugin.cpp | 30 ++----------------- 4 files changed, 3 insertions(+), 46 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index b6963aa7c6..8d745c1a89 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -2258,8 +2258,6 @@ struct controller_impl { return; } - emit( self.pre_accepted_block, b ); - fork_db.add( bsp ); if (self.is_trusted_producer(b->producer)) { @@ -2293,7 +2291,6 @@ struct controller_impl { return; } - emit( self.pre_accepted_block, b ); const bool skip_validate_signee = !conf.force_all_checks; auto bsp = std::make_shared( diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index 6d31cea2db..5919373d33 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -326,24 +326,12 @@ namespace eosio { namespace chain { static std::optional convert_exception_to_error_code( const fc::exception& e ); - signal block_start; // block_num - signal pre_accepted_block; + signal block_start; signal)> accepted_block_header; signal accepted_block; signal irreversible_block; signal accepted_transaction; signal)> applied_transaction; - signal bad_alloc; - - /* - signal pre_apply_block; - signal post_apply_block; - signal abort_apply_block; - signal pre_apply_transaction; - signal post_apply_transaction; - signal pre_apply_action; - signal post_apply_action; - */ const apply_handler* find_apply_handler( account_name contract, scope_name scope, action_name act )const; wasm_interface& get_wasm_interface(); diff --git a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp index c307d34527..2e4375e967 100644 --- a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp +++ b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp @@ -14,12 +14,10 @@ namespace eosio::chain::plugin_interface { struct chain_plugin_interface; namespace channels { - using pre_accepted_block = channel_decl; using rejected_block = channel_decl; using accepted_block_header = channel_decl>; using accepted_block = channel_decl; using irreversible_block = channel_decl; - using accepted_transaction = channel_decl; using applied_transaction = channel_decl; } diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index 0860d2edfa..304d85b6a3 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -154,11 +154,9 @@ using boost::signals2::scoped_connection; class chain_plugin_impl { public: chain_plugin_impl() - :pre_accepted_block_channel(app().get_channel()) - ,accepted_block_header_channel(app().get_channel()) + :accepted_block_header_channel(app().get_channel()) ,accepted_block_channel(app().get_channel()) ,irreversible_block_channel(app().get_channel()) - ,accepted_transaction_channel(app().get_channel()) ,applied_transaction_channel(app().get_channel()) ,incoming_block_sync_method(app().get_method()) ,incoming_transaction_async_method(app().get_method()) @@ -181,11 +179,9 @@ class chain_plugin_impl { // retained references to channels for easy publication - channels::pre_accepted_block::channel_type& pre_accepted_block_channel; channels::accepted_block_header::channel_type& accepted_block_header_channel; channels::accepted_block::channel_type& accepted_block_channel; channels::irreversible_block::channel_type& irreversible_block_channel; - channels::accepted_transaction::channel_type& accepted_transaction_channel; channels::applied_transaction::channel_type& applied_transaction_channel; // retained references to methods for easy calling @@ -199,11 +195,9 @@ class chain_plugin_impl { methods::get_last_irreversible_block_number::method_type::handle get_last_irreversible_block_number_provider; // scoped connections for chain controller - std::optional pre_accepted_block_connection; std::optional accepted_block_header_connection; std::optional accepted_block_connection; std::optional irreversible_block_connection; - std::optional accepted_transaction_connection; std::optional applied_transaction_connection; std::optional block_start_connection; @@ -1019,19 +1013,6 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { } ); // relay signals to channels - pre_accepted_block_connection = chain->pre_accepted_block.connect([this](const signed_block_ptr& blk) { - auto itr = loaded_checkpoints.find( blk->block_num() ); - if( itr != loaded_checkpoints.end() ) { - auto id = blk->calculate_id(); - EOS_ASSERT( itr->second == id, checkpoint_exception, - "Checkpoint does not match for block number ${num}: expected: ${expected} actual: ${actual}", - ("num", blk->block_num())("expected", itr->second)("actual", id) - ); - } - - pre_accepted_block_channel.publish(priority::medium, blk); - }); - accepted_block_header_connection = chain->accepted_block_header.connect( [this]( std::tuple t ) { accepted_block_header_channel.publish( priority::medium, t ); @@ -1064,12 +1045,7 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { irreversible_block_channel.publish( priority::low, blk ); } ); - - accepted_transaction_connection = chain->accepted_transaction.connect( - [this]( const transaction_metadata_ptr& meta ) { - accepted_transaction_channel.publish( priority::low, meta ); - } ); - + applied_transaction_connection = chain->applied_transaction.connect( [this]( std::tuple t ) { if (_account_query_db) { @@ -1162,11 +1138,9 @@ void chain_plugin::plugin_startup() { } void chain_plugin_impl::plugin_shutdown() { - pre_accepted_block_connection.reset(); accepted_block_header_connection.reset(); accepted_block_connection.reset(); irreversible_block_connection.reset(); - accepted_transaction_connection.reset(); applied_transaction_connection.reset(); block_start_connection.reset(); chain.reset(); From 360f3ba90e215240574fd89b86c8925ebacaf881 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Sat, 16 Dec 2023 21:43:27 -0500 Subject: [PATCH 03/19] make accepted_blocks signal information only needed --- libraries/chain/controller.cpp | 2 +- .../chain/include/eosio/chain/controller.hpp | 2 +- .../eosio/chain/subjective_billing.hpp | 11 ++-- .../chain/unapplied_transaction_queue.hpp | 4 +- .../eosio/state_history/trace_converter.hpp | 3 +- libraries/state_history/trace_converter.cpp | 4 +- libraries/testing/tester.cpp | 7 +- .../include/eosio/chain/plugin_interface.hpp | 2 +- plugins/chain_plugin/account_query_db.cpp | 32 ++++----- plugins/chain_plugin/chain_plugin.cpp | 11 ++-- .../eosio/chain_plugin/account_query_db.hpp | 2 +- .../trx_finality_status_processing.hpp | 2 +- .../eosio/chain_plugin/trx_retry_db.hpp | 2 +- .../test/test_account_query_db.cpp | 26 ++++---- .../test_trx_finality_status_processing.cpp | 14 ++-- .../chain_plugin/test/test_trx_retry_db.cpp | 50 +++++++------- .../trx_finality_status_processing.cpp | 14 ++-- plugins/chain_plugin/trx_retry_db.cpp | 10 +-- plugins/net_plugin/net_plugin.cpp | 8 +-- plugins/producer_plugin/producer_plugin.cpp | 11 ++-- .../producer_plugin/test/test_trx_full.cpp | 15 +++-- .../eosio/state_history_plugin/session.hpp | 38 ++++++----- .../state_history_plugin.cpp | 43 ++++++------ .../tests/session_test.cpp | 2 +- .../test_control_plugin.cpp | 19 +++--- .../eosio/trace_api/chain_extraction.hpp | 18 ++--- .../include/eosio/trace_api/extract_util.hpp | 18 ++--- .../trace_api_plugin/test/test_extraction.cpp | 2 +- plugins/trace_api_plugin/trace_api_plugin.cpp | 5 +- unittests/api_tests.cpp | 8 ++- unittests/block_tests.cpp | 10 +-- unittests/chain_tests.cpp | 66 +++++++++++-------- unittests/forked_tests.cpp | 22 ++++--- unittests/state_history_tests.cpp | 11 ++-- .../unapplied_transaction_queue_tests.cpp | 3 +- 35 files changed, 268 insertions(+), 229 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 8d745c1a89..8526019cfe 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -1962,7 +1962,7 @@ struct controller_impl { dm_logger->on_accepted_block(bsp); } - emit( self.accepted_block, bsp ); + emit( self.accepted_block, std::tie(bsp->block, bsp->id, bsp->header, bsp->block_num) ); if( s == controller::block_status::incomplete ) { log_irreversible(); diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index 5919373d33..bb30635a4c 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -328,7 +328,7 @@ namespace eosio { namespace chain { signal block_start; signal)> accepted_block_header; - signal accepted_block; + signal)> accepted_block; signal irreversible_block; signal accepted_transaction; signal)> applied_transaction; diff --git a/libraries/chain/include/eosio/chain/subjective_billing.hpp b/libraries/chain/include/eosio/chain/subjective_billing.hpp index 839e9edba9..cec47e8092 100644 --- a/libraries/chain/include/eosio/chain/subjective_billing.hpp +++ b/libraries/chain/include/eosio/chain/subjective_billing.hpp @@ -2,7 +2,6 @@ #include #include -#include #include #include #include @@ -81,9 +80,9 @@ class subjective_billing { } } - void remove_subjective_billing( const chain::block_state_legacy_ptr& bsp, uint32_t time_ordinal ) { + void remove_subjective_billing( const chain::signed_block_ptr& block, uint32_t time_ordinal ) { if( !_trx_cache_index.empty() ) { - for( const auto& receipt : bsp->block->transactions ) { + for( const auto& receipt : block->transactions ) { if( std::holds_alternative(receipt.trx) ) { const auto& pt = std::get(receipt.trx); remove_subjective_billing( pt.id(), time_ordinal ); @@ -151,11 +150,11 @@ class subjective_billing { } } - void on_block( fc::logger& log, const chain::block_state_legacy_ptr& bsp, const fc::time_point& now ) { - if( bsp == nullptr || _disabled ) return; + void on_block( fc::logger& log, const chain::signed_block_ptr& block, const fc::time_point& now ) { + if( block == nullptr || _disabled ) return; const auto time_ordinal = time_ordinal_for(now); const auto orig_count = _account_subjective_bill_cache.size(); - remove_subjective_billing( bsp, time_ordinal ); + remove_subjective_billing( block, time_ordinal ); if (orig_count > 0) { fc_dlog( log, "Subjective billed accounts ${n} removed ${r}", ("n", orig_count)("r", orig_count - _account_subjective_bill_cache.size()) ); diff --git a/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp b/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp index a413652297..4480c06abc 100644 --- a/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp +++ b/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp @@ -114,10 +114,10 @@ class unapplied_transaction_queue { return true; } - void clear_applied( const block_state_legacy_ptr& bs ) { + void clear_applied( const signed_block_ptr& block ) { if( empty() ) return; auto& idx = queue.get(); - for( const auto& receipt : bs->block->transactions ) { + for( const auto& receipt : block->transactions ) { if( std::holds_alternative(receipt.trx) ) { const auto& pt = std::get(receipt.trx); auto itr = idx.find( pt.id() ); 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 24bfa5872b..f71bc555c6 100644 --- a/libraries/state_history/include/eosio/state_history/trace_converter.hpp +++ b/libraries/state_history/include/eosio/state_history/trace_converter.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include @@ -15,7 +14,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, bool trace_debug_mode, const block_state_legacy_ptr& block_state_legacy); + void pack(boost::iostreams::filtering_ostreambuf& ds, bool trace_debug_mode, const chain::signed_block_ptr& block); }; } // namespace state_history diff --git a/libraries/state_history/trace_converter.cpp b/libraries/state_history/trace_converter.cpp index 7d86e5cd8a..3c137f5ecf 100644 --- a/libraries/state_history/trace_converter.cpp +++ b/libraries/state_history/trace_converter.cpp @@ -15,11 +15,11 @@ void trace_converter::add_transaction(const transaction_trace_ptr& trace, const } } -void trace_converter::pack(boost::iostreams::filtering_ostreambuf& obuf, bool trace_debug_mode, const block_state_legacy_ptr& block_state) { +void trace_converter::pack(boost::iostreams::filtering_ostreambuf& obuf, bool trace_debug_mode, const chain::signed_block_ptr& block) { std::vector traces; if (onblock_trace) traces.push_back(*onblock_trace); - for (auto& r : block_state->block->transactions) { + for (auto& r : block->transactions) { transaction_id_type id; if (std::holds_alternative(r.trx)) id = std::get(r.trx); diff --git a/libraries/testing/tester.cpp b/libraries/testing/tester.cpp index 10140d16a8..d2d684f2aa 100644 --- a/libraries/testing/tester.cpp +++ b/libraries/testing/tester.cpp @@ -321,9 +321,10 @@ namespace eosio { namespace testing { control->add_indices(); if (lambda) lambda(); chain_transactions.clear(); - control->accepted_block.connect([this]( const block_state_legacy_ptr& block_state ){ - FC_ASSERT( block_state->block ); - for( auto receipt : block_state->block->transactions ) { + control->accepted_block.connect([this]( std::tuple t ){ + const auto& [ block, id, header, block_num ] = t; + FC_ASSERT( block ); + for( auto receipt : block->transactions ) { if( std::holds_alternative(receipt.trx) ) { auto &pt = std::get(receipt.trx); chain_transactions[pt.get_transaction().id()] = std::move(receipt); diff --git a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp index 2e4375e967..a1e1f2cb28 100644 --- a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp +++ b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp @@ -16,7 +16,7 @@ namespace eosio::chain::plugin_interface { namespace channels { using rejected_block = channel_decl; using accepted_block_header = channel_decl>; - using accepted_block = channel_decl; + using accepted_block = channel_decl>; using irreversible_block = channel_decl; using applied_transaction = channel_decl; } diff --git a/plugins/chain_plugin/account_query_db.cpp b/plugins/chain_plugin/account_query_db.cpp index 1d6a4ebaa2..61f1eed543 100644 --- a/plugins/chain_plugin/account_query_db.cpp +++ b/plugins/chain_plugin/account_query_db.cpp @@ -194,9 +194,9 @@ namespace eosio::chain_apis { key_bimap.right.erase(key_range.first, key_range.second); } - bool is_rollback_required( const chain::block_state_legacy_ptr& bsp ) const { + bool is_rollback_required( const chain::signed_block_ptr block ) const { std::shared_lock read_lock(rw_mutex); - const auto bnum = bsp->block->block_num(); + const auto bnum = block->block_num(); const auto& index = permission_info_index.get(); if (index.empty()) { @@ -233,8 +233,8 @@ namespace eosio::chain_apis { * at the HEAD state of the chain. * @param bsp - the block to rollback before */ - void rollback_to_before( const chain::block_state_legacy_ptr& bsp ) { - const auto bnum = bsp->block->block_num(); + void rollback_to_before( const chain::signed_block_ptr block, const chain::signed_block_header& header, uint32_t block_num ) { + const auto bnum = block->block_num(); auto& index = permission_info_index.get(); const auto& permission_by_owner = controller.db().get_index().indices().get(); @@ -265,8 +265,8 @@ namespace eosio::chain_apis { } else { const auto& po = *itr; - uint32_t last_updated_height = chain::block_timestamp_type(po.last_updated) == bsp->header.timestamp ? - bsp->block_num : last_updated_time_to_height(po.last_updated); + uint32_t last_updated_height = chain::block_timestamp_type(po.last_updated) == header.timestamp ? + block_num : last_updated_time_to_height(po.last_updated); index.modify(index.iterator_to(pi), [&po, last_updated_height](auto& mutable_pi) { mutable_pi.last_updated_height = last_updated_height; @@ -305,7 +305,7 @@ namespace eosio::chain_apis { * the thread-safe data set * @param bsp */ - auto commit_block_prelock( const chain::block_state_legacy_ptr& bsp ) const { + auto commit_block_prelock( const chain::signed_block_ptr block ) const { permission_set_t updated; permission_set_t deleted; @@ -338,7 +338,7 @@ namespace eosio::chain_apis { if( onblock_trace ) process_trace(*onblock_trace); - for( const auto& r : bsp->block->transactions ) { + for( const auto& r : block->transactions ) { chain::transaction_id_type id; if( std::holds_alternative(r.trx)) { id = std::get(r.trx); @@ -352,7 +352,7 @@ namespace eosio::chain_apis { } } - return std::make_tuple(std::move(updated), std::move(deleted), is_rollback_required(bsp)); + return std::make_tuple(std::move(updated), std::move(deleted), is_rollback_required(block)); } /** @@ -360,23 +360,23 @@ namespace eosio::chain_apis { * transaction traces need to be in the cache prior to this call * @param bsp */ - void commit_block(const chain::block_state_legacy_ptr& bsp ) { + void commit_block(const chain::signed_block_ptr& block, const chain::signed_block_header& header, uint32_t block_num ) { permission_set_t updated; permission_set_t deleted; bool rollback_required = false; - std::tie(updated, deleted, rollback_required) = commit_block_prelock(bsp); + std::tie(updated, deleted, rollback_required) = commit_block_prelock(block); // optimistic skip of locking section if there is nothing to do if (!updated.empty() || !deleted.empty() || rollback_required) { std::unique_lock write_lock(rw_mutex); - rollback_to_before(bsp); + rollback_to_before(block, header, block_num); // insert this blocks time into the time map - time_to_block_num.emplace(bsp->header.timestamp, bsp->block_num); + time_to_block_num.emplace(header.timestamp, block_num); - const auto bnum = bsp->block_num; + const auto bnum = block_num; auto& index = permission_info_index.get(); const auto& permission_by_owner = controller.db().get_index().indices().get(); @@ -520,9 +520,9 @@ namespace eosio::chain_apis { } FC_LOG_AND_DROP(("ACCOUNT DB cache_transaction_trace ERROR")); } - void account_query_db::commit_block(const chain::block_state_legacy_ptr& block ) { + void account_query_db::commit_block( const chain::signed_block_ptr& block, const chain::signed_block_header& header, uint32_t block_num ) { try { - _impl->commit_block(block); + _impl->commit_block(block, header, block_num); } FC_LOG_AND_DROP(("ACCOUNT DB commit_block ERROR")); } diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index 304d85b6a3..0f0e18e982 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -1018,20 +1018,21 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { accepted_block_header_channel.publish( priority::medium, t ); } ); - accepted_block_connection = chain->accepted_block.connect( [this]( const block_state_legacy_ptr& blk ) { + accepted_block_connection = chain->accepted_block.connect( [this]( std::tuple t ) { + const auto& [ block, id, header, block_num ] = t; if (_account_query_db) { - _account_query_db->commit_block(blk); + _account_query_db->commit_block(block, header, block_num); } if (_trx_retry_db) { - _trx_retry_db->on_accepted_block(blk); + _trx_retry_db->on_accepted_block(block_num); } if (_trx_finality_status_processing) { - _trx_finality_status_processing->signal_accepted_block(blk); + _trx_finality_status_processing->signal_accepted_block(block, id); } - accepted_block_channel.publish( priority::high, blk ); + accepted_block_channel.publish( priority::high, t ); } ); irreversible_block_connection = chain->irreversible_block.connect( [this]( const block_state_legacy_ptr& blk ) { diff --git a/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp b/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp index 164564057e..c5eaabdb2f 100644 --- a/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp +++ b/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp @@ -40,7 +40,7 @@ namespace eosio::chain_apis { * uncommitted traces. * @param block */ - void commit_block(const chain::block_state_legacy_ptr& block ); + void commit_block( const chain::signed_block_ptr& block, const chain::signed_block_header& header, uint32_t block_num ); /** * parameters for the get_accounts_by_authorizers RPC diff --git a/plugins/chain_plugin/include/eosio/chain_plugin/trx_finality_status_processing.hpp b/plugins/chain_plugin/include/eosio/chain_plugin/trx_finality_status_processing.hpp index 327fe7610d..a763083d52 100644 --- a/plugins/chain_plugin/include/eosio/chain_plugin/trx_finality_status_processing.hpp +++ b/plugins/chain_plugin/include/eosio/chain_plugin/trx_finality_status_processing.hpp @@ -42,7 +42,7 @@ namespace eosio::chain_apis { void signal_applied_transaction( const chain::transaction_trace_ptr& trace, const chain::packed_transaction_ptr& ptrx ); - void signal_accepted_block( const chain::block_state_legacy_ptr& bsp ); + void signal_accepted_block( const chain::signed_block_ptr& block, const chain::block_id_type& id ); void signal_irreversible_block( const chain::block_state_legacy_ptr& bsp ); diff --git a/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp b/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp index 201ce61322..e0bc518633 100644 --- a/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp +++ b/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp @@ -64,7 +64,7 @@ class trx_retry_db { /** * Attach to chain accepted_block signal */ - void on_accepted_block(const chain::block_state_legacy_ptr& block ); + void on_accepted_block( uint32_t block_num ); /** * Attach to chain irreversible_block signal diff --git a/plugins/chain_plugin/test/test_account_query_db.cpp b/plugins/chain_plugin/test/test_account_query_db.cpp index ff168c87a1..9a83d52555 100644 --- a/plugins/chain_plugin/test/test_account_query_db.cpp +++ b/plugins/chain_plugin/test/test_account_query_db.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include @@ -38,8 +37,9 @@ BOOST_FIXTURE_TEST_CASE(newaccount_test, validating_tester) { try { auto aq_db = account_query_db(*control); //link aq_db to the `accepted_block` signal on the controller - auto c2 = control->accepted_block.connect([&](const block_state_legacy_ptr& blk) { - aq_db.commit_block( blk); + auto c2 = control->accepted_block.connect([&](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + aq_db.commit_block( block, header, block_num ); }); produce_blocks(10); @@ -63,8 +63,9 @@ BOOST_FIXTURE_TEST_CASE(updateauth_test, validating_tester) { try { auto aq_db = account_query_db(*control); //link aq_db to the `accepted_block` signal on the controller - auto c = control->accepted_block.connect([&](const block_state_legacy_ptr& blk) { - aq_db.commit_block( blk); + auto c = control->accepted_block.connect([&](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + aq_db.commit_block( block, header, block_num ); }); produce_blocks(10); @@ -97,8 +98,9 @@ BOOST_FIXTURE_TEST_CASE(updateauth_test_multi_threaded, validating_tester) { try auto aq_db = account_query_db(*control); //link aq_db to the `accepted_block` signal on the controller - auto c = control->accepted_block.connect([&](const block_state_legacy_ptr& blk) { - aq_db.commit_block( blk); + auto c = control->accepted_block.connect([&](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + aq_db.commit_block( block, header, block_num ); }); produce_blocks(10); @@ -149,8 +151,9 @@ BOOST_AUTO_TEST_CASE(future_fork_test) { try { auto aq_db = account_query_db(*node_a.control); //link aq_db to the `accepted_block` signal on the controller - auto c = node_a.control->accepted_block.connect([&](const block_state_legacy_ptr& blk) { - aq_db.commit_block( blk); + auto c = node_a.control->accepted_block.connect([&](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + aq_db.commit_block( block, header, block_num ); }); // create 10 blocks synced @@ -196,8 +199,9 @@ BOOST_AUTO_TEST_CASE(fork_test) { try { auto aq_db = account_query_db(*node_a.control); //link aq_db to the `accepted_block` signal on the controller - auto c = node_a.control->accepted_block.connect([&](const block_state_legacy_ptr& blk) { - aq_db.commit_block( blk); + auto c = node_a.control->accepted_block.connect([&](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + aq_db.commit_block( block, header, block_num ); }); // create 10 blocks synced diff --git a/plugins/chain_plugin/test/test_trx_finality_status_processing.cpp b/plugins/chain_plugin/test/test_trx_finality_status_processing.cpp index a992578f49..bdfa0991f5 100644 --- a/plugins/chain_plugin/test/test_trx_finality_status_processing.cpp +++ b/plugins/chain_plugin/test/test_trx_finality_status_processing.cpp @@ -254,7 +254,7 @@ BOOST_AUTO_TEST_CASE(trx_finality_status_logic) { try { const auto block_20_time = set_now("2022-04-04", "04:44:44.500"); add(trx_pairs_20, bs_20); add(trx_pairs_20, bs_20); - status.signal_accepted_block(bs_20); + status.signal_accepted_block(bs_20->block, bs_20->id); cs = status.get_chain_state(); @@ -321,7 +321,7 @@ BOOST_AUTO_TEST_CASE(trx_finality_status_logic) { try { fc::logger::get(DEFAULT_LOGGER).set_log_level(fc::log_level::debug); add(trx_pairs_21, bs_21); - status.signal_accepted_block(bs_21); + status.signal_accepted_block(bs_21->block, bs_21->id); cs = status.get_chain_state(); BOOST_CHECK(cs.head_id == bs_21->id); @@ -390,7 +390,7 @@ BOOST_AUTO_TEST_CASE(trx_finality_status_logic) { try { status.signal_block_start(bn); add(trx_pairs_22, bs_22); - status.signal_accepted_block(bs_22); + status.signal_accepted_block(bs_22->block, bs_22->id); cs = status.get_chain_state(); BOOST_CHECK(cs.head_id == bs_22->id); @@ -468,7 +468,7 @@ BOOST_AUTO_TEST_CASE(trx_finality_status_logic) { try { status.signal_block_start(bn); add(trx_pairs_22_alt, bs_22_alt); - status.signal_accepted_block(bs_22_alt); + status.signal_accepted_block(bs_22_alt->block, bs_22_alt->id); cs = status.get_chain_state(); BOOST_CHECK(cs.head_id == bs_22_alt->id); @@ -553,7 +553,7 @@ BOOST_AUTO_TEST_CASE(trx_finality_status_logic) { try { status.signal_block_start(bn); add(trx_pairs_19, bs_19); - status.signal_accepted_block(bs_19); + status.signal_accepted_block(bs_19->block, bs_19->id); cs = status.get_chain_state(); BOOST_CHECK(cs.head_id == bs_19->id); @@ -661,7 +661,7 @@ BOOST_AUTO_TEST_CASE(trx_finality_status_logic) { try { status.signal_applied_transaction(trace, txn); } - status.signal_accepted_block(bs_19_alt); + status.signal_accepted_block(bs_19_alt->block, bs_19_alt->id); cs = status.get_chain_state(); BOOST_CHECK(cs.head_id == bs_19_alt->id); @@ -898,7 +898,7 @@ namespace { status.signal_applied_transaction(trace, txn); } - status.signal_accepted_block(bs); + status.signal_accepted_block(bs->block, bs->id); } void send_spec_block() { diff --git a/plugins/chain_plugin/test/test_trx_retry_db.cpp b/plugins/chain_plugin/test/test_trx_retry_db.cpp index da7a3984b4..3089b55843 100644 --- a/plugins/chain_plugin/test/test_trx_retry_db.cpp +++ b/plugins/chain_plugin/test/test_trx_retry_db.cpp @@ -276,7 +276,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { // signal block, nothing should be expired as now has not changed auto bsp1 = make_block_state(1, {}); trx_retry.on_block_start(1); - trx_retry.on_accepted_block(bsp1); + trx_retry.on_accepted_block(bsp1->block_num); trx_retry.on_irreversible_block(bsp1); BOOST_CHECK(!trx_1_expired); BOOST_CHECK(!trx_2_expired); @@ -286,7 +286,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { // signal block, first transaction should expire auto bsp2 = make_block_state(2, {}); trx_retry.on_block_start(2); - trx_retry.on_accepted_block(bsp2); + trx_retry.on_accepted_block(bsp2->block_num); trx_retry.on_irreversible_block(bsp2); BOOST_CHECK(trx_1_expired); BOOST_CHECK(!trx_2_expired); @@ -296,7 +296,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { // signal block, second transaction should expire auto bsp3 = make_block_state(3, {}); trx_retry.on_block_start(3); - trx_retry.on_accepted_block(bsp3); + trx_retry.on_accepted_block(bsp3->block_num); trx_retry.on_irreversible_block(bsp3); BOOST_CHECK(trx_1_expired); BOOST_CHECK(trx_2_expired); @@ -328,7 +328,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { // signal block, transaction 3 should be sent auto bsp4 = make_block_state(4, {}); trx_retry.on_block_start(4); - trx_retry.on_accepted_block(bsp4); + trx_retry.on_accepted_block(bsp4->block_num); BOOST_CHECK( get_id(transactions_acked.pop().second) == 3 ); BOOST_CHECK_EQUAL( 0u, transactions_acked.size() ); // increase time by 1 seconds, so trx_4 is sent @@ -337,7 +337,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { // signal block, transaction 4 should be sent auto bsp5 = make_block_state(5, {}); trx_retry.on_block_start(5); - trx_retry.on_accepted_block(bsp5); + trx_retry.on_accepted_block(bsp5->block_num); BOOST_CHECK( get_id(transactions_acked.pop().second) == 4 ); BOOST_CHECK_EQUAL( 0u, transactions_acked.size() ); BOOST_CHECK(!trx_3_expired); @@ -347,7 +347,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { fc::mock_time_traits::set_now(pnow); auto bsp6 = make_block_state(6, {}); trx_retry.on_block_start(6); - trx_retry.on_accepted_block(bsp6); + trx_retry.on_accepted_block(bsp6->block_num); trx_retry.on_irreversible_block(bsp4); trx_retry.on_irreversible_block(bsp5); trx_retry.on_irreversible_block(bsp6); @@ -378,7 +378,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { // not in block 7, so not returned to user auto bsp7 = make_block_state(7, {}); trx_retry.on_block_start(7); - trx_retry.on_accepted_block(bsp7); + trx_retry.on_accepted_block(bsp7->block_num); BOOST_CHECK(!trx_5_variant); BOOST_CHECK(!trx_6_variant); // 5,6 in block 8 @@ -390,7 +390,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { trx_retry.on_applied_transaction(trace_5, trx_5); trx_retry.on_applied_transaction(trace_6, trx_6); auto bsp8 = make_block_state(8, {trx_5, trx_6}); - trx_retry.on_accepted_block(bsp8); + trx_retry.on_accepted_block(bsp8->block_num); BOOST_CHECK(!trx_5_variant); BOOST_CHECK(!trx_6_variant); // need 2 blocks before 6 returned to user @@ -398,14 +398,14 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { fc::mock_time_traits::set_now(pnow); auto bsp9 = make_block_state(9, {}); trx_retry.on_block_start(9); - trx_retry.on_accepted_block(bsp9); + trx_retry.on_accepted_block(bsp9->block_num); BOOST_CHECK(!trx_5_variant); BOOST_CHECK(!trx_6_variant); pnow += boost::posix_time::seconds(1); // new block, new time fc::mock_time_traits::set_now(pnow); auto bsp10 = make_block_state(10, {}); trx_retry.on_block_start(10); - trx_retry.on_accepted_block(bsp10); + trx_retry.on_accepted_block(bsp10->block_num); BOOST_CHECK(!trx_5_variant); BOOST_CHECK(trx_6_variant); // now signal lib for trx_6 @@ -413,7 +413,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { fc::mock_time_traits::set_now(pnow); auto bsp11 = make_block_state(11, {}); trx_retry.on_block_start(11); - trx_retry.on_accepted_block(bsp11); + trx_retry.on_accepted_block(bsp11->block_num); BOOST_CHECK(!trx_5_variant); BOOST_CHECK(trx_6_variant); trx_retry.on_irreversible_block(bsp7); @@ -456,7 +456,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { // not in block 12 auto bsp12 = make_block_state(12, {}); trx_retry.on_block_start(12); - trx_retry.on_accepted_block(bsp12); + trx_retry.on_accepted_block(bsp12->block_num); BOOST_CHECK(!trx_7_variant); BOOST_CHECK(!trx_8_variant); BOOST_CHECK(!trx_9_expired); @@ -471,7 +471,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { trx_retry.on_applied_transaction(trace_8, trx_8); trx_retry.on_applied_transaction(trace_9, trx_9); auto bsp13 = make_block_state(13, {trx_7, trx_8, trx_9}); - trx_retry.on_accepted_block(bsp13); + trx_retry.on_accepted_block(bsp13->block_num); BOOST_CHECK(!trx_7_variant); BOOST_CHECK(!trx_8_variant); BOOST_CHECK(!trx_9_expired); @@ -480,7 +480,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { fc::mock_time_traits::set_now(pnow); auto bsp14 = make_block_state(14, {}); trx_retry.on_block_start(14); - trx_retry.on_accepted_block(bsp14); + trx_retry.on_accepted_block(bsp14->block_num); BOOST_CHECK(!trx_7_variant); BOOST_CHECK(!trx_8_variant); BOOST_CHECK(!trx_9_expired); @@ -488,7 +488,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { fc::mock_time_traits::set_now(pnow); auto bsp15 = make_block_state(15, {}); trx_retry.on_block_start(15); - trx_retry.on_accepted_block(bsp15); + trx_retry.on_accepted_block(bsp15->block_num); BOOST_CHECK(!trx_7_variant); BOOST_CHECK(!trx_8_variant); BOOST_CHECK(!trx_9_expired); @@ -500,14 +500,14 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { BOOST_CHECK_EQUAL(3u, trx_retry.size()); // now produce an empty 13 auto bsp13b = make_block_state(13, {}); // now 13 has no traces - trx_retry.on_accepted_block(bsp13b); + trx_retry.on_accepted_block(bsp13b->block_num); // produced another empty block pnow += boost::posix_time::seconds(1); // new block, new time fc::mock_time_traits::set_now(pnow); trx_retry.on_block_start(14); // now produce an empty 14 auto bsp14b = make_block_state(14, {}); // empty - trx_retry.on_accepted_block(bsp14b); + trx_retry.on_accepted_block(bsp14b->block_num); // produce block with 7,8 trx_retry.on_block_start(15); auto trace_7b = make_transaction_trace( trx_7, 15); @@ -515,13 +515,13 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { trx_retry.on_applied_transaction(trace_7b, trx_7); trx_retry.on_applied_transaction(trace_8b, trx_8); auto bsp15b = make_block_state(15, {trx_7, trx_8}); - trx_retry.on_accepted_block(bsp15b); + trx_retry.on_accepted_block(bsp15b->block_num); // need 3 blocks before 8 returned to user pnow += boost::posix_time::seconds(1); // new block, new time fc::mock_time_traits::set_now(pnow); auto bsp16 = make_block_state(16, {}); trx_retry.on_block_start(16); - trx_retry.on_accepted_block(bsp16); + trx_retry.on_accepted_block(bsp16->block_num); BOOST_CHECK(!trx_7_variant); BOOST_CHECK(!trx_8_variant); BOOST_CHECK(!trx_9_expired); @@ -529,7 +529,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { fc::mock_time_traits::set_now(pnow); auto bsp17 = make_block_state(17, {}); trx_retry.on_block_start(17); - trx_retry.on_accepted_block(bsp17); + trx_retry.on_accepted_block(bsp17->block_num); BOOST_CHECK(!trx_7_variant); BOOST_CHECK(!trx_8_variant); BOOST_CHECK(!trx_9_expired); @@ -537,7 +537,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { fc::mock_time_traits::set_now(pnow); auto bsp18 = make_block_state(18, {}); trx_retry.on_block_start(18); - trx_retry.on_accepted_block(bsp18); + trx_retry.on_accepted_block(bsp18->block_num); BOOST_CHECK(!trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(!trx_9_expired); @@ -559,7 +559,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { fc::mock_time_traits::set_now(pnow); auto bsp19 = make_block_state(19, {}); trx_retry.on_block_start(19); - trx_retry.on_accepted_block(bsp19); + trx_retry.on_accepted_block(bsp19->block_num); trx_retry.on_irreversible_block(bsp15); trx_retry.on_irreversible_block(bsp16); trx_retry.on_irreversible_block(bsp17); @@ -572,7 +572,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { fc::mock_time_traits::set_now(pnow); auto bsp20 = make_block_state(20, {}); trx_retry.on_block_start(20); - trx_retry.on_accepted_block(bsp20); + trx_retry.on_accepted_block(bsp20->block_num); // waits for LIB BOOST_CHECK(trx_7_variant); BOOST_CHECK(trx_8_variant); @@ -607,14 +607,14 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { trx_retry.on_applied_transaction(trace_10, trx_10); trx_retry.on_applied_transaction(trace_11, trx_11); auto bsp21 = make_block_state(21, {trx_10, trx_11}); - trx_retry.on_accepted_block(bsp21); + trx_retry.on_accepted_block(bsp21->block_num); BOOST_CHECK(trx_10_variant); BOOST_CHECK(!trx_11_variant); pnow += boost::posix_time::seconds(1); // new block, new time fc::mock_time_traits::set_now(pnow); auto bsp22 = make_block_state(22, {}); trx_retry.on_block_start(22); - trx_retry.on_accepted_block(bsp22); + trx_retry.on_accepted_block(bsp22->block_num); BOOST_CHECK(trx_10_variant); BOOST_CHECK(trx_11_variant); BOOST_CHECK_EQUAL(0u, trx_retry.size()); diff --git a/plugins/chain_plugin/trx_finality_status_processing.cpp b/plugins/chain_plugin/trx_finality_status_processing.cpp index 3bf7e691de..21559c5f6f 100644 --- a/plugins/chain_plugin/trx_finality_status_processing.cpp +++ b/plugins/chain_plugin/trx_finality_status_processing.cpp @@ -15,7 +15,7 @@ namespace eosio::chain_apis { void signal_applied_transaction( const chain::transaction_trace_ptr& trace, const chain::packed_transaction_ptr& ptrx ); - void signal_accepted_block( const chain::block_state_legacy_ptr& bsp ); + void signal_accepted_block( const chain::signed_block_ptr& block, const chain::block_id_type& id ); void handle_rollback(); @@ -67,9 +67,9 @@ namespace eosio::chain_apis { } FC_LOG_AND_DROP(("Failed to signal applied transaction for finality status")); } - void trx_finality_status_processing::signal_accepted_block( const chain::block_state_legacy_ptr& bsp ) { + void trx_finality_status_processing::signal_accepted_block( const chain::signed_block_ptr& block, const chain::block_id_type& id ) { try { - _my->signal_accepted_block(bsp); + _my->signal_accepted_block(block, id); } FC_LOG_AND_DROP(("Failed to signal accepted block for finality status")); } @@ -139,14 +139,14 @@ namespace eosio::chain_apis { } } - void trx_finality_status_processing_impl::signal_accepted_block( const chain::block_state_legacy_ptr& bsp ) { + void trx_finality_status_processing_impl::signal_accepted_block( const chain::signed_block_ptr& block, const chain::block_id_type& id ) { // if this block had any transactions, then we have processed everything we need to already - if (bsp->id == _head_block_id) { + if (id == _head_block_id) { return; } - _head_block_id = bsp->id; - _head_block_timestamp = bsp->block->timestamp; + _head_block_id = id; + _head_block_timestamp = block->timestamp; const auto head_block_num = chain::block_header::num_from_id(_head_block_id); if (head_block_num <= _last_proc_block_num) { diff --git a/plugins/chain_plugin/trx_retry_db.cpp b/plugins/chain_plugin/trx_retry_db.cpp index 4d0376cf99..7d54105f05 100644 --- a/plugins/chain_plugin/trx_retry_db.cpp +++ b/plugins/chain_plugin/trx_retry_db.cpp @@ -161,13 +161,13 @@ struct trx_retry_db_impl { rollback_to( block_num ); } - void on_accepted_block(const chain::block_state_legacy_ptr& bsp ) { + void on_accepted_block( uint32_t block_num ) { // good time to perform processing - ack_ready_trxs_by_block_num( bsp->block_num ); + ack_ready_trxs_by_block_num( block_num ); retry_trxs(); } - void on_irreversible_block(const chain::block_state_legacy_ptr& bsp ) { + void on_irreversible_block( const chain::block_state_legacy_ptr& bsp ) { ack_ready_trxs_by_lib( bsp->block_num ); clear_expired( bsp->block->timestamp ); } @@ -321,9 +321,9 @@ void trx_retry_db::on_block_start( uint32_t block_num ) { } FC_LOG_AND_DROP(("trx retry block_start ERROR")); } -void trx_retry_db::on_accepted_block(const chain::block_state_legacy_ptr& block ) { +void trx_retry_db::on_accepted_block( uint32_t block_num ) { try { - _impl->on_accepted_block(block); + _impl->on_accepted_block(block_num); } FC_LOG_AND_DROP(("trx retry accepted_block ERROR")); } diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp index 37e30ddf4b..9fff3aea18 100644 --- a/plugins/net_plugin/net_plugin.cpp +++ b/plugins/net_plugin/net_plugin.cpp @@ -529,7 +529,7 @@ namespace eosio { uint32_t get_chain_head_num() const; void on_accepted_block_header( const signed_block_ptr& block, const block_id_type& id ); - void on_accepted_block( const block_state_legacy_ptr& bs ); + void on_accepted_block(); void transaction_ack(const std::pair&); void on_irreversible_block( const block_state_legacy_ptr& block ); @@ -3891,7 +3891,7 @@ namespace eosio { }); } - void net_plugin_impl::on_accepted_block(const block_state_legacy_ptr& ) { + void net_plugin_impl::on_accepted_block() { on_pending_schedule(chain_plug->chain().pending_producers()); on_active_schedule(chain_plug->chain().active_producers()); } @@ -4288,8 +4288,8 @@ namespace eosio { my->on_accepted_block_header( std::get<0>(t), std::get<1>(t) ); } ); - cc.accepted_block.connect( [my = shared_from_this()]( const block_state_legacy_ptr& s ) { - my->on_accepted_block( s ); + cc.accepted_block.connect( [my = shared_from_this()]( std::tuple t ) { + my->on_accepted_block(); } ); cc.irreversible_block.connect( [my = shared_from_this()]( const block_state_legacy_ptr& s ) { my->on_irreversible_block( s ); diff --git a/plugins/producer_plugin/producer_plugin.cpp b/plugins/producer_plugin/producer_plugin.cpp index 1b81e794c6..da206c6988 100644 --- a/plugins/producer_plugin/producer_plugin.cpp +++ b/plugins/producer_plugin/producer_plugin.cpp @@ -620,11 +620,11 @@ class producer_plugin_impl : public std::enable_shared_from_thischain(); auto before = _unapplied_transactions.size(); - _unapplied_transactions.clear_applied(bsp); - chain.get_mutable_subjective_billing().on_block(_log, bsp, fc::time_point::now()); + _unapplied_transactions.clear_applied(block); + chain.get_mutable_subjective_billing().on_block(_log, block, fc::time_point::now()); if (before > 0) { fc_dlog(_log, "Removed applied transactions before: ${before}, after: ${after}", ("before", before)("after", _unapplied_transactions.size())); } @@ -1329,7 +1329,10 @@ void producer_plugin_impl::plugin_startup() { EOS_ASSERT(_producers.empty() || chain_plug->accept_transactions(), plugin_config_exception, "node cannot have any producer-name configured because no block production is possible with no [api|p2p]-accepted-transactions"); - _accepted_block_connection.emplace(chain.accepted_block.connect([this](const auto& bsp) { on_block(bsp); })); + _accepted_block_connection.emplace(chain.accepted_block.connect([this](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + on_block(block); + })); _accepted_block_header_connection.emplace(chain.accepted_block_header.connect([this](std::tuple t) { const auto& block = std::get<0>(t); const auto& id = std::get<1>(t); diff --git a/plugins/producer_plugin/test/test_trx_full.cpp b/plugins/producer_plugin/test/test_trx_full.cpp index e664f081bd..c91e03f9b6 100644 --- a/plugins/producer_plugin/test/test_trx_full.cpp +++ b/plugins/producer_plugin/test/test_trx_full.cpp @@ -68,15 +68,15 @@ auto make_unique_trx( const chain_id_type& chain_id ) { } // verify all trxs are in blocks only once -bool verify_equal( const std::deque& trxs, const std::deque& all_blocks) { +bool verify_equal( const std::deque& trxs, const std::deque& all_blocks) { std::set trxs_ids; // trx can appear more than once if they were aborted std::set blk_trxs_ids; for( const auto& trx : trxs ) { trxs_ids.emplace( trx->id() ); } - for( const auto& bs : all_blocks ) { - for( const auto& trx_receipt : bs->block->transactions ) { + for( const auto& block : all_blocks ) { + for( const auto& trx_receipt : block->transactions ) { const auto& trx = std::get( trx_receipt.trx ).get_transaction(); blk_trxs_ids.emplace( trx.id() ); } @@ -126,13 +126,14 @@ BOOST_AUTO_TEST_CASE(producer) { auto[prod_plug, chain_plug] = plugin_fut.get(); auto chain_id = chain_plug->get_chain_id(); - std::deque all_blocks; + std::deque all_blocks; std::promise empty_blocks_promise; std::future empty_blocks_fut = empty_blocks_promise.get_future(); - auto ab = chain_plug->chain().accepted_block.connect( [&](const block_state_legacy_ptr& bsp) { + auto ab = chain_plug->chain().accepted_block.connect( [&](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; static int num_empty = std::numeric_limits::max(); - all_blocks.push_back( bsp ); - if( bsp->block->transactions.empty() ) { + all_blocks.push_back( block ); + if( block->transactions.empty() ) { --num_empty; if( num_empty == 0 ) empty_blocks_promise.set_value(); } else { // we want a few empty blocks after we have some non-empty blocks diff --git a/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp b/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp index 7692eb0be6..6a2449e844 100644 --- a/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp +++ b/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp @@ -26,7 +26,7 @@ struct send_queue_entry_base { struct session_base { virtual void send_update(bool changed) = 0; - virtual void send_update(const eosio::chain::block_state_legacy_ptr& block_state) = 0; + virtual void send_update(const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num) = 0; virtual ~session_base() = default; std::optional current_request; @@ -35,15 +35,19 @@ struct session_base { class send_update_send_queue_entry : public send_queue_entry_base { std::shared_ptr session; - const chain::block_state_legacy_ptr block_state; + const chain::signed_block_ptr block; + const chain::block_id_type id; + uint32_t block_num; public: - send_update_send_queue_entry(std::shared_ptr s, chain::block_state_legacy_ptr block_state) + send_update_send_queue_entry(std::shared_ptr s, chain::signed_block_ptr block, chain::block_id_type id, uint32_t block_num) : session(std::move(s)) - , block_state(std::move(block_state)){} + , block(std::move(block)) + , id(std::move(id)) + , block_num(block_num){} void send_entry() override { - if( block_state ) { - session->send_update(block_state); + if( block) { + session->send_update(block, id, block_num); } else { session->send_update(false); } @@ -118,14 +122,14 @@ class session_manager { void send_updates() { for( auto& s : session_set ) { if (s->need_to_send_update ) { - add_send_queue(s, std::make_unique(s, nullptr)); + add_send_queue(s, std::make_unique(s, nullptr, chain::block_id_type{}, 0)); } } } - void send_update(const chain::block_state_legacy_ptr& block_state) { + void send_update(const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num) { for( auto& s : session_set ) { - add_send_queue(s, std::make_unique(s, block_state)); + add_send_queue(s, std::make_unique(s, block, id, block_num)); } } @@ -481,7 +485,7 @@ struct session : session_base, std::enable_shared_from_thismax_messages_in_flight) { session_mgr.pop_entry(false); @@ -502,7 +506,7 @@ struct session : session_base, std::enable_shared_from_this block_id = - (block_state && block_state->block_num == to_send_block_num) ? block_state->id : plugin.get_block_id(to_send_block_num); + (block_num == to_send_block_num) ? id : plugin.get_block_id(to_send_block_num); if (block_id && position_it && (*position_it)->block_num == to_send_block_num) { // This branch happens when the head block of nodeos is behind the head block of connecting client. @@ -527,7 +531,7 @@ struct session : session_base, std::enable_shared_from_thisfetch_block) - plugin.get_block(to_send_block_num, block_state, result.block); + plugin.get_block(to_send_block_num, block_num, block, result.block); if (current_request->fetch_traces && plugin.get_trace_log()) result.traces.emplace(); if (current_request->fetch_deltas && plugin.get_chain_state_log()) @@ -553,23 +557,23 @@ struct session : session_base, std::enable_shared_from_this>(this->shared_from_this(), std::move(result))->send_entry(); } - void send_update(const chain::block_state_legacy_ptr& block_state) override { + void send_update(const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num) override { if (!current_request || !current_request->max_messages_in_flight) { session_mgr.pop_entry(false); return; } state_history::get_blocks_result_v0 result; - result.head = {block_state->block_num, block_state->id}; - to_send_block_num = std::min(block_state->block_num, to_send_block_num); - send_update(std::move(result), block_state); + result.head = {block_num, id}; + to_send_block_num = std::min(block_num, to_send_block_num); + send_update(std::move(result), block, id, block_num); } void send_update(bool changed) override { if (changed || need_to_send_update) { state_history::get_blocks_result_v0 result; result.head = plugin.get_block_head(); - send_update(std::move(result), {}); + send_update(std::move(result), nullptr, chain::block_id_type{}, 0); } else { session_mgr.pop_entry(false); } diff --git a/plugins/state_history_plugin/state_history_plugin.cpp b/plugins/state_history_plugin/state_history_plugin.cpp index 83fcec261f..75b4dd66bb 100644 --- a/plugins/state_history_plugin/state_history_plugin.cpp +++ b/plugins/state_history_plugin/state_history_plugin.cpp @@ -88,11 +88,11 @@ struct state_history_plugin_impl : std::enable_shared_from_thisblock_num) { - p = block_state->block; + if (block_num == block_state_block_num) { + p = block; } else { p = chain_plug->chain().fetch_block_by_number(block_num); } @@ -107,8 +107,8 @@ struct state_history_plugin_impl : std::enable_shared_from_this& result) const { - auto p = get_block(block_num, block_state); + void get_block(uint32_t block_num, uint32_t block_state_block_num, const signed_block_ptr& block, std::optional& result) const { + auto p = get_block(block_num, block_state_block_num, block); if (p) result = fc::raw::pack(*p); } @@ -201,12 +201,12 @@ struct state_history_plugin_impl : std::enable_shared_from_thisshared_from_this(), block_state]() { - self->get_session_manager().send_update(block_state); + boost::asio::post(get_ship_executor(), [self = this->shared_from_this(), block, id, block_num]() { + self->get_session_manager().send_update(block, id, block_num); }); } @@ -243,29 +243,29 @@ struct state_history_plugin_impl : std::enable_shared_from_thisid, + .block_id = id, .payload_size = 0}; - trace_log->pack_and_write_entry(header, block_state->block->previous, [this, &block_state](auto&& buf) { - trace_converter.pack(buf, trace_debug_mode, block_state); + trace_log->pack_and_write_entry(header, block->previous, [this, &block](auto&& buf) { + trace_converter.pack(buf, trace_debug_mode, block); }); } // called from main thread - void store_chain_state(const block_state_legacy_ptr& block_state) { + void store_chain_state(const block_id_type& id, const signed_block_header& block_header, uint32_t block_num) { if (!chain_state_log) return; bool fresh = chain_state_log->empty(); if (fresh) - fc_ilog(_log, "Placing initial state in block ${n}", ("n", block_state->block_num)); + fc_ilog(_log, "Placing initial state in block ${n}", ("n", block_num)); state_history_log_header header{ - .magic = ship_magic(ship_current_version, 0), .block_id = block_state->id, .payload_size = 0}; - chain_state_log->pack_and_write_entry(header, block_state->header.previous, [this, fresh](auto&& buf) { + .magic = ship_magic(ship_current_version, 0), .block_id = id, .payload_size = 0}; + chain_state_log->pack_and_write_entry(header, block_header.previous, [this, fresh](auto&& buf) { pack_deltas(buf, chain_plug->chain().db(), fresh); }); } // store_chain_state @@ -329,7 +329,10 @@ void state_history_plugin_impl::plugin_initialize(const variables_map& options) on_applied_transaction(std::get<0>(t), std::get<1>(t)); })); accepted_block_connection.emplace( - chain.accepted_block.connect([&](const block_state_legacy_ptr& p) { on_accepted_block(p); })); + chain.accepted_block.connect([&](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + on_accepted_block(block, id, header, block_num); + })); block_start_connection.emplace( chain.block_start.connect([&](uint32_t block_num) { on_block_start(block_num); })); @@ -406,7 +409,7 @@ void state_history_plugin_impl::plugin_startup() { auto bsp = chain.head_block_state(); if( bsp && chain_state_log && chain_state_log->empty() ) { fc_ilog( _log, "Storing initial state on startup, this can take a considerable amount of time" ); - store_chain_state( bsp ); + store_chain_state( bsp->id, bsp->header, bsp->block_num ); fc_ilog( _log, "Done storing initial state on startup" ); } first_available_block = chain.earliest_available_block_num(); diff --git a/plugins/state_history_plugin/tests/session_test.cpp b/plugins/state_history_plugin/tests/session_test.cpp index 6ca9cfd3c5..bcfb2a219d 100644 --- a/plugins/state_history_plugin/tests/session_test.cpp +++ b/plugins/state_history_plugin/tests/session_test.cpp @@ -123,7 +123,7 @@ struct mock_state_history_plugin { fc::logger& get_logger() { return logger; } - void get_block(uint32_t block_num, const eosio::chain::block_state_legacy_ptr& block_state, + void get_block(uint32_t block_num, uint32_t block_state_block_num, const eosio::chain::signed_block_ptr& block, std::optional& result) const { result.emplace().resize(16); } diff --git a/plugins/test_control_plugin/test_control_plugin.cpp b/plugins/test_control_plugin/test_control_plugin.cpp index 4ff52bc1fd..15ed4cbf84 100644 --- a/plugins/test_control_plugin/test_control_plugin.cpp +++ b/plugins/test_control_plugin/test_control_plugin.cpp @@ -15,9 +15,9 @@ class test_control_plugin_impl { void kill_on_head(account_name prod, uint32_t where_in_seq); private: - void accepted_block(const chain::block_state_legacy_ptr& bsp); + void accepted_block(const chain::block_id_type& id); void applied_irreversible_block(const chain::block_state_legacy_ptr& bsp); - void process_next_block_state_legacy(const chain::block_state_legacy_ptr& bsp); + void process_next_block_state_legacy(const chain::block_id_type& id); std::optional _accepted_block_connection; std::optional _irreversible_block_connection; @@ -36,8 +36,9 @@ void test_control_plugin_impl::connect() { applied_irreversible_block( bs ); } )); _accepted_block_connection = - _chain.accepted_block.connect( [&]( const chain::block_state_legacy_ptr& bs ) { - accepted_block( bs ); + _chain.accepted_block.connect( [&]( std::tuple t ) { + const auto& [ block, id, header, block_num ] = t; + accepted_block( id ); } ); } @@ -48,17 +49,19 @@ void test_control_plugin_impl::disconnect() { void test_control_plugin_impl::applied_irreversible_block(const chain::block_state_legacy_ptr& bsp) { if (_track_lib) - process_next_block_state_legacy(bsp); + process_next_block_state_legacy(bsp->id); } -void test_control_plugin_impl::accepted_block(const chain::block_state_legacy_ptr& bsp) { +void test_control_plugin_impl::accepted_block(const chain::block_id_type& id) { if (_track_head) - process_next_block_state_legacy(bsp); + process_next_block_state_legacy(id); } -void test_control_plugin_impl::process_next_block_state_legacy(const chain::block_state_legacy_ptr& bsp) { +void test_control_plugin_impl::process_next_block_state_legacy(const chain::block_id_type& id) { // Tests expect the shutdown only after signaling a producer shutdown and seeing a full production cycle const auto block_time = _chain.head_block_time() + fc::microseconds(chain::config::block_interval_us); + // have to fetch bsp due to get_scheduled_producer call + const auto& bsp = _chain.fetch_block_state_by_id(id); const auto& producer_authority = bsp->get_scheduled_producer(block_time); const auto producer_name = producer_authority.producer_name; const auto slot = bsp->block->timestamp.slot % chain::config::producer_repetitions; diff --git a/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp b/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp index 9a588161e9..294ecd2a1c 100644 --- a/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp +++ b/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp @@ -31,8 +31,8 @@ class chain_extraction_impl_type { } /// connect to chain controller accepted_block signal - void signal_accepted_block( const chain::block_state_legacy_ptr& bsp ) { - on_accepted_block( bsp ); + void signal_accepted_block( const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num ) { + on_accepted_block( block, id, block_num ); } /// connect to chain controller irreversible_block signal @@ -63,8 +63,8 @@ class chain_extraction_impl_type { } } - void on_accepted_block(const chain::block_state_legacy_ptr& block_state) { - store_block_trace( block_state ); + void on_accepted_block(const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num) { + store_block_trace( block, id, block_num ); } void on_irreversible_block( const chain::block_state_legacy_ptr& block_state ) { @@ -80,18 +80,18 @@ class chain_extraction_impl_type { onblock_trace.reset(); } - void store_block_trace( const chain::block_state_legacy_ptr& block_state ) { + void store_block_trace( const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num) { try { using transaction_trace_t = transaction_trace_v3; - auto bt = create_block_trace( block_state ); + auto bt = create_block_trace( block, id, block_num ); std::vector traces; - traces.reserve( block_state->block->transactions.size() + 1 ); + traces.reserve( block->transactions.size() + 1 ); block_trxs_entry tt; - tt.ids.reserve(block_state->block->transactions.size() + 1); + tt.ids.reserve(block->transactions.size() + 1); if( onblock_trace ) traces.emplace_back( to_transaction_trace( *onblock_trace )); - for( const auto& r : block_state->block->transactions ) { + for( const auto& r : block->transactions ) { transaction_id_type id; if( std::holds_alternative(r.trx)) { id = std::get(r.trx); diff --git a/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp b/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp index d0f143bc1f..37384fc0ae 100644 --- a/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp +++ b/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp @@ -63,16 +63,16 @@ inline TransactionTrace to_transaction_trace( const cache_trace& t ) { return r; } -inline block_trace_v2 create_block_trace( const chain::block_state_legacy_ptr& bsp ) { +inline block_trace_v2 create_block_trace( const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num ) { block_trace_v2 r; - r.id = bsp->id; - r.number = bsp->block_num; - r.previous_id = bsp->block->previous; - r.timestamp = bsp->block->timestamp; - r.producer = bsp->block->producer; - r.schedule_version = bsp->block->schedule_version; - r.transaction_mroot = bsp->block->transaction_mroot; - r.action_mroot = bsp->block->action_mroot; + r.id = id; + r.number = block_num; + r.previous_id = block->previous; + r.timestamp = block->timestamp; + r.producer = block->producer; + r.schedule_version = block->schedule_version; + r.transaction_mroot = block->transaction_mroot; + r.action_mroot = block->action_mroot; return r; } diff --git a/plugins/trace_api_plugin/test/test_extraction.cpp b/plugins/trace_api_plugin/test/test_extraction.cpp index 22450e1997..2211ecbce5 100644 --- a/plugins/trace_api_plugin/test/test_extraction.cpp +++ b/plugins/trace_api_plugin/test/test_extraction.cpp @@ -137,7 +137,7 @@ struct extraction_test_fixture { } void signal_accepted_block( const chain::block_state_legacy_ptr& bsp ) { - extraction_impl.signal_accepted_block(bsp); + extraction_impl.signal_accepted_block(bsp->block, bsp->id, bsp->block_num); } // fixture data and methods diff --git a/plugins/trace_api_plugin/trace_api_plugin.cpp b/plugins/trace_api_plugin/trace_api_plugin.cpp index a05da93e62..f8bddd91c2 100644 --- a/plugins/trace_api_plugin/trace_api_plugin.cpp +++ b/plugins/trace_api_plugin/trace_api_plugin.cpp @@ -377,9 +377,10 @@ struct trace_api_plugin_impl { })); accepted_block_connection.emplace( - chain.accepted_block.connect([this](const chain::block_state_legacy_ptr& p) { + chain.accepted_block.connect([this](std::tuple t) { emit_killer([&](){ - extraction->signal_accepted_block(p); + const auto& [ block, id, header, block_num ] = t; + extraction->signal_accepted_block(block, id, block_num); }); })); diff --git a/unittests/api_tests.cpp b/unittests/api_tests.cpp index 294c3eb062..2ccd4ef3c8 100644 --- a/unittests/api_tests.cpp +++ b/unittests/api_tests.cpp @@ -1470,8 +1470,10 @@ void transaction_tests(T& chain) { auto& t = std::get<0>(x); if (t && t->receipt && t->receipt->status != transaction_receipt::executed) { trace = t; } } ); - block_state_legacy_ptr bsp; - auto c2 = chain.control->accepted_block.connect([&](const block_state_legacy_ptr& b) { bsp = b; }); + signed_block_ptr block; + auto c2 = chain.control->accepted_block.connect([&](std::tuple t) { + const auto& [ b, id, header, block_num ] = t; + block = b; }); // test error handling on deferred transaction failure auto test_trace = CALL_TEST_FUNCTION(chain, "test_transaction", "send_transaction_trigger_error_handler", {}); @@ -1480,7 +1482,7 @@ void transaction_tests(T& chain) { BOOST_CHECK_EQUAL(trace->receipt->status, transaction_receipt::soft_fail); std::set block_ids; - for( const auto& receipt : bsp->block->transactions ) { + for( const auto& receipt : block->transactions ) { transaction_id_type id; if( std::holds_alternative(receipt.trx) ) { const auto& pt = std::get(receipt.trx); diff --git a/unittests/block_tests.cpp b/unittests/block_tests.cpp index 92e48c095f..b70ac5de7e 100644 --- a/unittests/block_tests.cpp +++ b/unittests/block_tests.cpp @@ -217,11 +217,13 @@ BOOST_AUTO_TEST_CASE(broadcasted_block_test) signed_block_ptr bcasted_blk_by_prod_node; signed_block_ptr bcasted_blk_by_recv_node; - producer_node.control->accepted_block.connect( [&](const block_state_legacy_ptr& bs) { - bcasted_blk_by_prod_node = bs->block; + producer_node.control->accepted_block.connect( [&](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + bcasted_blk_by_prod_node = block; }); - receiving_node.control->accepted_block.connect( [&](const block_state_legacy_ptr& bs) { - bcasted_blk_by_recv_node = bs->block; + receiving_node.control->accepted_block.connect( [&](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + bcasted_blk_by_recv_node = block; }); auto b = producer_node.produce_block(); diff --git a/unittests/chain_tests.cpp b/unittests/chain_tests.cpp index 5045fb7dc7..5ba6f8b37c 100644 --- a/unittests/chain_tests.cpp +++ b/unittests/chain_tests.cpp @@ -149,41 +149,51 @@ BOOST_AUTO_TEST_CASE( signal_validated_blocks ) try { tester chain; tester validator; - block_state_legacy_ptr accepted_bsp; - auto c = chain.control->accepted_block.connect([&](const block_state_legacy_ptr& b) { - BOOST_CHECK(b); - BOOST_CHECK(chain.control->fetch_block_state_by_id(b->id) == b); - BOOST_CHECK(chain.control->fetch_block_state_by_number(b->block_num) == b); // verify it can be found (has to be validated) - BOOST_CHECK(chain.control->fetch_block_by_id(b->id) == b->block); - BOOST_CHECK(chain.control->fetch_block_by_number(b->block_num) == b->block); - BOOST_REQUIRE(chain.control->fetch_block_header_by_number(b->block_num)); - BOOST_CHECK(chain.control->fetch_block_header_by_number(b->block_num)->calculate_id() == b->id); - BOOST_REQUIRE(chain.control->fetch_block_header_by_id(b->id)); - BOOST_CHECK(chain.control->fetch_block_header_by_id(b->id)->calculate_id() == b->id); - accepted_bsp = b; + signed_block_ptr accepted_block; + block_id_type accepted_id; + auto c = chain.control->accepted_block.connect([&](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + BOOST_CHECK(block); + const auto& bsp_by_id = chain.control->fetch_block_state_by_id(id); + BOOST_CHECK(bsp_by_id->block_num == block_num); + const auto& bsp_by_number = chain.control->fetch_block_state_by_number(block_num); // verify it can be found (has to be validated) + BOOST_CHECK(bsp_by_number->id == id); + BOOST_CHECK(chain.control->fetch_block_by_id(id) == block); + BOOST_CHECK(chain.control->fetch_block_by_number(block_num) == block); + BOOST_REQUIRE(chain.control->fetch_block_header_by_number(block_num)); + BOOST_CHECK(chain.control->fetch_block_header_by_number(block_num)->calculate_id() == id); + BOOST_REQUIRE(chain.control->fetch_block_header_by_id(id)); + BOOST_CHECK(chain.control->fetch_block_header_by_id(id)->calculate_id() == id); + accepted_block = block; + accepted_id = id; }); - block_state_legacy_ptr validated_bsp; - auto c2 = validator.control->accepted_block.connect([&](const block_state_legacy_ptr& b) { - BOOST_CHECK(b); - BOOST_CHECK(validator.control->fetch_block_state_by_id(b->id) == b); - BOOST_CHECK(validator.control->fetch_block_state_by_number(b->block_num) == b); // verify it can be found (has to be validated) - BOOST_CHECK(validator.control->fetch_block_by_id(b->id) == b->block); - BOOST_CHECK(validator.control->fetch_block_by_number(b->block_num) == b->block); - BOOST_REQUIRE(validator.control->fetch_block_header_by_number(b->block_num)); - BOOST_CHECK(validator.control->fetch_block_header_by_number(b->block_num)->calculate_id() == b->id); - BOOST_REQUIRE(validator.control->fetch_block_header_by_id(b->id)); - BOOST_CHECK(validator.control->fetch_block_header_by_id(b->id)->calculate_id() == b->id); - validated_bsp = b; + signed_block_ptr validated_block; + block_id_type validated_id; + auto c2 = validator.control->accepted_block.connect([&](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + BOOST_CHECK(block); + const auto& bsp_by_id = validator.control->fetch_block_state_by_id(id); + BOOST_CHECK(bsp_by_id->block_num == block_num); + const auto& bsp_by_number = validator.control->fetch_block_state_by_number(block_num); // verify it can be found (has to be validated) + BOOST_CHECK(bsp_by_number->id == id); + BOOST_CHECK(validator.control->fetch_block_by_id(id) == block); + BOOST_CHECK(validator.control->fetch_block_by_number(block_num) == block); + BOOST_REQUIRE(validator.control->fetch_block_header_by_number(block_num)); + BOOST_CHECK(validator.control->fetch_block_header_by_number(block_num)->calculate_id() == id); + BOOST_REQUIRE(validator.control->fetch_block_header_by_id(id)); + BOOST_CHECK(validator.control->fetch_block_header_by_id(id)->calculate_id() == id); + validated_block = block; + validated_id = id; }); chain.produce_blocks(1); - validator.push_block(accepted_bsp->block); + validator.push_block(accepted_block); chain.create_account("hello"_n); auto produced_block = chain.produce_block(); - validator.push_block(accepted_bsp->block); - BOOST_CHECK(produced_block->calculate_id() == accepted_bsp->id); - BOOST_CHECK(accepted_bsp->id == validated_bsp->id); + validator.push_block(accepted_block); + BOOST_CHECK(produced_block->calculate_id() == accepted_id); + BOOST_CHECK(accepted_id == validated_id); } FC_LOG_AND_RETHROW() diff --git a/unittests/forked_tests.cpp b/unittests/forked_tests.cpp index c5b4e38a80..8c6710b09c 100644 --- a/unittests/forked_tests.cpp +++ b/unittests/forked_tests.cpp @@ -351,10 +351,13 @@ BOOST_AUTO_TEST_CASE( validator_accepts_valid_blocks ) try { auto id = n1.control->head_block_id(); - block_state_legacy_ptr first_block; + signed_block_ptr first_block; + signed_block_header first_header; - auto c = n2.control->accepted_block.connect( [&]( const block_state_legacy_ptr& bsp) { - first_block = bsp; + auto c = n2.control->accepted_block.connect( [&]( std::tuple t ) { + const auto& [ block, id, header, block_num ] = t; + first_block = block; + first_header = header; } ); push_blocks( n1, n2 ); @@ -362,13 +365,13 @@ BOOST_AUTO_TEST_CASE( validator_accepts_valid_blocks ) try { BOOST_CHECK_EQUAL( n2.control->head_block_id(), id ); BOOST_REQUIRE( first_block ); - first_block->verify_signee(); - BOOST_CHECK_EQUAL( first_block->header.calculate_id(), first_block->block->calculate_id() ); - BOOST_CHECK( first_block->header.producer_signature == first_block->block->producer_signature ); + // WARNING first_block->verify_signee(); + BOOST_CHECK_EQUAL( first_header.calculate_id(), first_block->calculate_id() ); + BOOST_CHECK( first_header.producer_signature == first_block->producer_signature ); c.disconnect(); - n3.push_block( first_block->block ); + n3.push_block( first_block ); BOOST_CHECK_EQUAL( n3.control->head_block_id(), id ); @@ -697,8 +700,9 @@ BOOST_AUTO_TEST_CASE( push_block_returns_forked_transactions ) try { // test forked blocks signal accepted_block in order, required by trace_api_plugin std::vector accepted_blocks; - auto conn = c.control->accepted_block.connect( [&]( const block_state_legacy_ptr& bsp) { - accepted_blocks.emplace_back( bsp->block ); + auto conn = c.control->accepted_block.connect( [&]( std::tuple t ) { + const auto& [ block, id, header, block_num ] = t; + accepted_blocks.emplace_back( block ); } ); // dan on chain 1 now gets all of the blocks from chain 2 which should cause fork switch diff --git a/unittests/state_history_tests.cpp b/unittests/state_history_tests.cpp index 1f46576e36..1e8279a7d6 100644 --- a/unittests/state_history_tests.cpp +++ b/unittests/state_history_tests.cpp @@ -631,16 +631,17 @@ struct state_history_tester : state_history_tester_logs, tester { trace_converter.add_transaction(std::get<0>(t), std::get<1>(t)); }); - control.accepted_block.connect([&](const block_state_legacy_ptr& block_state) { + control.accepted_block.connect([&](std::tuple t) { + const auto& [ block, id, block_header, block_num ] = t; eosio::state_history_log_header header{.magic = eosio::ship_magic(eosio::ship_current_version, 0), - .block_id = block_state->id, + .block_id = id, .payload_size = 0}; - traces_log.pack_and_write_entry(header, block_state->block->previous, [this, &block_state](auto&& buf) { - trace_converter.pack(buf, false, block_state); + traces_log.pack_and_write_entry(header, block->previous, [this, &block](auto&& buf) { + trace_converter.pack(buf, false, block); }); - chain_state_log.pack_and_write_entry(header, block_state->header.previous, [&control](auto&& buf) { + chain_state_log.pack_and_write_entry(header, block_header.previous, [&control](auto&& buf) { eosio::state_history::pack_deltas(buf, control.db(), true); }); }); diff --git a/unittests/unapplied_transaction_queue_tests.cpp b/unittests/unapplied_transaction_queue_tests.cpp index 13e279d71b..5d91202698 100644 --- a/unittests/unapplied_transaction_queue_tests.cpp +++ b/unittests/unapplied_transaction_queue_tests.cpp @@ -124,7 +124,8 @@ BOOST_AUTO_TEST_CASE( unapplied_transaction_queue_test ) try { // clear applied q.add_aborted( { trx1, trx2, trx3 } ); - q.clear_applied( create_test_block_state( { trx1, trx3, trx4 } ) ); + auto bs0 = create_test_block_state( { trx1, trx3, trx4 } ); + q.clear_applied( bs0->block ); BOOST_CHECK( q.size() == 1u ); BOOST_REQUIRE( next( q ) == trx2 ); BOOST_CHECK( q.size() == 0u ); From e7a87172a93f2c8dc66478c7a1bd4ceb06e13b6d Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Sun, 17 Dec 2023 09:57:16 -0500 Subject: [PATCH 04/19] change irreversible_block to signal only required information --- libraries/chain/controller.cpp | 9 ++-- .../chain/include/eosio/chain/controller.hpp | 4 +- .../include/eosio/chain/plugin_interface.hpp | 2 +- plugins/chain_plugin/chain_plugin.cpp | 10 +++-- .../trx_finality_status_processing.hpp | 3 +- .../eosio/chain_plugin/trx_retry_db.hpp | 3 +- .../test_trx_finality_status_processing.cpp | 2 +- .../chain_plugin/test/test_trx_retry_db.cpp | 42 +++++++++---------- .../trx_finality_status_processing.cpp | 6 +-- plugins/chain_plugin/trx_retry_db.cpp | 10 ++--- plugins/net_plugin/net_plugin.cpp | 11 ++--- plugins/producer_plugin/producer_plugin.cpp | 8 ++-- .../test_control_plugin.cpp | 11 ++--- .../eosio/trace_api/chain_extraction.hpp | 12 +++--- plugins/trace_api_plugin/trace_api_plugin.cpp | 5 ++- 15 files changed, 72 insertions(+), 66 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 8526019cfe..028a455efb 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -342,8 +342,9 @@ struct controller_impl { set_activation_handler(); set_activation_handler(); - self.irreversible_block.connect([this](const block_state_legacy_ptr& bsp) { - wasmif.current_lib(bsp->block_num); + self.irreversible_block.connect([this](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + wasmif.current_lib(block_num); }); @@ -448,7 +449,7 @@ struct controller_impl { apply_block( br, *bitr, controller::block_status::complete, trx_meta_cache_lookup{} ); } - emit( self.irreversible_block, *bitr ); + emit( self.irreversible_block, std::tie((*bitr)->block, (*bitr)->id, (*bitr)->header, (*bitr)->block_num) ); // blog.append could fail due to failures like running out of space. // Do it before commit so that in case it throws, DB can be rolled back. @@ -2316,7 +2317,7 @@ struct controller_impl { // On replay, log_irreversible is not called and so no irreversible_block signal is emitted. // So emit it explicitly here. - emit( self.irreversible_block, bsp ); + emit( self.irreversible_block, std::tie(bsp->block, bsp->id, bsp->header, bsp->block_num) ); if (!self.skip_db_sessions(s)) { db.commit(bsp->block_num); diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index bb30635a4c..342bbaa725 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -328,8 +328,8 @@ namespace eosio { namespace chain { signal block_start; signal)> accepted_block_header; - signal)> accepted_block; - signal irreversible_block; + signal)> accepted_block; + signal)> irreversible_block; signal accepted_transaction; signal)> applied_transaction; diff --git a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp index a1e1f2cb28..69cb94a436 100644 --- a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp +++ b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp @@ -17,7 +17,7 @@ namespace eosio::chain::plugin_interface { using rejected_block = channel_decl; using accepted_block_header = channel_decl>; using accepted_block = channel_decl>; - using irreversible_block = channel_decl; + using irreversible_block = channel_decl>; using applied_transaction = channel_decl; } diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index 0f0e18e982..36afdb8dfc 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -1035,16 +1035,18 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { accepted_block_channel.publish( priority::high, t ); } ); - irreversible_block_connection = chain->irreversible_block.connect( [this]( const block_state_legacy_ptr& blk ) { + irreversible_block_connection = chain->irreversible_block.connect( [this]( std::tuple t ) { + const auto& [ block, id, header, block_num ] = t; + if (_trx_retry_db) { - _trx_retry_db->on_irreversible_block(blk); + _trx_retry_db->on_irreversible_block(block, block_num); } if (_trx_finality_status_processing) { - _trx_finality_status_processing->signal_irreversible_block(blk); + _trx_finality_status_processing->signal_irreversible_block(block, id); } - irreversible_block_channel.publish( priority::low, blk ); + irreversible_block_channel.publish( priority::low, t ); } ); applied_transaction_connection = chain->applied_transaction.connect( diff --git a/plugins/chain_plugin/include/eosio/chain_plugin/trx_finality_status_processing.hpp b/plugins/chain_plugin/include/eosio/chain_plugin/trx_finality_status_processing.hpp index a763083d52..b092f38320 100644 --- a/plugins/chain_plugin/include/eosio/chain_plugin/trx_finality_status_processing.hpp +++ b/plugins/chain_plugin/include/eosio/chain_plugin/trx_finality_status_processing.hpp @@ -1,6 +1,5 @@ #pragma once #include -#include #include #include @@ -44,7 +43,7 @@ namespace eosio::chain_apis { void signal_accepted_block( const chain::signed_block_ptr& block, const chain::block_id_type& id ); - void signal_irreversible_block( const chain::block_state_legacy_ptr& bsp ); + void signal_irreversible_block( const chain::signed_block_ptr& block, const chain::block_id_type& id ); void signal_block_start( uint32_t block_num ); diff --git a/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp b/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp index e0bc518633..a412975694 100644 --- a/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp +++ b/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp @@ -1,6 +1,5 @@ #pragma once #include -#include #include namespace eosio::chain_apis { @@ -69,7 +68,7 @@ class trx_retry_db { /** * Attach to chain irreversible_block signal */ - void on_irreversible_block(const chain::block_state_legacy_ptr& block ); + void on_irreversible_block( const chain::signed_block_ptr& block, uint32_t block_num ); private: std::unique_ptr _impl; diff --git a/plugins/chain_plugin/test/test_trx_finality_status_processing.cpp b/plugins/chain_plugin/test/test_trx_finality_status_processing.cpp index bdfa0991f5..770fe31e46 100644 --- a/plugins/chain_plugin/test/test_trx_finality_status_processing.cpp +++ b/plugins/chain_plugin/test/test_trx_finality_status_processing.cpp @@ -750,7 +750,7 @@ BOOST_AUTO_TEST_CASE(trx_finality_status_logic) { try { BOOST_REQUIRE(!ts); // irreversible - status.signal_irreversible_block(bs_19_alt); + status.signal_irreversible_block(bs_19_alt->block, bs_19_alt->id); cs = status.get_chain_state(); BOOST_CHECK(cs.head_id == bs_19_alt->id); diff --git a/plugins/chain_plugin/test/test_trx_retry_db.cpp b/plugins/chain_plugin/test/test_trx_retry_db.cpp index 3089b55843..b99343929b 100644 --- a/plugins/chain_plugin/test/test_trx_retry_db.cpp +++ b/plugins/chain_plugin/test/test_trx_retry_db.cpp @@ -277,7 +277,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { auto bsp1 = make_block_state(1, {}); trx_retry.on_block_start(1); trx_retry.on_accepted_block(bsp1->block_num); - trx_retry.on_irreversible_block(bsp1); + trx_retry.on_irreversible_block(bsp1->block, bsp1->block_num); BOOST_CHECK(!trx_1_expired); BOOST_CHECK(!trx_2_expired); // increase time by 3 seconds to expire first @@ -287,7 +287,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { auto bsp2 = make_block_state(2, {}); trx_retry.on_block_start(2); trx_retry.on_accepted_block(bsp2->block_num); - trx_retry.on_irreversible_block(bsp2); + trx_retry.on_irreversible_block(bsp2->block, bsp2->block_num); BOOST_CHECK(trx_1_expired); BOOST_CHECK(!trx_2_expired); // increase time by 2 seconds to expire second @@ -297,7 +297,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { auto bsp3 = make_block_state(3, {}); trx_retry.on_block_start(3); trx_retry.on_accepted_block(bsp3->block_num); - trx_retry.on_irreversible_block(bsp3); + trx_retry.on_irreversible_block(bsp3->block, bsp3->block_num); BOOST_CHECK(trx_1_expired); BOOST_CHECK(trx_2_expired); BOOST_CHECK_EQUAL(0u, trx_retry.size()); @@ -348,9 +348,9 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { auto bsp6 = make_block_state(6, {}); trx_retry.on_block_start(6); trx_retry.on_accepted_block(bsp6->block_num); - trx_retry.on_irreversible_block(bsp4); - trx_retry.on_irreversible_block(bsp5); - trx_retry.on_irreversible_block(bsp6); + trx_retry.on_irreversible_block(bsp4->block, bsp4->block_num); + trx_retry.on_irreversible_block(bsp5->block, bsp5->block_num); + trx_retry.on_irreversible_block(bsp6->block, bsp6->block_num); BOOST_CHECK(trx_3_expired); BOOST_CHECK(trx_4_expired); BOOST_CHECK_EQUAL(0u, trx_retry.size()); @@ -416,10 +416,10 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { trx_retry.on_accepted_block(bsp11->block_num); BOOST_CHECK(!trx_5_variant); BOOST_CHECK(trx_6_variant); - trx_retry.on_irreversible_block(bsp7); + trx_retry.on_irreversible_block(bsp7->block, bsp7->block_num); BOOST_CHECK(!trx_5_variant); BOOST_CHECK(trx_6_variant); - trx_retry.on_irreversible_block(bsp8); + trx_retry.on_irreversible_block(bsp8->block, bsp8->block_num); BOOST_CHECK(trx_5_variant); BOOST_CHECK(trx_6_variant); BOOST_CHECK_EQUAL(0u, trx_retry.size()); @@ -541,16 +541,16 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { BOOST_CHECK(!trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(!trx_9_expired); - trx_retry.on_irreversible_block(bsp9); - trx_retry.on_irreversible_block(bsp10); - trx_retry.on_irreversible_block(bsp11); - trx_retry.on_irreversible_block(bsp12); - trx_retry.on_irreversible_block(bsp13b); - trx_retry.on_irreversible_block(bsp14b); + trx_retry.on_irreversible_block(bsp9->block, bsp9->block_num); + trx_retry.on_irreversible_block(bsp10->block, bsp10->block_num); + trx_retry.on_irreversible_block(bsp11->block, bsp11->block_num); + trx_retry.on_irreversible_block(bsp12->block, bsp12->block_num); + trx_retry.on_irreversible_block(bsp13b->block, bsp13b->block_num); + trx_retry.on_irreversible_block(bsp14b->block, bsp14b->block_num); BOOST_CHECK(!trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(!trx_9_expired); - trx_retry.on_irreversible_block(bsp15b); + trx_retry.on_irreversible_block(bsp15b->block, bsp15b->block_num); BOOST_CHECK(trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(!trx_9_expired); @@ -560,11 +560,11 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { auto bsp19 = make_block_state(19, {}); trx_retry.on_block_start(19); trx_retry.on_accepted_block(bsp19->block_num); - trx_retry.on_irreversible_block(bsp15); - trx_retry.on_irreversible_block(bsp16); - trx_retry.on_irreversible_block(bsp17); - trx_retry.on_irreversible_block(bsp18); - trx_retry.on_irreversible_block(bsp19); + trx_retry.on_irreversible_block(bsp15->block, bsp15->block_num); + trx_retry.on_irreversible_block(bsp16->block, bsp16->block_num); + trx_retry.on_irreversible_block(bsp17->block, bsp17->block_num); + trx_retry.on_irreversible_block(bsp18->block, bsp18->block_num); + trx_retry.on_irreversible_block(bsp19->block, bsp19->block_num); BOOST_CHECK(trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(!trx_9_expired); @@ -577,7 +577,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { BOOST_CHECK(trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(!trx_9_expired); - trx_retry.on_irreversible_block(bsp20); + trx_retry.on_irreversible_block(bsp20->block, bsp20->block_num); BOOST_CHECK(trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(trx_9_expired); diff --git a/plugins/chain_plugin/trx_finality_status_processing.cpp b/plugins/chain_plugin/trx_finality_status_processing.cpp index 21559c5f6f..3ac42dbc3f 100644 --- a/plugins/chain_plugin/trx_finality_status_processing.cpp +++ b/plugins/chain_plugin/trx_finality_status_processing.cpp @@ -47,10 +47,10 @@ namespace eosio::chain_apis { trx_finality_status_processing::~trx_finality_status_processing() = default; - void trx_finality_status_processing::signal_irreversible_block( const chain::block_state_legacy_ptr& bsp ) { + void trx_finality_status_processing::signal_irreversible_block( const chain::signed_block_ptr& block, const chain::block_id_type& id ) { try { - _my->_irr_block_id = bsp->id; - _my->_irr_block_timestamp = bsp->block->timestamp; + _my->_irr_block_id = id; + _my->_irr_block_timestamp = block->timestamp; } FC_LOG_AND_DROP(("Failed to signal irreversible block for finality status")); } diff --git a/plugins/chain_plugin/trx_retry_db.cpp b/plugins/chain_plugin/trx_retry_db.cpp index 7d54105f05..c031b19a89 100644 --- a/plugins/chain_plugin/trx_retry_db.cpp +++ b/plugins/chain_plugin/trx_retry_db.cpp @@ -167,9 +167,9 @@ struct trx_retry_db_impl { retry_trxs(); } - void on_irreversible_block( const chain::block_state_legacy_ptr& bsp ) { - ack_ready_trxs_by_lib( bsp->block_num ); - clear_expired( bsp->block->timestamp ); + void on_irreversible_block( const chain::signed_block_ptr& block, uint32_t block_num ) { + ack_ready_trxs_by_lib( block_num ); + clear_expired( block->timestamp ); } private: @@ -327,9 +327,9 @@ void trx_retry_db::on_accepted_block( uint32_t block_num ) { } FC_LOG_AND_DROP(("trx retry accepted_block ERROR")); } -void trx_retry_db::on_irreversible_block(const chain::block_state_legacy_ptr& block ) { +void trx_retry_db::on_irreversible_block(const chain::signed_block_ptr& block, uint32_t block_num ) { try { - _impl->on_irreversible_block(block); + _impl->on_irreversible_block(block, block_num); } FC_LOG_AND_DROP(("trx retry irreversible_block ERROR")); } diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp index 9fff3aea18..159acbd299 100644 --- a/plugins/net_plugin/net_plugin.cpp +++ b/plugins/net_plugin/net_plugin.cpp @@ -532,7 +532,7 @@ namespace eosio { void on_accepted_block(); void transaction_ack(const std::pair&); - void on_irreversible_block( const block_state_legacy_ptr& block ); + void on_irreversible_block( const block_id_type& id, uint32_t block_num ); void start_expire_timer(); void start_monitors(); @@ -3897,8 +3897,8 @@ namespace eosio { } // called from application thread - void net_plugin_impl::on_irreversible_block( const block_state_legacy_ptr& block) { - fc_dlog( logger, "on_irreversible_block, blk num = ${num}, id = ${id}", ("num", block->block_num)("id", block->id) ); + void net_plugin_impl::on_irreversible_block( const block_id_type& id, uint32_t block_num) { + fc_dlog( logger, "on_irreversible_block, blk num = ${num}, id = ${id}", ("num", block_num)("id", id) ); update_chain_info(); } @@ -4291,8 +4291,9 @@ namespace eosio { cc.accepted_block.connect( [my = shared_from_this()]( std::tuple t ) { my->on_accepted_block(); } ); - cc.irreversible_block.connect( [my = shared_from_this()]( const block_state_legacy_ptr& s ) { - my->on_irreversible_block( s ); + cc.irreversible_block.connect( [my = shared_from_this()]( std::tuple t ) { + const auto& [ block, id, header, block_num ] = t; + my->on_irreversible_block( id, block_num ); } ); } diff --git a/plugins/producer_plugin/producer_plugin.cpp b/plugins/producer_plugin/producer_plugin.cpp index da206c6988..6795a9dfce 100644 --- a/plugins/producer_plugin/producer_plugin.cpp +++ b/plugins/producer_plugin/producer_plugin.cpp @@ -1332,15 +1332,17 @@ void producer_plugin_impl::plugin_startup() { _accepted_block_connection.emplace(chain.accepted_block.connect([this](std::tuple t) { const auto& [ block, id, header, block_num ] = t; on_block(block); - })); + })); _accepted_block_header_connection.emplace(chain.accepted_block_header.connect([this](std::tuple t) { const auto& block = std::get<0>(t); const auto& id = std::get<1>(t); const auto& producer = std::get<2>(t); on_block_header(producer, block_header::num_from_id(id), block->timestamp); })); - _irreversible_block_connection.emplace( - chain.irreversible_block.connect([this](const auto& bsp) { on_irreversible_block(bsp->block); })); + _irreversible_block_connection.emplace(chain.irreversible_block.connect([this](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + on_irreversible_block(block); + })); _block_start_connection.emplace(chain.block_start.connect([this, &chain](uint32_t bs) { try { diff --git a/plugins/test_control_plugin/test_control_plugin.cpp b/plugins/test_control_plugin/test_control_plugin.cpp index 15ed4cbf84..06d8e2885c 100644 --- a/plugins/test_control_plugin/test_control_plugin.cpp +++ b/plugins/test_control_plugin/test_control_plugin.cpp @@ -16,7 +16,7 @@ class test_control_plugin_impl { private: void accepted_block(const chain::block_id_type& id); - void applied_irreversible_block(const chain::block_state_legacy_ptr& bsp); + void applied_irreversible_block(const chain::block_id_type& id); void process_next_block_state_legacy(const chain::block_id_type& id); std::optional _accepted_block_connection; @@ -32,8 +32,9 @@ class test_control_plugin_impl { void test_control_plugin_impl::connect() { _irreversible_block_connection.emplace( - _chain.irreversible_block.connect( [&]( const chain::block_state_legacy_ptr& bs ) { - applied_irreversible_block( bs ); + _chain.irreversible_block.connect( [&]( std::tuple t ) { + const auto& [ block, id, header, block_num ] = t; + applied_irreversible_block( id ); } )); _accepted_block_connection = _chain.accepted_block.connect( [&]( std::tuple t ) { @@ -47,9 +48,9 @@ void test_control_plugin_impl::disconnect() { _irreversible_block_connection.reset(); } -void test_control_plugin_impl::applied_irreversible_block(const chain::block_state_legacy_ptr& bsp) { +void test_control_plugin_impl::applied_irreversible_block(const chain::block_id_type& id) { if (_track_lib) - process_next_block_state_legacy(bsp->id); + process_next_block_state_legacy(id); } void test_control_plugin_impl::accepted_block(const chain::block_id_type& id) { diff --git a/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp b/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp index 294ecd2a1c..83c14043fd 100644 --- a/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp +++ b/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp @@ -36,8 +36,8 @@ class chain_extraction_impl_type { } /// connect to chain controller irreversible_block signal - void signal_irreversible_block( const chain::block_state_legacy_ptr& bsp ) { - on_irreversible_block( bsp ); + void signal_irreversible_block( uint32_t block_num ) { + on_irreversible_block( block_num ); } /// connect to chain controller block_start signal @@ -67,8 +67,8 @@ class chain_extraction_impl_type { store_block_trace( block, id, block_num ); } - void on_irreversible_block( const chain::block_state_legacy_ptr& block_state ) { - store_lib( block_state ); + void on_irreversible_block( uint32_t block_num ) { + store_lib( block_num ); } void on_block_start( uint32_t block_num ) { @@ -117,9 +117,9 @@ class chain_extraction_impl_type { } } - void store_lib( const chain::block_state_legacy_ptr& bsp ) { + void store_lib( uint32_t block_num ) { try { - store.append_lib( bsp->block_num ); + store.append_lib( block_num ); } catch( ... ) { except_handler( MAKE_EXCEPTION_WITH_CONTEXT( std::current_exception() ) ); } diff --git a/plugins/trace_api_plugin/trace_api_plugin.cpp b/plugins/trace_api_plugin/trace_api_plugin.cpp index f8bddd91c2..6528577d18 100644 --- a/plugins/trace_api_plugin/trace_api_plugin.cpp +++ b/plugins/trace_api_plugin/trace_api_plugin.cpp @@ -385,9 +385,10 @@ struct trace_api_plugin_impl { })); irreversible_block_connection.emplace( - chain.irreversible_block.connect([this](const chain::block_state_legacy_ptr& p) { + chain.irreversible_block.connect([this](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; emit_killer([&](){ - extraction->signal_irreversible_block(p); + extraction->signal_irreversible_block(block_num); }); })); From 28dccf939a494e61791a21489e65a704354ccace Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Sun, 17 Dec 2023 11:30:52 -0500 Subject: [PATCH 05/19] remove unneeded block_state_legacy.hpp includes --- .../include/eosio/state_history/trace_converter.hpp | 1 - .../include/eosio/chain_plugin/account_query_db.hpp | 1 - .../include/eosio/state_history_plugin/session.hpp | 1 - plugins/test_control_plugin/test_control_plugin.cpp | 8 ++++---- .../include/eosio/trace_api/extract_util.hpp | 1 - 5 files changed, 4 insertions(+), 8 deletions(-) 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 f71bc555c6..4cc6bef7cd 100644 --- a/libraries/state_history/include/eosio/state_history/trace_converter.hpp +++ b/libraries/state_history/include/eosio/state_history/trace_converter.hpp @@ -6,7 +6,6 @@ namespace eosio { namespace state_history { -using chain::block_state_legacy_ptr; using chain::transaction_id_type; struct trace_converter { diff --git a/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp b/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp index c5eaabdb2f..215d140b55 100644 --- a/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp +++ b/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp @@ -1,6 +1,5 @@ #pragma once #include -#include #include namespace eosio::chain_apis { diff --git a/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp b/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp index 6a2449e844..358a5aae13 100644 --- a/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp +++ b/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp @@ -1,5 +1,4 @@ #pragma once -#include #include #include #include diff --git a/plugins/test_control_plugin/test_control_plugin.cpp b/plugins/test_control_plugin/test_control_plugin.cpp index 06d8e2885c..804ef267e3 100644 --- a/plugins/test_control_plugin/test_control_plugin.cpp +++ b/plugins/test_control_plugin/test_control_plugin.cpp @@ -17,7 +17,7 @@ class test_control_plugin_impl { private: void accepted_block(const chain::block_id_type& id); void applied_irreversible_block(const chain::block_id_type& id); - void process_next_block_state_legacy(const chain::block_id_type& id); + void process_next_block_state(const chain::block_id_type& id); std::optional _accepted_block_connection; std::optional _irreversible_block_connection; @@ -50,15 +50,15 @@ void test_control_plugin_impl::disconnect() { void test_control_plugin_impl::applied_irreversible_block(const chain::block_id_type& id) { if (_track_lib) - process_next_block_state_legacy(id); + process_next_block_state(id); } void test_control_plugin_impl::accepted_block(const chain::block_id_type& id) { if (_track_head) - process_next_block_state_legacy(id); + process_next_block_state(id); } -void test_control_plugin_impl::process_next_block_state_legacy(const chain::block_id_type& id) { +void test_control_plugin_impl::process_next_block_state(const chain::block_id_type& id) { // Tests expect the shutdown only after signaling a producer shutdown and seeing a full production cycle const auto block_time = _chain.head_block_time() + fc::microseconds(chain::config::block_interval_us); // have to fetch bsp due to get_scheduled_producer call diff --git a/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp b/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp index 37384fc0ae..eb17036874 100644 --- a/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp +++ b/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include namespace eosio { namespace trace_api { From 87e3906c8aa5aecbd6e2f7c910e7d65231f18aa6 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Sun, 17 Dec 2023 13:14:07 -0500 Subject: [PATCH 06/19] use structured binding for applied_transaction_connection --- plugins/chain_plugin/chain_plugin.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index 36afdb8dfc..f83da3470d 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -1051,19 +1051,20 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { applied_transaction_connection = chain->applied_transaction.connect( [this]( std::tuple t ) { + const auto& [ trace, ptrx ] = t; if (_account_query_db) { - _account_query_db->cache_transaction_trace(std::get<0>(t)); + _account_query_db->cache_transaction_trace(trace); } if (_trx_retry_db) { - _trx_retry_db->on_applied_transaction(std::get<0>(t), std::get<1>(t)); + _trx_retry_db->on_applied_transaction(trace, ptrx); } if (_trx_finality_status_processing) { - _trx_finality_status_processing->signal_applied_transaction(std::get<0>(t), std::get<1>(t)); + _trx_finality_status_processing->signal_applied_transaction(trace, ptrx); } - applied_transaction_channel.publish( priority::low, std::get<0>(t) ); + applied_transaction_channel.publish( priority::low, trace ); } ); if (_trx_finality_status_processing || _trx_retry_db) { From 93499d7d77b9f645ee3f0c00d9945de43a39448d Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Sun, 17 Dec 2023 14:00:56 -0500 Subject: [PATCH 07/19] refine accepted_block_header signal --- libraries/chain/controller.cpp | 6 +++--- libraries/chain/include/eosio/chain/controller.hpp | 2 +- .../include/eosio/chain/plugin_interface.hpp | 2 +- plugins/chain_plugin/chain_plugin.cpp | 2 +- plugins/net_plugin/net_plugin.cpp | 13 +++++++------ plugins/producer_plugin/producer_plugin.cpp | 8 +++----- 6 files changed, 16 insertions(+), 17 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 028a455efb..b96ae2240e 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -1951,7 +1951,7 @@ struct controller_impl { if( s == controller::block_status::incomplete ) { fork_db.add( bsp ); fork_db.mark_valid( bsp ); - emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header.producer) ); + emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header, bsp->block_num) ); EOS_ASSERT( bsp == fork_db.head(), fork_database_exception, "committed block did not become the new head in fork database"); } else if (s != controller::block_status::irreversible) { fork_db.mark_valid( bsp ); @@ -2265,7 +2265,7 @@ struct controller_impl { trusted_producer_light_validation = true; }; - emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header.producer) ); + emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header, bsp->block_num) ); if( read_mode != db_read_mode::IRREVERSIBLE ) { maybe_switch_forks( br, fork_db.pending_head(), s, forked_branch_cb, trx_lookup ); @@ -2309,7 +2309,7 @@ struct controller_impl { fork_db.add( bsp, true ); } - emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header.producer) ); + emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header, bsp->block_num) ); controller::block_report br; if( s == controller::block_status::irreversible ) { diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index 342bbaa725..01fb7afdac 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -327,7 +327,7 @@ namespace eosio { namespace chain { static std::optional convert_exception_to_error_code( const fc::exception& e ); signal block_start; - signal)> accepted_block_header; + signal)> accepted_block_header; signal)> accepted_block; signal)> irreversible_block; signal accepted_transaction; diff --git a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp index 69cb94a436..f21859d901 100644 --- a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp +++ b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp @@ -15,7 +15,7 @@ namespace eosio::chain::plugin_interface { namespace channels { using rejected_block = channel_decl; - using accepted_block_header = channel_decl>; + using accepted_block_header = channel_decl>; using accepted_block = channel_decl>; using irreversible_block = channel_decl>; using applied_transaction = channel_decl; diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index f83da3470d..188c5bcaa7 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -1014,7 +1014,7 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { // relay signals to channels accepted_block_header_connection = chain->accepted_block_header.connect( - [this]( std::tuple t ) { + [this]( std::tuple t ) { accepted_block_header_channel.publish( priority::medium, t ); } ); diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp index 159acbd299..2fe4953786 100644 --- a/plugins/net_plugin/net_plugin.cpp +++ b/plugins/net_plugin/net_plugin.cpp @@ -528,7 +528,7 @@ namespace eosio { uint32_t get_chain_lib_num() const; uint32_t get_chain_head_num() const; - void on_accepted_block_header( const signed_block_ptr& block, const block_id_type& id ); + void on_accepted_block_header( const signed_block_ptr& block, const block_id_type& id, uint32_t block_num ); void on_accepted_block(); void transaction_ack(const std::pair&); @@ -3882,11 +3882,11 @@ namespace eosio { } // called from application thread - void net_plugin_impl::on_accepted_block_header(const signed_block_ptr& block, const block_id_type& id) { + void net_plugin_impl::on_accepted_block_header(const signed_block_ptr& block, const block_id_type& id, uint32_t block_num) { update_chain_info(); - dispatcher->strand.post([block, id]() { - fc_dlog(logger, "signaled accepted_block_header, blk num = ${num}, id = ${id}", ("num", block_header::num_from_id(id))("id", id)); + dispatcher->strand.post([block, id, block_num]() { + fc_dlog(logger, "signaled accepted_block_header, blk num = ${num}, id = ${id}", ("num", block_num)("id", id)); my_impl->dispatcher->bcast_block(block, id); }); } @@ -4284,8 +4284,9 @@ namespace eosio { { chain::controller& cc = chain_plug->chain(); - cc.accepted_block_header.connect( [my = shared_from_this()]( std::tuple t ) { - my->on_accepted_block_header( std::get<0>(t), std::get<1>(t) ); + cc.accepted_block_header.connect( [my = shared_from_this()]( std::tuple t ) { + const auto& [ block, id, header, block_num ] = t; + my->on_accepted_block_header( block, id, block_num ); } ); cc.accepted_block.connect( [my = shared_from_this()]( std::tuple t ) { diff --git a/plugins/producer_plugin/producer_plugin.cpp b/plugins/producer_plugin/producer_plugin.cpp index 6795a9dfce..dc3625b46b 100644 --- a/plugins/producer_plugin/producer_plugin.cpp +++ b/plugins/producer_plugin/producer_plugin.cpp @@ -1333,11 +1333,9 @@ void producer_plugin_impl::plugin_startup() { const auto& [ block, id, header, block_num ] = t; on_block(block); })); - _accepted_block_header_connection.emplace(chain.accepted_block_header.connect([this](std::tuple t) { - const auto& block = std::get<0>(t); - const auto& id = std::get<1>(t); - const auto& producer = std::get<2>(t); - on_block_header(producer, block_header::num_from_id(id), block->timestamp); + _accepted_block_header_connection.emplace(chain.accepted_block_header.connect([this](std::tuple t) { + const auto& [ block, id, header, block_num ] = t; + on_block_header(header.producer, block_num, block->timestamp); })); _irreversible_block_connection.emplace(chain.irreversible_block.connect([this](std::tuple t) { const auto& [ block, id, header, block_num ] = t; From 0799e673ab9944b372fb9e3bd7a1efe2208b3710 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Sun, 17 Dec 2023 14:23:06 -0500 Subject: [PATCH 08/19] remove signed_block_header from irreversible_block signal --- libraries/chain/controller.cpp | 8 ++++---- libraries/chain/include/eosio/chain/controller.hpp | 2 +- .../include/eosio/chain/plugin_interface.hpp | 2 +- plugins/chain_plugin/chain_plugin.cpp | 4 ++-- plugins/net_plugin/net_plugin.cpp | 4 ++-- plugins/producer_plugin/producer_plugin.cpp | 4 ++-- plugins/test_control_plugin/test_control_plugin.cpp | 4 ++-- plugins/trace_api_plugin/trace_api_plugin.cpp | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index b96ae2240e..6a3a2ece6d 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -342,8 +342,8 @@ struct controller_impl { set_activation_handler(); set_activation_handler(); - self.irreversible_block.connect([this](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; + self.irreversible_block.connect([this](std::tuple t) { + const auto& [ block, id, block_num ] = t; wasmif.current_lib(block_num); }); @@ -449,7 +449,7 @@ struct controller_impl { apply_block( br, *bitr, controller::block_status::complete, trx_meta_cache_lookup{} ); } - emit( self.irreversible_block, std::tie((*bitr)->block, (*bitr)->id, (*bitr)->header, (*bitr)->block_num) ); + emit( self.irreversible_block, std::tie((*bitr)->block, (*bitr)->id, (*bitr)->block_num) ); // blog.append could fail due to failures like running out of space. // Do it before commit so that in case it throws, DB can be rolled back. @@ -2317,7 +2317,7 @@ struct controller_impl { // On replay, log_irreversible is not called and so no irreversible_block signal is emitted. // So emit it explicitly here. - emit( self.irreversible_block, std::tie(bsp->block, bsp->id, bsp->header, bsp->block_num) ); + emit( self.irreversible_block, std::tie(bsp->block, bsp->id, bsp->block_num) ); if (!self.skip_db_sessions(s)) { db.commit(bsp->block_num); diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index 01fb7afdac..a42eaf6249 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -329,7 +329,7 @@ namespace eosio { namespace chain { signal block_start; signal)> accepted_block_header; signal)> accepted_block; - signal)> irreversible_block; + signal)> irreversible_block; signal accepted_transaction; signal)> applied_transaction; diff --git a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp index f21859d901..82743134df 100644 --- a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp +++ b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp @@ -17,7 +17,7 @@ namespace eosio::chain::plugin_interface { using rejected_block = channel_decl; using accepted_block_header = channel_decl>; using accepted_block = channel_decl>; - using irreversible_block = channel_decl>; + using irreversible_block = channel_decl>; using applied_transaction = channel_decl; } diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index 188c5bcaa7..bf57fbea21 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -1035,8 +1035,8 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { accepted_block_channel.publish( priority::high, t ); } ); - irreversible_block_connection = chain->irreversible_block.connect( [this]( std::tuple t ) { - const auto& [ block, id, header, block_num ] = t; + irreversible_block_connection = chain->irreversible_block.connect( [this]( std::tuple t ) { + const auto& [ block, id, block_num ] = t; if (_trx_retry_db) { _trx_retry_db->on_irreversible_block(block, block_num); diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp index 2fe4953786..ba94b597fe 100644 --- a/plugins/net_plugin/net_plugin.cpp +++ b/plugins/net_plugin/net_plugin.cpp @@ -4292,8 +4292,8 @@ namespace eosio { cc.accepted_block.connect( [my = shared_from_this()]( std::tuple t ) { my->on_accepted_block(); } ); - cc.irreversible_block.connect( [my = shared_from_this()]( std::tuple t ) { - const auto& [ block, id, header, block_num ] = t; + cc.irreversible_block.connect( [my = shared_from_this()]( std::tuple t ) { + const auto& [ block, id, block_num ] = t; my->on_irreversible_block( id, block_num ); } ); } diff --git a/plugins/producer_plugin/producer_plugin.cpp b/plugins/producer_plugin/producer_plugin.cpp index dc3625b46b..403e3078ef 100644 --- a/plugins/producer_plugin/producer_plugin.cpp +++ b/plugins/producer_plugin/producer_plugin.cpp @@ -1337,8 +1337,8 @@ void producer_plugin_impl::plugin_startup() { const auto& [ block, id, header, block_num ] = t; on_block_header(header.producer, block_num, block->timestamp); })); - _irreversible_block_connection.emplace(chain.irreversible_block.connect([this](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; + _irreversible_block_connection.emplace(chain.irreversible_block.connect([this](std::tuple t) { + const auto& [ block, id, block_num ] = t; on_irreversible_block(block); })); diff --git a/plugins/test_control_plugin/test_control_plugin.cpp b/plugins/test_control_plugin/test_control_plugin.cpp index 804ef267e3..dbfbed3489 100644 --- a/plugins/test_control_plugin/test_control_plugin.cpp +++ b/plugins/test_control_plugin/test_control_plugin.cpp @@ -32,8 +32,8 @@ class test_control_plugin_impl { void test_control_plugin_impl::connect() { _irreversible_block_connection.emplace( - _chain.irreversible_block.connect( [&]( std::tuple t ) { - const auto& [ block, id, header, block_num ] = t; + _chain.irreversible_block.connect( [&]( std::tuple t ) { + const auto& [ block, id, block_num ] = t; applied_irreversible_block( id ); } )); _accepted_block_connection = diff --git a/plugins/trace_api_plugin/trace_api_plugin.cpp b/plugins/trace_api_plugin/trace_api_plugin.cpp index 6528577d18..30958ba802 100644 --- a/plugins/trace_api_plugin/trace_api_plugin.cpp +++ b/plugins/trace_api_plugin/trace_api_plugin.cpp @@ -385,8 +385,8 @@ struct trace_api_plugin_impl { })); irreversible_block_connection.emplace( - chain.irreversible_block.connect([this](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; + chain.irreversible_block.connect([this](std::tuple t) { + const auto& [ block, id, block_num ] = t; emit_killer([&](){ extraction->signal_irreversible_block(block_num); }); From 22cec2c3bfc4925fe81c4290c3906e524c345dc6 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Sun, 17 Dec 2023 14:41:40 -0500 Subject: [PATCH 09/19] restore commented out first_block->verify_signee in forked_tests --- unittests/forked_tests.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/unittests/forked_tests.cpp b/unittests/forked_tests.cpp index 8c6710b09c..2a32835cc4 100644 --- a/unittests/forked_tests.cpp +++ b/unittests/forked_tests.cpp @@ -352,11 +352,13 @@ BOOST_AUTO_TEST_CASE( validator_accepts_valid_blocks ) try { auto id = n1.control->head_block_id(); signed_block_ptr first_block; + block_id_type first_id; signed_block_header first_header; auto c = n2.control->accepted_block.connect( [&]( std::tuple t ) { const auto& [ block, id, header, block_num ] = t; first_block = block; + first_id = id; first_header = header; } ); @@ -365,7 +367,8 @@ BOOST_AUTO_TEST_CASE( validator_accepts_valid_blocks ) try { BOOST_CHECK_EQUAL( n2.control->head_block_id(), id ); BOOST_REQUIRE( first_block ); - // WARNING first_block->verify_signee(); + const auto& first_bsp = n2.control->fetch_block_state_by_id(first_id); + first_bsp->verify_signee(); BOOST_CHECK_EQUAL( first_header.calculate_id(), first_block->calculate_id() ); BOOST_CHECK( first_header.producer_signature == first_block->producer_signature ); From 7a018f6a51ecbe5b14e0492bd6cd3d1f4118ee60 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Sun, 17 Dec 2023 16:01:17 -0500 Subject: [PATCH 10/19] update comments --- plugins/chain_plugin/account_query_db.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/chain_plugin/account_query_db.cpp b/plugins/chain_plugin/account_query_db.cpp index 61f1eed543..610b6bec27 100644 --- a/plugins/chain_plugin/account_query_db.cpp +++ b/plugins/chain_plugin/account_query_db.cpp @@ -231,7 +231,9 @@ namespace eosio::chain_apis { * * For each removed entry, this will create a new entry if there exists an equivalent {owner, name} permission * at the HEAD state of the chain. - * @param bsp - the block to rollback before + * @param block - the block to rollback before + * @param header - the block header + * @param block_num - the block number */ void rollback_to_before( const chain::signed_block_ptr block, const chain::signed_block_header& header, uint32_t block_num ) { const auto bnum = block->block_num(); @@ -303,7 +305,7 @@ namespace eosio::chain_apis { /** * Pre-Commit step with const qualifier to guarantee it does not mutate * the thread-safe data set - * @param bsp + * @param block */ auto commit_block_prelock( const chain::signed_block_ptr block ) const { permission_set_t updated; @@ -358,7 +360,9 @@ namespace eosio::chain_apis { /** * Commit a block of transactions to the account query DB * transaction traces need to be in the cache prior to this call - * @param bsp + * @param block + * @param header + * @param block_num */ void commit_block(const chain::signed_block_ptr& block, const chain::signed_block_header& header, uint32_t block_num ) { permission_set_t updated; From 7c4ca8a5df4d7b5438c03663ddbbb1ad9951b8d0 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Mon, 18 Dec 2023 13:34:46 -0500 Subject: [PATCH 11/19] do not emit signed_block_header and block_num; use a single block_signal_params type --- libraries/chain/controller.cpp | 18 +++++------ .../chain/include/eosio/chain/controller.hpp | 10 ++++--- libraries/testing/tester.cpp | 4 +-- .../include/eosio/chain/plugin_interface.hpp | 6 ++-- plugins/chain_plugin/chain_plugin.cpp | 16 +++++----- .../test/test_account_query_db.cpp | 30 +++++++++---------- plugins/net_plugin/net_plugin.cpp | 14 ++++----- plugins/producer_plugin/producer_plugin.cpp | 14 ++++----- .../producer_plugin/test/test_trx_full.cpp | 4 +-- .../state_history_plugin.cpp | 6 ++-- .../test_control_plugin.cpp | 8 ++--- plugins/trace_api_plugin/trace_api_plugin.cpp | 12 ++++---- unittests/api_tests.cpp | 4 +-- unittests/block_tests.cpp | 8 ++--- unittests/chain_tests.cpp | 10 ++++--- unittests/forked_tests.cpp | 10 +++---- unittests/state_history_tests.cpp | 6 ++-- 17 files changed, 92 insertions(+), 88 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 6a3a2ece6d..d4029a9ce5 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -342,9 +342,9 @@ struct controller_impl { set_activation_handler(); set_activation_handler(); - self.irreversible_block.connect([this](std::tuple t) { - const auto& [ block, id, block_num ] = t; - wasmif.current_lib(block_num); + self.irreversible_block.connect([this](block_signal_params t) { + const auto& [ block, id] = t; + wasmif.current_lib(block->block_num()); }); @@ -449,7 +449,7 @@ struct controller_impl { apply_block( br, *bitr, controller::block_status::complete, trx_meta_cache_lookup{} ); } - emit( self.irreversible_block, std::tie((*bitr)->block, (*bitr)->id, (*bitr)->block_num) ); + emit( self.irreversible_block, std::tie((*bitr)->block, (*bitr)->id) ); // blog.append could fail due to failures like running out of space. // Do it before commit so that in case it throws, DB can be rolled back. @@ -1951,7 +1951,7 @@ struct controller_impl { if( s == controller::block_status::incomplete ) { fork_db.add( bsp ); fork_db.mark_valid( bsp ); - emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header, bsp->block_num) ); + emit( self.accepted_block_header, std::tie(bsp->block, bsp->id) ); EOS_ASSERT( bsp == fork_db.head(), fork_database_exception, "committed block did not become the new head in fork database"); } else if (s != controller::block_status::irreversible) { fork_db.mark_valid( bsp ); @@ -1963,7 +1963,7 @@ struct controller_impl { dm_logger->on_accepted_block(bsp); } - emit( self.accepted_block, std::tie(bsp->block, bsp->id, bsp->header, bsp->block_num) ); + emit( self.accepted_block, std::tie(bsp->block, bsp->id) ); if( s == controller::block_status::incomplete ) { log_irreversible(); @@ -2265,7 +2265,7 @@ struct controller_impl { trusted_producer_light_validation = true; }; - emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header, bsp->block_num) ); + emit( self.accepted_block_header, std::tie(bsp->block, bsp->id) ); if( read_mode != db_read_mode::IRREVERSIBLE ) { maybe_switch_forks( br, fork_db.pending_head(), s, forked_branch_cb, trx_lookup ); @@ -2309,7 +2309,7 @@ struct controller_impl { fork_db.add( bsp, true ); } - emit( self.accepted_block_header, std::tie(bsp->block, bsp->id, bsp->header, bsp->block_num) ); + emit( self.accepted_block_header, std::tie(bsp->block, bsp->id) ); controller::block_report br; if( s == controller::block_status::irreversible ) { @@ -2317,7 +2317,7 @@ struct controller_impl { // On replay, log_irreversible is not called and so no irreversible_block signal is emitted. // So emit it explicitly here. - emit( self.irreversible_block, std::tie(bsp->block, bsp->id, bsp->block_num) ); + emit( self.irreversible_block, std::tie(bsp->block, bsp->id) ); if (!self.skip_db_sessions(s)) { db.commit(bsp->block_num); diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index a42eaf6249..2012ca4c1c 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -44,6 +44,8 @@ namespace eosio { namespace chain { // lookup transaction_metadata via supplied function to avoid re-creation using trx_meta_cache_lookup = std::function; + using block_signal_params = std::tuple; + class fork_database; enum class db_read_mode { @@ -326,10 +328,10 @@ namespace eosio { namespace chain { static std::optional convert_exception_to_error_code( const fc::exception& e ); - signal block_start; - signal)> accepted_block_header; - signal)> accepted_block; - signal)> irreversible_block; + signal block_start; + signal accepted_block_header; + signal accepted_block; + signal irreversible_block; signal accepted_transaction; signal)> applied_transaction; diff --git a/libraries/testing/tester.cpp b/libraries/testing/tester.cpp index d2d684f2aa..51672db7ad 100644 --- a/libraries/testing/tester.cpp +++ b/libraries/testing/tester.cpp @@ -321,8 +321,8 @@ namespace eosio { namespace testing { control->add_indices(); if (lambda) lambda(); chain_transactions.clear(); - control->accepted_block.connect([this]( std::tuple t ){ - const auto& [ block, id, header, block_num ] = t; + control->accepted_block.connect([this]( block_signal_params t ){ + const auto& [ block, id ] = t; FC_ASSERT( block ); for( auto receipt : block->transactions ) { if( std::holds_alternative(receipt.trx) ) { diff --git a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp index 82743134df..4fe1c247d4 100644 --- a/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp +++ b/plugins/chain_interface/include/eosio/chain/plugin_interface.hpp @@ -15,9 +15,9 @@ namespace eosio::chain::plugin_interface { namespace channels { using rejected_block = channel_decl; - using accepted_block_header = channel_decl>; - using accepted_block = channel_decl>; - using irreversible_block = channel_decl>; + using accepted_block_header = channel_decl; + using accepted_block = channel_decl; + using irreversible_block = channel_decl; using applied_transaction = channel_decl; } diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index bf57fbea21..da9127649c 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -1014,18 +1014,18 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { // relay signals to channels accepted_block_header_connection = chain->accepted_block_header.connect( - [this]( std::tuple t ) { + [this]( block_signal_params t ) { accepted_block_header_channel.publish( priority::medium, t ); } ); - accepted_block_connection = chain->accepted_block.connect( [this]( std::tuple t ) { - const auto& [ block, id, header, block_num ] = t; + accepted_block_connection = chain->accepted_block.connect( [this]( block_signal_params t ) { + const auto& [ block, id ] = t; if (_account_query_db) { - _account_query_db->commit_block(block, header, block_num); + _account_query_db->commit_block(block, static_cast(*block), block->block_num()); } if (_trx_retry_db) { - _trx_retry_db->on_accepted_block(block_num); + _trx_retry_db->on_accepted_block(block->block_num()); } if (_trx_finality_status_processing) { @@ -1035,11 +1035,11 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { accepted_block_channel.publish( priority::high, t ); } ); - irreversible_block_connection = chain->irreversible_block.connect( [this]( std::tuple t ) { - const auto& [ block, id, block_num ] = t; + irreversible_block_connection = chain->irreversible_block.connect( [this]( block_signal_params t ) { + const auto& [ block, id ] = t; if (_trx_retry_db) { - _trx_retry_db->on_irreversible_block(block, block_num); + _trx_retry_db->on_irreversible_block(block, block->block_num()); } if (_trx_finality_status_processing) { diff --git a/plugins/chain_plugin/test/test_account_query_db.cpp b/plugins/chain_plugin/test/test_account_query_db.cpp index 9a83d52555..52e89e74ed 100644 --- a/plugins/chain_plugin/test/test_account_query_db.cpp +++ b/plugins/chain_plugin/test/test_account_query_db.cpp @@ -37,9 +37,9 @@ BOOST_FIXTURE_TEST_CASE(newaccount_test, validating_tester) { try { auto aq_db = account_query_db(*control); //link aq_db to the `accepted_block` signal on the controller - auto c2 = control->accepted_block.connect([&](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; - aq_db.commit_block( block, header, block_num ); + auto c2 = control->accepted_block.connect([&](block_signal_params t) { + const auto& [ block, id ] = t; + aq_db.commit_block( block, static_cast(*block), block->block_num() ); }); produce_blocks(10); @@ -63,9 +63,9 @@ BOOST_FIXTURE_TEST_CASE(updateauth_test, validating_tester) { try { auto aq_db = account_query_db(*control); //link aq_db to the `accepted_block` signal on the controller - auto c = control->accepted_block.connect([&](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; - aq_db.commit_block( block, header, block_num ); + auto c = control->accepted_block.connect([&](block_signal_params t) { + const auto& [ block, id ] = t; + aq_db.commit_block( block, static_cast(*block), block->block_num() ); }); produce_blocks(10); @@ -98,9 +98,9 @@ BOOST_FIXTURE_TEST_CASE(updateauth_test_multi_threaded, validating_tester) { try auto aq_db = account_query_db(*control); //link aq_db to the `accepted_block` signal on the controller - auto c = control->accepted_block.connect([&](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; - aq_db.commit_block( block, header, block_num ); + auto c = control->accepted_block.connect([&](block_signal_params t) { + const auto& [ block, id ] = t; + aq_db.commit_block( block, static_cast(*block), block->block_num() ); }); produce_blocks(10); @@ -151,9 +151,9 @@ BOOST_AUTO_TEST_CASE(future_fork_test) { try { auto aq_db = account_query_db(*node_a.control); //link aq_db to the `accepted_block` signal on the controller - auto c = node_a.control->accepted_block.connect([&](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; - aq_db.commit_block( block, header, block_num ); + auto c = node_a.control->accepted_block.connect([&](block_signal_params t) { + const auto& [ block, id ] = t; + aq_db.commit_block( block, static_cast(*block), block->block_num() ); }); // create 10 blocks synced @@ -199,9 +199,9 @@ BOOST_AUTO_TEST_CASE(fork_test) { try { auto aq_db = account_query_db(*node_a.control); //link aq_db to the `accepted_block` signal on the controller - auto c = node_a.control->accepted_block.connect([&](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; - aq_db.commit_block( block, header, block_num ); + auto c = node_a.control->accepted_block.connect([&](block_signal_params t) { + const auto& [ block, id ] = t; + aq_db.commit_block( block, static_cast(*block), block->block_num() ); }); // create 10 blocks synced diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp index ba94b597fe..c04f4ad57d 100644 --- a/plugins/net_plugin/net_plugin.cpp +++ b/plugins/net_plugin/net_plugin.cpp @@ -4284,17 +4284,17 @@ namespace eosio { { chain::controller& cc = chain_plug->chain(); - cc.accepted_block_header.connect( [my = shared_from_this()]( std::tuple t ) { - const auto& [ block, id, header, block_num ] = t; - my->on_accepted_block_header( block, id, block_num ); + cc.accepted_block_header.connect( [my = shared_from_this()]( block_signal_params t ) { + const auto& [ block, id ] = t; + my->on_accepted_block_header( block, id, block->block_num() ); } ); - cc.accepted_block.connect( [my = shared_from_this()]( std::tuple t ) { + cc.accepted_block.connect( [my = shared_from_this()]( block_signal_params t ) { my->on_accepted_block(); } ); - cc.irreversible_block.connect( [my = shared_from_this()]( std::tuple t ) { - const auto& [ block, id, block_num ] = t; - my->on_irreversible_block( id, block_num ); + cc.irreversible_block.connect( [my = shared_from_this()]( block_signal_params t ) { + const auto& [ block, id ] = t; + my->on_irreversible_block( id, block->block_num() ); } ); } diff --git a/plugins/producer_plugin/producer_plugin.cpp b/plugins/producer_plugin/producer_plugin.cpp index 403e3078ef..218d9fb79b 100644 --- a/plugins/producer_plugin/producer_plugin.cpp +++ b/plugins/producer_plugin/producer_plugin.cpp @@ -1329,16 +1329,16 @@ void producer_plugin_impl::plugin_startup() { EOS_ASSERT(_producers.empty() || chain_plug->accept_transactions(), plugin_config_exception, "node cannot have any producer-name configured because no block production is possible with no [api|p2p]-accepted-transactions"); - _accepted_block_connection.emplace(chain.accepted_block.connect([this](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; + _accepted_block_connection.emplace(chain.accepted_block.connect([this](block_signal_params t) { + const auto& [ block, id ] = t; on_block(block); })); - _accepted_block_header_connection.emplace(chain.accepted_block_header.connect([this](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; - on_block_header(header.producer, block_num, block->timestamp); + _accepted_block_header_connection.emplace(chain.accepted_block_header.connect([this](block_signal_params t) { + const auto& [ block, id ] = t; + on_block_header(static_cast(*block).producer, block->block_num(), block->timestamp); })); - _irreversible_block_connection.emplace(chain.irreversible_block.connect([this](std::tuple t) { - const auto& [ block, id, block_num ] = t; + _irreversible_block_connection.emplace(chain.irreversible_block.connect([this](block_signal_params t) { + const auto& [ block, id ] = t; on_irreversible_block(block); })); diff --git a/plugins/producer_plugin/test/test_trx_full.cpp b/plugins/producer_plugin/test/test_trx_full.cpp index c91e03f9b6..be1d39edd6 100644 --- a/plugins/producer_plugin/test/test_trx_full.cpp +++ b/plugins/producer_plugin/test/test_trx_full.cpp @@ -129,8 +129,8 @@ BOOST_AUTO_TEST_CASE(producer) { std::deque all_blocks; std::promise empty_blocks_promise; std::future empty_blocks_fut = empty_blocks_promise.get_future(); - auto ab = chain_plug->chain().accepted_block.connect( [&](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; + auto ab = chain_plug->chain().accepted_block.connect( [&](chain::block_signal_params t) { + const auto& [ block, id ] = t; static int num_empty = std::numeric_limits::max(); all_blocks.push_back( block ); if( block->transactions.empty() ) { diff --git a/plugins/state_history_plugin/state_history_plugin.cpp b/plugins/state_history_plugin/state_history_plugin.cpp index 75b4dd66bb..256c1d19ac 100644 --- a/plugins/state_history_plugin/state_history_plugin.cpp +++ b/plugins/state_history_plugin/state_history_plugin.cpp @@ -329,9 +329,9 @@ void state_history_plugin_impl::plugin_initialize(const variables_map& options) on_applied_transaction(std::get<0>(t), std::get<1>(t)); })); accepted_block_connection.emplace( - chain.accepted_block.connect([&](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; - on_accepted_block(block, id, header, block_num); + chain.accepted_block.connect([&](block_signal_params t) { + const auto& [ block, id ] = t; + on_accepted_block(block, id, static_cast(*block), block->block_num()); })); block_start_connection.emplace( chain.block_start.connect([&](uint32_t block_num) { on_block_start(block_num); })); diff --git a/plugins/test_control_plugin/test_control_plugin.cpp b/plugins/test_control_plugin/test_control_plugin.cpp index dbfbed3489..261518a00d 100644 --- a/plugins/test_control_plugin/test_control_plugin.cpp +++ b/plugins/test_control_plugin/test_control_plugin.cpp @@ -32,13 +32,13 @@ class test_control_plugin_impl { void test_control_plugin_impl::connect() { _irreversible_block_connection.emplace( - _chain.irreversible_block.connect( [&]( std::tuple t ) { - const auto& [ block, id, block_num ] = t; + _chain.irreversible_block.connect( [&]( chain::block_signal_params t ) { + const auto& [ block, id ] = t; applied_irreversible_block( id ); } )); _accepted_block_connection = - _chain.accepted_block.connect( [&]( std::tuple t ) { - const auto& [ block, id, header, block_num ] = t; + _chain.accepted_block.connect( [&]( chain::block_signal_params t ) { + const auto& [ block, id ] = t; accepted_block( id ); } ); } diff --git a/plugins/trace_api_plugin/trace_api_plugin.cpp b/plugins/trace_api_plugin/trace_api_plugin.cpp index 30958ba802..8e054cce0d 100644 --- a/plugins/trace_api_plugin/trace_api_plugin.cpp +++ b/plugins/trace_api_plugin/trace_api_plugin.cpp @@ -377,18 +377,18 @@ struct trace_api_plugin_impl { })); accepted_block_connection.emplace( - chain.accepted_block.connect([this](std::tuple t) { + chain.accepted_block.connect([this](chain::block_signal_params t) { emit_killer([&](){ - const auto& [ block, id, header, block_num ] = t; - extraction->signal_accepted_block(block, id, block_num); + const auto& [ block, id ] = t; + extraction->signal_accepted_block(block, id, block->block_num()); }); })); irreversible_block_connection.emplace( - chain.irreversible_block.connect([this](std::tuple t) { - const auto& [ block, id, block_num ] = t; + chain.irreversible_block.connect([this](chain::block_signal_params t) { + const auto& [ block, id ] = t; emit_killer([&](){ - extraction->signal_irreversible_block(block_num); + extraction->signal_irreversible_block(block->block_num()); }); })); diff --git a/unittests/api_tests.cpp b/unittests/api_tests.cpp index 2ccd4ef3c8..598f230bdd 100644 --- a/unittests/api_tests.cpp +++ b/unittests/api_tests.cpp @@ -1471,8 +1471,8 @@ void transaction_tests(T& chain) { if (t && t->receipt && t->receipt->status != transaction_receipt::executed) { trace = t; } } ); signed_block_ptr block; - auto c2 = chain.control->accepted_block.connect([&](std::tuple t) { - const auto& [ b, id, header, block_num ] = t; + auto c2 = chain.control->accepted_block.connect([&](block_signal_params t) { + const auto& [ b, id ] = t; block = b; }); // test error handling on deferred transaction failure diff --git a/unittests/block_tests.cpp b/unittests/block_tests.cpp index b70ac5de7e..d75832ac09 100644 --- a/unittests/block_tests.cpp +++ b/unittests/block_tests.cpp @@ -217,12 +217,12 @@ BOOST_AUTO_TEST_CASE(broadcasted_block_test) signed_block_ptr bcasted_blk_by_prod_node; signed_block_ptr bcasted_blk_by_recv_node; - producer_node.control->accepted_block.connect( [&](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; + producer_node.control->accepted_block.connect( [&](block_signal_params t) { + const auto& [ block, id ] = t; bcasted_blk_by_prod_node = block; }); - receiving_node.control->accepted_block.connect( [&](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; + receiving_node.control->accepted_block.connect( [&](block_signal_params t) { + const auto& [ block, id ] = t; bcasted_blk_by_recv_node = block; }); diff --git a/unittests/chain_tests.cpp b/unittests/chain_tests.cpp index 5ba6f8b37c..05fb688e3a 100644 --- a/unittests/chain_tests.cpp +++ b/unittests/chain_tests.cpp @@ -151,8 +151,9 @@ BOOST_AUTO_TEST_CASE( signal_validated_blocks ) try { signed_block_ptr accepted_block; block_id_type accepted_id; - auto c = chain.control->accepted_block.connect([&](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; + auto c = chain.control->accepted_block.connect([&](block_signal_params t) { + const auto& [ block, id ] = t; + auto block_num = block->block_num(); BOOST_CHECK(block); const auto& bsp_by_id = chain.control->fetch_block_state_by_id(id); BOOST_CHECK(bsp_by_id->block_num == block_num); @@ -169,8 +170,9 @@ BOOST_AUTO_TEST_CASE( signal_validated_blocks ) try { }); signed_block_ptr validated_block; block_id_type validated_id; - auto c2 = validator.control->accepted_block.connect([&](std::tuple t) { - const auto& [ block, id, header, block_num ] = t; + auto c2 = validator.control->accepted_block.connect([&](block_signal_params t) { + const auto& [ block, id ] = t; + auto block_num = block->block_num(); BOOST_CHECK(block); const auto& bsp_by_id = validator.control->fetch_block_state_by_id(id); BOOST_CHECK(bsp_by_id->block_num == block_num); diff --git a/unittests/forked_tests.cpp b/unittests/forked_tests.cpp index 2a32835cc4..57ffa266ec 100644 --- a/unittests/forked_tests.cpp +++ b/unittests/forked_tests.cpp @@ -355,11 +355,11 @@ BOOST_AUTO_TEST_CASE( validator_accepts_valid_blocks ) try { block_id_type first_id; signed_block_header first_header; - auto c = n2.control->accepted_block.connect( [&]( std::tuple t ) { - const auto& [ block, id, header, block_num ] = t; + auto c = n2.control->accepted_block.connect( [&]( block_signal_params t ) { + const auto& [ block, id ] = t; first_block = block; first_id = id; - first_header = header; + first_header = static_cast(*block); } ); push_blocks( n1, n2 ); @@ -703,8 +703,8 @@ BOOST_AUTO_TEST_CASE( push_block_returns_forked_transactions ) try { // test forked blocks signal accepted_block in order, required by trace_api_plugin std::vector accepted_blocks; - auto conn = c.control->accepted_block.connect( [&]( std::tuple t ) { - const auto& [ block, id, header, block_num ] = t; + auto conn = c.control->accepted_block.connect( [&]( block_signal_params t ) { + const auto& [ block, id ] = t; accepted_blocks.emplace_back( block ); } ); diff --git a/unittests/state_history_tests.cpp b/unittests/state_history_tests.cpp index 1e8279a7d6..08db6bc639 100644 --- a/unittests/state_history_tests.cpp +++ b/unittests/state_history_tests.cpp @@ -631,8 +631,8 @@ struct state_history_tester : state_history_tester_logs, tester { trace_converter.add_transaction(std::get<0>(t), std::get<1>(t)); }); - control.accepted_block.connect([&](std::tuple t) { - const auto& [ block, id, block_header, block_num ] = t; + control.accepted_block.connect([&](block_signal_params t) { + const auto& [ block, id ] = t; eosio::state_history_log_header header{.magic = eosio::ship_magic(eosio::ship_current_version, 0), .block_id = id, .payload_size = 0}; @@ -641,7 +641,7 @@ struct state_history_tester : state_history_tester_logs, tester { trace_converter.pack(buf, false, block); }); - chain_state_log.pack_and_write_entry(header, block_header.previous, [&control](auto&& buf) { + chain_state_log.pack_and_write_entry(header, static_cast(*block).previous, [&control](auto&& buf) { eosio::state_history::pack_deltas(buf, control.db(), true); }); }); From 22ca26954d383927656f13f42e2f4be831842ee1 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Mon, 18 Dec 2023 13:44:36 -0500 Subject: [PATCH 12/19] remove leftover code for accepted_transaction signal --- libraries/chain/controller.cpp | 9 +-------- libraries/chain/include/eosio/chain/controller.hpp | 1 - 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index d4029a9ce5..1aed339f1f 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -369,7 +369,7 @@ struct controller_impl { } /** - * Plugins / observers listening to signals emited (such as accepted_transaction) might trigger + * Plugins / observers listening to signals emited might trigger * errors and throw exceptions. Unless those exceptions are caught it could impact consensus and/or * cause a node to fork. * @@ -1337,7 +1337,6 @@ struct controller_impl { pending->_block_report.total_cpu_usage_us += billed_cpu_time_us; pending->_block_report.total_elapsed_time += trace->elapsed; pending->_block_report.total_time += trace->elapsed; - emit( self.accepted_transaction, trx ); dmlog_applied_transaction(trace); emit( self.applied_transaction, std::tie(trace, trx->packed_trx()) ); undo_session.squash(); @@ -1403,7 +1402,6 @@ struct controller_impl { trace->account_ram_delta = account_delta( gtrx.payer, trx_removal_ram_delta ); - emit( self.accepted_transaction, trx ); dmlog_applied_transaction(trace); emit( self.applied_transaction, std::tie(trace, trx->packed_trx()) ); @@ -1448,7 +1446,6 @@ struct controller_impl { if( !trace->except_ptr ) { trace->account_ram_delta = account_delta( gtrx.payer, trx_removal_ram_delta ); trace->elapsed = fc::time_point::now() - start; - emit( self.accepted_transaction, trx ); dmlog_applied_transaction(trace); emit( self.applied_transaction, std::tie(trace, trx->packed_trx()) ); undo_session.squash(); @@ -1494,13 +1491,11 @@ struct controller_impl { trace->receipt = push_receipt(gtrx.trx_id, transaction_receipt::hard_fail, cpu_time_to_bill_us, 0); trace->account_ram_delta = account_delta( gtrx.payer, trx_removal_ram_delta ); - emit( self.accepted_transaction, trx ); dmlog_applied_transaction(trace); emit( self.applied_transaction, std::tie(trace, trx->packed_trx()) ); undo_session.squash(); } else { - emit( self.accepted_transaction, trx ); dmlog_applied_transaction(trace); emit( self.applied_transaction, std::tie(trace, trx->packed_trx()) ); } @@ -1634,7 +1629,6 @@ struct controller_impl { // call the accept signal but only once for this transaction if (!trx->accepted) { trx->accepted = true; - emit(self.accepted_transaction, trx); } dmlog_applied_transaction(trace, &trn); @@ -1681,7 +1675,6 @@ struct controller_impl { } if (!trx->is_transient()) { - emit(self.accepted_transaction, trx); dmlog_applied_transaction(trace); emit(self.applied_transaction, std::tie(trace, trx->packed_trx())); diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index 2012ca4c1c..49993dd1bd 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -332,7 +332,6 @@ namespace eosio { namespace chain { signal accepted_block_header; signal accepted_block; signal irreversible_block; - signal accepted_transaction; signal)> applied_transaction; const apply_handler* find_apply_handler( account_name contract, scope_name scope, action_name act )const; From 8a2fc752b05a537f6088a4e4d4c6d631df3ecc3b Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Mon, 18 Dec 2023 16:39:45 -0500 Subject: [PATCH 13/19] use const block_signal_params& --- libraries/chain/controller.cpp | 2 +- libraries/chain/include/eosio/chain/controller.hpp | 6 +++--- plugins/chain_plugin/chain_plugin.cpp | 6 +++--- plugins/chain_plugin/test/test_account_query_db.cpp | 10 +++++----- plugins/net_plugin/net_plugin.cpp | 6 +++--- plugins/producer_plugin/producer_plugin.cpp | 6 +++--- plugins/producer_plugin/test/test_trx_full.cpp | 2 +- plugins/state_history_plugin/state_history_plugin.cpp | 2 +- plugins/test_control_plugin/test_control_plugin.cpp | 4 ++-- plugins/trace_api_plugin/trace_api_plugin.cpp | 4 ++-- 10 files changed, 24 insertions(+), 24 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 1aed339f1f..2e77ff5ae2 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -342,7 +342,7 @@ struct controller_impl { set_activation_handler(); set_activation_handler(); - self.irreversible_block.connect([this](block_signal_params t) { + self.irreversible_block.connect([this](const block_signal_params& t) { const auto& [ block, id] = t; wasmif.current_lib(block->block_num()); }); diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index 49993dd1bd..83f38b1951 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -329,9 +329,9 @@ namespace eosio { namespace chain { static std::optional convert_exception_to_error_code( const fc::exception& e ); signal block_start; - signal accepted_block_header; - signal accepted_block; - signal irreversible_block; + signal accepted_block_header; + signal accepted_block; + signal irreversible_block; signal)> applied_transaction; const apply_handler* find_apply_handler( account_name contract, scope_name scope, action_name act )const; diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index da9127649c..a62769d2d9 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -1014,11 +1014,11 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { // relay signals to channels accepted_block_header_connection = chain->accepted_block_header.connect( - [this]( block_signal_params t ) { + [this]( const block_signal_params& t ) { accepted_block_header_channel.publish( priority::medium, t ); } ); - accepted_block_connection = chain->accepted_block.connect( [this]( block_signal_params t ) { + accepted_block_connection = chain->accepted_block.connect( [this]( const block_signal_params& t ) { const auto& [ block, id ] = t; if (_account_query_db) { _account_query_db->commit_block(block, static_cast(*block), block->block_num()); @@ -1035,7 +1035,7 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { accepted_block_channel.publish( priority::high, t ); } ); - irreversible_block_connection = chain->irreversible_block.connect( [this]( block_signal_params t ) { + irreversible_block_connection = chain->irreversible_block.connect( [this]( const block_signal_params& t ) { const auto& [ block, id ] = t; if (_trx_retry_db) { diff --git a/plugins/chain_plugin/test/test_account_query_db.cpp b/plugins/chain_plugin/test/test_account_query_db.cpp index 52e89e74ed..cf745a293b 100644 --- a/plugins/chain_plugin/test/test_account_query_db.cpp +++ b/plugins/chain_plugin/test/test_account_query_db.cpp @@ -37,7 +37,7 @@ BOOST_FIXTURE_TEST_CASE(newaccount_test, validating_tester) { try { auto aq_db = account_query_db(*control); //link aq_db to the `accepted_block` signal on the controller - auto c2 = control->accepted_block.connect([&](block_signal_params t) { + auto c2 = control->accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; aq_db.commit_block( block, static_cast(*block), block->block_num() ); }); @@ -63,7 +63,7 @@ BOOST_FIXTURE_TEST_CASE(updateauth_test, validating_tester) { try { auto aq_db = account_query_db(*control); //link aq_db to the `accepted_block` signal on the controller - auto c = control->accepted_block.connect([&](block_signal_params t) { + auto c = control->accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; aq_db.commit_block( block, static_cast(*block), block->block_num() ); }); @@ -98,7 +98,7 @@ BOOST_FIXTURE_TEST_CASE(updateauth_test_multi_threaded, validating_tester) { try auto aq_db = account_query_db(*control); //link aq_db to the `accepted_block` signal on the controller - auto c = control->accepted_block.connect([&](block_signal_params t) { + auto c = control->accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; aq_db.commit_block( block, static_cast(*block), block->block_num() ); }); @@ -151,7 +151,7 @@ BOOST_AUTO_TEST_CASE(future_fork_test) { try { auto aq_db = account_query_db(*node_a.control); //link aq_db to the `accepted_block` signal on the controller - auto c = node_a.control->accepted_block.connect([&](block_signal_params t) { + auto c = node_a.control->accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; aq_db.commit_block( block, static_cast(*block), block->block_num() ); }); @@ -199,7 +199,7 @@ BOOST_AUTO_TEST_CASE(fork_test) { try { auto aq_db = account_query_db(*node_a.control); //link aq_db to the `accepted_block` signal on the controller - auto c = node_a.control->accepted_block.connect([&](block_signal_params t) { + auto c = node_a.control->accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; aq_db.commit_block( block, static_cast(*block), block->block_num() ); }); diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp index c04f4ad57d..687869964b 100644 --- a/plugins/net_plugin/net_plugin.cpp +++ b/plugins/net_plugin/net_plugin.cpp @@ -4284,15 +4284,15 @@ namespace eosio { { chain::controller& cc = chain_plug->chain(); - cc.accepted_block_header.connect( [my = shared_from_this()]( block_signal_params t ) { + cc.accepted_block_header.connect( [my = shared_from_this()]( const block_signal_params& t ) { const auto& [ block, id ] = t; my->on_accepted_block_header( block, id, block->block_num() ); } ); - cc.accepted_block.connect( [my = shared_from_this()]( block_signal_params t ) { + cc.accepted_block.connect( [my = shared_from_this()]( const block_signal_params& t ) { my->on_accepted_block(); } ); - cc.irreversible_block.connect( [my = shared_from_this()]( block_signal_params t ) { + cc.irreversible_block.connect( [my = shared_from_this()]( const block_signal_params& t ) { const auto& [ block, id ] = t; my->on_irreversible_block( id, block->block_num() ); } ); diff --git a/plugins/producer_plugin/producer_plugin.cpp b/plugins/producer_plugin/producer_plugin.cpp index 218d9fb79b..ae597903a1 100644 --- a/plugins/producer_plugin/producer_plugin.cpp +++ b/plugins/producer_plugin/producer_plugin.cpp @@ -1329,15 +1329,15 @@ void producer_plugin_impl::plugin_startup() { EOS_ASSERT(_producers.empty() || chain_plug->accept_transactions(), plugin_config_exception, "node cannot have any producer-name configured because no block production is possible with no [api|p2p]-accepted-transactions"); - _accepted_block_connection.emplace(chain.accepted_block.connect([this](block_signal_params t) { + _accepted_block_connection.emplace(chain.accepted_block.connect([this](const block_signal_params& t) { const auto& [ block, id ] = t; on_block(block); })); - _accepted_block_header_connection.emplace(chain.accepted_block_header.connect([this](block_signal_params t) { + _accepted_block_header_connection.emplace(chain.accepted_block_header.connect([this](const block_signal_params& t) { const auto& [ block, id ] = t; on_block_header(static_cast(*block).producer, block->block_num(), block->timestamp); })); - _irreversible_block_connection.emplace(chain.irreversible_block.connect([this](block_signal_params t) { + _irreversible_block_connection.emplace(chain.irreversible_block.connect([this](const block_signal_params& t) { const auto& [ block, id ] = t; on_irreversible_block(block); })); diff --git a/plugins/producer_plugin/test/test_trx_full.cpp b/plugins/producer_plugin/test/test_trx_full.cpp index be1d39edd6..51abbf3a3e 100644 --- a/plugins/producer_plugin/test/test_trx_full.cpp +++ b/plugins/producer_plugin/test/test_trx_full.cpp @@ -129,7 +129,7 @@ BOOST_AUTO_TEST_CASE(producer) { std::deque all_blocks; std::promise empty_blocks_promise; std::future empty_blocks_fut = empty_blocks_promise.get_future(); - auto ab = chain_plug->chain().accepted_block.connect( [&](chain::block_signal_params t) { + auto ab = chain_plug->chain().accepted_block.connect( [&](const chain::block_signal_params& t) { const auto& [ block, id ] = t; static int num_empty = std::numeric_limits::max(); all_blocks.push_back( block ); diff --git a/plugins/state_history_plugin/state_history_plugin.cpp b/plugins/state_history_plugin/state_history_plugin.cpp index 256c1d19ac..e0e77a226b 100644 --- a/plugins/state_history_plugin/state_history_plugin.cpp +++ b/plugins/state_history_plugin/state_history_plugin.cpp @@ -329,7 +329,7 @@ void state_history_plugin_impl::plugin_initialize(const variables_map& options) on_applied_transaction(std::get<0>(t), std::get<1>(t)); })); accepted_block_connection.emplace( - chain.accepted_block.connect([&](block_signal_params t) { + chain.accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; on_accepted_block(block, id, static_cast(*block), block->block_num()); })); diff --git a/plugins/test_control_plugin/test_control_plugin.cpp b/plugins/test_control_plugin/test_control_plugin.cpp index 261518a00d..2bf43bdb55 100644 --- a/plugins/test_control_plugin/test_control_plugin.cpp +++ b/plugins/test_control_plugin/test_control_plugin.cpp @@ -32,12 +32,12 @@ class test_control_plugin_impl { void test_control_plugin_impl::connect() { _irreversible_block_connection.emplace( - _chain.irreversible_block.connect( [&]( chain::block_signal_params t ) { + _chain.irreversible_block.connect( [&]( const chain::block_signal_params& t ) { const auto& [ block, id ] = t; applied_irreversible_block( id ); } )); _accepted_block_connection = - _chain.accepted_block.connect( [&]( chain::block_signal_params t ) { + _chain.accepted_block.connect( [&]( const chain::block_signal_params& t ) { const auto& [ block, id ] = t; accepted_block( id ); } ); diff --git a/plugins/trace_api_plugin/trace_api_plugin.cpp b/plugins/trace_api_plugin/trace_api_plugin.cpp index 8e054cce0d..51c6333f15 100644 --- a/plugins/trace_api_plugin/trace_api_plugin.cpp +++ b/plugins/trace_api_plugin/trace_api_plugin.cpp @@ -377,7 +377,7 @@ struct trace_api_plugin_impl { })); accepted_block_connection.emplace( - chain.accepted_block.connect([this](chain::block_signal_params t) { + chain.accepted_block.connect([this](const chain::block_signal_params& t) { emit_killer([&](){ const auto& [ block, id ] = t; extraction->signal_accepted_block(block, id, block->block_num()); @@ -385,7 +385,7 @@ struct trace_api_plugin_impl { })); irreversible_block_connection.emplace( - chain.irreversible_block.connect([this](chain::block_signal_params t) { + chain.irreversible_block.connect([this](const chain::block_signal_params& t) { const auto& [ block, id ] = t; emit_killer([&](){ extraction->signal_irreversible_block(block->block_num()); From c0ee17320c37e0eb11628815c9001a6292324cbc Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Mon, 18 Dec 2023 17:56:48 -0500 Subject: [PATCH 14/19] change commit_block related functions to use signed_block_ptr as parameter only --- plugins/chain_plugin/account_query_db.cpp | 25 ++++++++----------- plugins/chain_plugin/chain_plugin.cpp | 2 +- .../eosio/chain_plugin/account_query_db.hpp | 2 +- .../test/test_account_query_db.cpp | 10 ++++---- 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/plugins/chain_plugin/account_query_db.cpp b/plugins/chain_plugin/account_query_db.cpp index 610b6bec27..358fac5d78 100644 --- a/plugins/chain_plugin/account_query_db.cpp +++ b/plugins/chain_plugin/account_query_db.cpp @@ -194,7 +194,7 @@ namespace eosio::chain_apis { key_bimap.right.erase(key_range.first, key_range.second); } - bool is_rollback_required( const chain::signed_block_ptr block ) const { + bool is_rollback_required( const chain::signed_block_ptr& block ) const { std::shared_lock read_lock(rw_mutex); const auto bnum = block->block_num(); const auto& index = permission_info_index.get(); @@ -232,10 +232,8 @@ namespace eosio::chain_apis { * For each removed entry, this will create a new entry if there exists an equivalent {owner, name} permission * at the HEAD state of the chain. * @param block - the block to rollback before - * @param header - the block header - * @param block_num - the block number */ - void rollback_to_before( const chain::signed_block_ptr block, const chain::signed_block_header& header, uint32_t block_num ) { + void rollback_to_before( const chain::signed_block_ptr& block ) { const auto bnum = block->block_num(); auto& index = permission_info_index.get(); const auto& permission_by_owner = controller.db().get_index().indices().get(); @@ -267,8 +265,8 @@ namespace eosio::chain_apis { } else { const auto& po = *itr; - uint32_t last_updated_height = chain::block_timestamp_type(po.last_updated) == header.timestamp ? - block_num : last_updated_time_to_height(po.last_updated); + uint32_t last_updated_height = chain::block_timestamp_type(po.last_updated) == static_cast(*block).timestamp ? + bnum : last_updated_time_to_height(po.last_updated); index.modify(index.iterator_to(pi), [&po, last_updated_height](auto& mutable_pi) { mutable_pi.last_updated_height = last_updated_height; @@ -307,7 +305,7 @@ namespace eosio::chain_apis { * the thread-safe data set * @param block */ - auto commit_block_prelock( const chain::signed_block_ptr block ) const { + auto commit_block_prelock( const chain::signed_block_ptr& block ) const { permission_set_t updated; permission_set_t deleted; @@ -361,10 +359,8 @@ namespace eosio::chain_apis { * Commit a block of transactions to the account query DB * transaction traces need to be in the cache prior to this call * @param block - * @param header - * @param block_num */ - void commit_block(const chain::signed_block_ptr& block, const chain::signed_block_header& header, uint32_t block_num ) { + void commit_block(const chain::signed_block_ptr& block) { permission_set_t updated; permission_set_t deleted; bool rollback_required = false; @@ -374,11 +370,12 @@ namespace eosio::chain_apis { // optimistic skip of locking section if there is nothing to do if (!updated.empty() || !deleted.empty() || rollback_required) { std::unique_lock write_lock(rw_mutex); + auto block_num = block->block_num(); - rollback_to_before(block, header, block_num); + rollback_to_before(block); // insert this blocks time into the time map - time_to_block_num.emplace(header.timestamp, block_num); + time_to_block_num.emplace(static_cast(*block).timestamp, block_num); const auto bnum = block_num; auto& index = permission_info_index.get(); @@ -524,9 +521,9 @@ namespace eosio::chain_apis { } FC_LOG_AND_DROP(("ACCOUNT DB cache_transaction_trace ERROR")); } - void account_query_db::commit_block( const chain::signed_block_ptr& block, const chain::signed_block_header& header, uint32_t block_num ) { + void account_query_db::commit_block( const chain::signed_block_ptr& block ) { try { - _impl->commit_block(block, header, block_num); + _impl->commit_block(block); } FC_LOG_AND_DROP(("ACCOUNT DB commit_block ERROR")); } diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index a62769d2d9..fa3da9ae1c 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -1021,7 +1021,7 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { accepted_block_connection = chain->accepted_block.connect( [this]( const block_signal_params& t ) { const auto& [ block, id ] = t; if (_account_query_db) { - _account_query_db->commit_block(block, static_cast(*block), block->block_num()); + _account_query_db->commit_block(block); } if (_trx_retry_db) { diff --git a/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp b/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp index 215d140b55..2b360e28db 100644 --- a/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp +++ b/plugins/chain_plugin/include/eosio/chain_plugin/account_query_db.hpp @@ -39,7 +39,7 @@ namespace eosio::chain_apis { * uncommitted traces. * @param block */ - void commit_block( const chain::signed_block_ptr& block, const chain::signed_block_header& header, uint32_t block_num ); + void commit_block( const chain::signed_block_ptr& block ); /** * parameters for the get_accounts_by_authorizers RPC diff --git a/plugins/chain_plugin/test/test_account_query_db.cpp b/plugins/chain_plugin/test/test_account_query_db.cpp index cf745a293b..cd02c1627a 100644 --- a/plugins/chain_plugin/test/test_account_query_db.cpp +++ b/plugins/chain_plugin/test/test_account_query_db.cpp @@ -39,7 +39,7 @@ BOOST_FIXTURE_TEST_CASE(newaccount_test, validating_tester) { try { //link aq_db to the `accepted_block` signal on the controller auto c2 = control->accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; - aq_db.commit_block( block, static_cast(*block), block->block_num() ); + aq_db.commit_block( block ); }); produce_blocks(10); @@ -65,7 +65,7 @@ BOOST_FIXTURE_TEST_CASE(updateauth_test, validating_tester) { try { //link aq_db to the `accepted_block` signal on the controller auto c = control->accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; - aq_db.commit_block( block, static_cast(*block), block->block_num() ); + aq_db.commit_block( block ); }); produce_blocks(10); @@ -100,7 +100,7 @@ BOOST_FIXTURE_TEST_CASE(updateauth_test_multi_threaded, validating_tester) { try //link aq_db to the `accepted_block` signal on the controller auto c = control->accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; - aq_db.commit_block( block, static_cast(*block), block->block_num() ); + aq_db.commit_block( block ); }); produce_blocks(10); @@ -153,7 +153,7 @@ BOOST_AUTO_TEST_CASE(future_fork_test) { try { //link aq_db to the `accepted_block` signal on the controller auto c = node_a.control->accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; - aq_db.commit_block( block, static_cast(*block), block->block_num() ); + aq_db.commit_block( block ); }); // create 10 blocks synced @@ -201,7 +201,7 @@ BOOST_AUTO_TEST_CASE(fork_test) { try { //link aq_db to the `accepted_block` signal on the controller auto c = node_a.control->accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; - aq_db.commit_block( block, static_cast(*block), block->block_num() ); + aq_db.commit_block( block ); }); // create 10 blocks synced From f8a82b086ae0ae9bce273a3cc290bf9019855418 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Mon, 18 Dec 2023 20:20:56 -0500 Subject: [PATCH 15/19] change on_irreversible_block to use block as parameter only --- plugins/chain_plugin/chain_plugin.cpp | 2 +- .../eosio/chain_plugin/trx_retry_db.hpp | 2 +- .../chain_plugin/test/test_trx_retry_db.cpp | 42 +++++++++---------- plugins/chain_plugin/trx_retry_db.cpp | 8 ++-- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index fa3da9ae1c..d5d1b91b74 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -1039,7 +1039,7 @@ void chain_plugin_impl::plugin_initialize(const variables_map& options) { const auto& [ block, id ] = t; if (_trx_retry_db) { - _trx_retry_db->on_irreversible_block(block, block->block_num()); + _trx_retry_db->on_irreversible_block(block); } if (_trx_finality_status_processing) { diff --git a/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp b/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp index a412975694..7ffb041e0b 100644 --- a/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp +++ b/plugins/chain_plugin/include/eosio/chain_plugin/trx_retry_db.hpp @@ -68,7 +68,7 @@ class trx_retry_db { /** * Attach to chain irreversible_block signal */ - void on_irreversible_block( const chain::signed_block_ptr& block, uint32_t block_num ); + void on_irreversible_block( const chain::signed_block_ptr& block ); private: std::unique_ptr _impl; diff --git a/plugins/chain_plugin/test/test_trx_retry_db.cpp b/plugins/chain_plugin/test/test_trx_retry_db.cpp index b99343929b..f9810b30bd 100644 --- a/plugins/chain_plugin/test/test_trx_retry_db.cpp +++ b/plugins/chain_plugin/test/test_trx_retry_db.cpp @@ -277,7 +277,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { auto bsp1 = make_block_state(1, {}); trx_retry.on_block_start(1); trx_retry.on_accepted_block(bsp1->block_num); - trx_retry.on_irreversible_block(bsp1->block, bsp1->block_num); + trx_retry.on_irreversible_block(bsp1->block); BOOST_CHECK(!trx_1_expired); BOOST_CHECK(!trx_2_expired); // increase time by 3 seconds to expire first @@ -287,7 +287,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { auto bsp2 = make_block_state(2, {}); trx_retry.on_block_start(2); trx_retry.on_accepted_block(bsp2->block_num); - trx_retry.on_irreversible_block(bsp2->block, bsp2->block_num); + trx_retry.on_irreversible_block(bsp2->block); BOOST_CHECK(trx_1_expired); BOOST_CHECK(!trx_2_expired); // increase time by 2 seconds to expire second @@ -297,7 +297,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { auto bsp3 = make_block_state(3, {}); trx_retry.on_block_start(3); trx_retry.on_accepted_block(bsp3->block_num); - trx_retry.on_irreversible_block(bsp3->block, bsp3->block_num); + trx_retry.on_irreversible_block(bsp3->block); BOOST_CHECK(trx_1_expired); BOOST_CHECK(trx_2_expired); BOOST_CHECK_EQUAL(0u, trx_retry.size()); @@ -348,9 +348,9 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { auto bsp6 = make_block_state(6, {}); trx_retry.on_block_start(6); trx_retry.on_accepted_block(bsp6->block_num); - trx_retry.on_irreversible_block(bsp4->block, bsp4->block_num); - trx_retry.on_irreversible_block(bsp5->block, bsp5->block_num); - trx_retry.on_irreversible_block(bsp6->block, bsp6->block_num); + trx_retry.on_irreversible_block(bsp4->block); + trx_retry.on_irreversible_block(bsp5->block); + trx_retry.on_irreversible_block(bsp6->block); BOOST_CHECK(trx_3_expired); BOOST_CHECK(trx_4_expired); BOOST_CHECK_EQUAL(0u, trx_retry.size()); @@ -416,10 +416,10 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { trx_retry.on_accepted_block(bsp11->block_num); BOOST_CHECK(!trx_5_variant); BOOST_CHECK(trx_6_variant); - trx_retry.on_irreversible_block(bsp7->block, bsp7->block_num); + trx_retry.on_irreversible_block(bsp7->block); BOOST_CHECK(!trx_5_variant); BOOST_CHECK(trx_6_variant); - trx_retry.on_irreversible_block(bsp8->block, bsp8->block_num); + trx_retry.on_irreversible_block(bsp8->block); BOOST_CHECK(trx_5_variant); BOOST_CHECK(trx_6_variant); BOOST_CHECK_EQUAL(0u, trx_retry.size()); @@ -541,16 +541,16 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { BOOST_CHECK(!trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(!trx_9_expired); - trx_retry.on_irreversible_block(bsp9->block, bsp9->block_num); - trx_retry.on_irreversible_block(bsp10->block, bsp10->block_num); - trx_retry.on_irreversible_block(bsp11->block, bsp11->block_num); - trx_retry.on_irreversible_block(bsp12->block, bsp12->block_num); - trx_retry.on_irreversible_block(bsp13b->block, bsp13b->block_num); - trx_retry.on_irreversible_block(bsp14b->block, bsp14b->block_num); + trx_retry.on_irreversible_block(bsp9->block); + trx_retry.on_irreversible_block(bsp10->block); + trx_retry.on_irreversible_block(bsp11->block); + trx_retry.on_irreversible_block(bsp12->block); + trx_retry.on_irreversible_block(bsp13b->block); + trx_retry.on_irreversible_block(bsp14b->block); BOOST_CHECK(!trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(!trx_9_expired); - trx_retry.on_irreversible_block(bsp15b->block, bsp15b->block_num); + trx_retry.on_irreversible_block(bsp15b->block); BOOST_CHECK(trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(!trx_9_expired); @@ -560,11 +560,11 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { auto bsp19 = make_block_state(19, {}); trx_retry.on_block_start(19); trx_retry.on_accepted_block(bsp19->block_num); - trx_retry.on_irreversible_block(bsp15->block, bsp15->block_num); - trx_retry.on_irreversible_block(bsp16->block, bsp16->block_num); - trx_retry.on_irreversible_block(bsp17->block, bsp17->block_num); - trx_retry.on_irreversible_block(bsp18->block, bsp18->block_num); - trx_retry.on_irreversible_block(bsp19->block, bsp19->block_num); + trx_retry.on_irreversible_block(bsp15->block); + trx_retry.on_irreversible_block(bsp16->block); + trx_retry.on_irreversible_block(bsp17->block); + trx_retry.on_irreversible_block(bsp18->block); + trx_retry.on_irreversible_block(bsp19->block); BOOST_CHECK(trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(!trx_9_expired); @@ -577,7 +577,7 @@ BOOST_AUTO_TEST_CASE(trx_retry_logic) { BOOST_CHECK(trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(!trx_9_expired); - trx_retry.on_irreversible_block(bsp20->block, bsp20->block_num); + trx_retry.on_irreversible_block(bsp20->block); BOOST_CHECK(trx_7_variant); BOOST_CHECK(trx_8_variant); BOOST_CHECK(trx_9_expired); diff --git a/plugins/chain_plugin/trx_retry_db.cpp b/plugins/chain_plugin/trx_retry_db.cpp index c031b19a89..1febd72513 100644 --- a/plugins/chain_plugin/trx_retry_db.cpp +++ b/plugins/chain_plugin/trx_retry_db.cpp @@ -167,8 +167,8 @@ struct trx_retry_db_impl { retry_trxs(); } - void on_irreversible_block( const chain::signed_block_ptr& block, uint32_t block_num ) { - ack_ready_trxs_by_lib( block_num ); + void on_irreversible_block( const chain::signed_block_ptr& block ) { + ack_ready_trxs_by_lib( block->block_num() ); clear_expired( block->timestamp ); } @@ -327,9 +327,9 @@ void trx_retry_db::on_accepted_block( uint32_t block_num ) { } FC_LOG_AND_DROP(("trx retry accepted_block ERROR")); } -void trx_retry_db::on_irreversible_block(const chain::signed_block_ptr& block, uint32_t block_num ) { +void trx_retry_db::on_irreversible_block(const chain::signed_block_ptr& block) { try { - _impl->on_irreversible_block(block, block_num); + _impl->on_irreversible_block(block); } FC_LOG_AND_DROP(("trx retry irreversible_block ERROR")); } From 6f186ceeb40ada84884648013ec6b627cf13f06d Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Mon, 18 Dec 2023 21:06:03 -0500 Subject: [PATCH 16/19] remove block_num as paramter in more places --- plugins/net_plugin/net_plugin.cpp | 10 +++---- .../eosio/state_history_plugin/session.hpp | 29 +++++++++---------- .../state_history_plugin.cpp | 10 +++---- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp index 687869964b..a59544d044 100644 --- a/plugins/net_plugin/net_plugin.cpp +++ b/plugins/net_plugin/net_plugin.cpp @@ -528,7 +528,7 @@ namespace eosio { uint32_t get_chain_lib_num() const; uint32_t get_chain_head_num() const; - void on_accepted_block_header( const signed_block_ptr& block, const block_id_type& id, uint32_t block_num ); + void on_accepted_block_header( const signed_block_ptr& block, const block_id_type& id ); void on_accepted_block(); void transaction_ack(const std::pair&); @@ -3882,11 +3882,11 @@ namespace eosio { } // called from application thread - void net_plugin_impl::on_accepted_block_header(const signed_block_ptr& block, const block_id_type& id, uint32_t block_num) { + void net_plugin_impl::on_accepted_block_header(const signed_block_ptr& block, const block_id_type& id) { update_chain_info(); - dispatcher->strand.post([block, id, block_num]() { - fc_dlog(logger, "signaled accepted_block_header, blk num = ${num}, id = ${id}", ("num", block_num)("id", id)); + dispatcher->strand.post([block, id]() { + fc_dlog(logger, "signaled accepted_block_header, blk num = ${num}, id = ${id}", ("num", block->block_num())("id", id)); my_impl->dispatcher->bcast_block(block, id); }); } @@ -4286,7 +4286,7 @@ namespace eosio { chain::controller& cc = chain_plug->chain(); cc.accepted_block_header.connect( [my = shared_from_this()]( const block_signal_params& t ) { const auto& [ block, id ] = t; - my->on_accepted_block_header( block, id, block->block_num() ); + my->on_accepted_block_header( block, id ); } ); cc.accepted_block.connect( [my = shared_from_this()]( const block_signal_params& t ) { diff --git a/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp b/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp index 358a5aae13..ae72a89d13 100644 --- a/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp +++ b/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp @@ -25,7 +25,7 @@ struct send_queue_entry_base { struct session_base { virtual void send_update(bool changed) = 0; - virtual void send_update(const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num) = 0; + virtual void send_update(const chain::signed_block_ptr& block, const chain::block_id_type& id) = 0; virtual ~session_base() = default; std::optional current_request; @@ -36,17 +36,15 @@ class send_update_send_queue_entry : public send_queue_entry_base { std::shared_ptr session; const chain::signed_block_ptr block; const chain::block_id_type id; - uint32_t block_num; public: - send_update_send_queue_entry(std::shared_ptr s, chain::signed_block_ptr block, chain::block_id_type id, uint32_t block_num) + send_update_send_queue_entry(std::shared_ptr s, chain::signed_block_ptr block, const chain::block_id_type& id) : session(std::move(s)) , block(std::move(block)) - , id(std::move(id)) - , block_num(block_num){} + , id(id){} void send_entry() override { if( block) { - session->send_update(block, id, block_num); + session->send_update(block, id); } else { session->send_update(false); } @@ -121,14 +119,14 @@ class session_manager { void send_updates() { for( auto& s : session_set ) { if (s->need_to_send_update ) { - add_send_queue(s, std::make_unique(s, nullptr, chain::block_id_type{}, 0)); + add_send_queue(s, std::make_unique(s, nullptr, chain::block_id_type{})); } } } - void send_update(const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num) { + void send_update(const chain::signed_block_ptr& block, const chain::block_id_type& id) { for( auto& s : session_set ) { - add_send_queue(s, std::make_unique(s, block, id, block_num)); + add_send_queue(s, std::make_unique(s, block, id)); } } @@ -484,7 +482,7 @@ struct session : session_base, std::enable_shared_from_thismax_messages_in_flight) { session_mgr.pop_entry(false); @@ -505,7 +503,7 @@ struct session : session_base, std::enable_shared_from_this block_id = - (block_num == to_send_block_num) ? id : plugin.get_block_id(to_send_block_num); + (block->block_num() == to_send_block_num) ? id : plugin.get_block_id(to_send_block_num); if (block_id && position_it && (*position_it)->block_num == to_send_block_num) { // This branch happens when the head block of nodeos is behind the head block of connecting client. @@ -530,7 +528,7 @@ struct session : session_base, std::enable_shared_from_thisfetch_block) - plugin.get_block(to_send_block_num, block_num, block, result.block); + plugin.get_block(to_send_block_num, block->block_num(), block, result.block); if (current_request->fetch_traces && plugin.get_trace_log()) result.traces.emplace(); if (current_request->fetch_deltas && plugin.get_chain_state_log()) @@ -556,23 +554,24 @@ struct session : session_base, std::enable_shared_from_this>(this->shared_from_this(), std::move(result))->send_entry(); } - void send_update(const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num) override { + void send_update(const chain::signed_block_ptr& block, const chain::block_id_type& id) override { if (!current_request || !current_request->max_messages_in_flight) { session_mgr.pop_entry(false); return; } + auto block_num = block->block_num(); state_history::get_blocks_result_v0 result; result.head = {block_num, id}; to_send_block_num = std::min(block_num, to_send_block_num); - send_update(std::move(result), block, id, block_num); + send_update(std::move(result), block, id); } void send_update(bool changed) override { if (changed || need_to_send_update) { state_history::get_blocks_result_v0 result; result.head = plugin.get_block_head(); - send_update(std::move(result), nullptr, chain::block_id_type{}, 0); + send_update(std::move(result), nullptr, chain::block_id_type{}); } else { session_mgr.pop_entry(false); } diff --git a/plugins/state_history_plugin/state_history_plugin.cpp b/plugins/state_history_plugin/state_history_plugin.cpp index e0e77a226b..c40a695e2f 100644 --- a/plugins/state_history_plugin/state_history_plugin.cpp +++ b/plugins/state_history_plugin/state_history_plugin.cpp @@ -201,12 +201,12 @@ struct state_history_plugin_impl : std::enable_shared_from_this(*block), block->block_num()); } catch (const fc::exception& e) { fc_elog(_log, "fc::exception: ${details}", ("details", e.to_detail_string())); // Both app().quit() and exception throwing are required. Without app().quit(), @@ -224,8 +224,8 @@ struct state_history_plugin_impl : std::enable_shared_from_thisshared_from_this(), block, id, block_num]() { - self->get_session_manager().send_update(block, id, block_num); + boost::asio::post(get_ship_executor(), [self = this->shared_from_this(), block, id]() { + self->get_session_manager().send_update(block, id); }); } @@ -331,7 +331,7 @@ void state_history_plugin_impl::plugin_initialize(const variables_map& options) accepted_block_connection.emplace( chain.accepted_block.connect([&](const block_signal_params& t) { const auto& [ block, id ] = t; - on_accepted_block(block, id, static_cast(*block), block->block_num()); + on_accepted_block(block, id); })); block_start_connection.emplace( chain.block_start.connect([&](uint32_t block_num) { on_block_start(block_num); })); From f777c8f0cb969282beefa4f0b9f6b985e1d97f59 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Tue, 19 Dec 2023 09:08:29 -0500 Subject: [PATCH 17/19] hanlde potential null signed block in send_update --- .../include/eosio/state_history_plugin/session.hpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp b/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp index ae72a89d13..41140655ca 100644 --- a/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp +++ b/plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp @@ -503,7 +503,7 @@ struct session : session_base, std::enable_shared_from_this block_id = - (block->block_num() == to_send_block_num) ? id : plugin.get_block_id(to_send_block_num); + (block && block->block_num() == to_send_block_num) ? id : plugin.get_block_id(to_send_block_num); if (block_id && position_it && (*position_it)->block_num == to_send_block_num) { // This branch happens when the head block of nodeos is behind the head block of connecting client. @@ -527,8 +527,10 @@ struct session : session_base, std::enable_shared_from_thisfetch_block) - plugin.get_block(to_send_block_num, block->block_num(), block, result.block); + if (current_request->fetch_block) { + uint32_t block_num = block ? block->block_num() : 0; // block can be nullptr in testing + plugin.get_block(to_send_block_num, block_num, block, result.block); + } if (current_request->fetch_traces && plugin.get_trace_log()) result.traces.emplace(); if (current_request->fetch_deltas && plugin.get_chain_state_log()) From 5a7714a4e4d047b443b09ee580f27e9d2b82b1da Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Tue, 19 Dec 2023 10:45:19 -0500 Subject: [PATCH 18/19] remove more unneeded block_num parameter --- .../include/eosio/trace_api/chain_extraction.hpp | 12 ++++++------ .../include/eosio/trace_api/extract_util.hpp | 4 ++-- plugins/trace_api_plugin/test/test_extraction.cpp | 2 +- plugins/trace_api_plugin/trace_api_plugin.cpp | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp b/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp index 83c14043fd..05860bb1ef 100644 --- a/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp +++ b/plugins/trace_api_plugin/include/eosio/trace_api/chain_extraction.hpp @@ -31,8 +31,8 @@ class chain_extraction_impl_type { } /// connect to chain controller accepted_block signal - void signal_accepted_block( const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num ) { - on_accepted_block( block, id, block_num ); + void signal_accepted_block( const chain::signed_block_ptr& block, const chain::block_id_type& id ) { + on_accepted_block( block, id ); } /// connect to chain controller irreversible_block signal @@ -63,8 +63,8 @@ class chain_extraction_impl_type { } } - void on_accepted_block(const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num) { - store_block_trace( block, id, block_num ); + void on_accepted_block(const chain::signed_block_ptr& block, const chain::block_id_type& id ) { + store_block_trace( block, id ); } void on_irreversible_block( uint32_t block_num ) { @@ -80,10 +80,10 @@ class chain_extraction_impl_type { onblock_trace.reset(); } - void store_block_trace( const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num) { + void store_block_trace( const chain::signed_block_ptr& block, const chain::block_id_type& id ) { try { using transaction_trace_t = transaction_trace_v3; - auto bt = create_block_trace( block, id, block_num ); + auto bt = create_block_trace( block, id ); std::vector traces; traces.reserve( block->transactions.size() + 1 ); diff --git a/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp b/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp index eb17036874..ce240a9b5e 100644 --- a/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp +++ b/plugins/trace_api_plugin/include/eosio/trace_api/extract_util.hpp @@ -62,10 +62,10 @@ inline TransactionTrace to_transaction_trace( const cache_trace& t ) { return r; } -inline block_trace_v2 create_block_trace( const chain::signed_block_ptr& block, const chain::block_id_type& id, uint32_t block_num ) { +inline block_trace_v2 create_block_trace( const chain::signed_block_ptr& block, const chain::block_id_type& id ) { block_trace_v2 r; r.id = id; - r.number = block_num; + r.number = block->block_num(); r.previous_id = block->previous; r.timestamp = block->timestamp; r.producer = block->producer; diff --git a/plugins/trace_api_plugin/test/test_extraction.cpp b/plugins/trace_api_plugin/test/test_extraction.cpp index 2211ecbce5..e053ce6c52 100644 --- a/plugins/trace_api_plugin/test/test_extraction.cpp +++ b/plugins/trace_api_plugin/test/test_extraction.cpp @@ -137,7 +137,7 @@ struct extraction_test_fixture { } void signal_accepted_block( const chain::block_state_legacy_ptr& bsp ) { - extraction_impl.signal_accepted_block(bsp->block, bsp->id, bsp->block_num); + extraction_impl.signal_accepted_block(bsp->block, bsp->id); } // fixture data and methods diff --git a/plugins/trace_api_plugin/trace_api_plugin.cpp b/plugins/trace_api_plugin/trace_api_plugin.cpp index 51c6333f15..8aa7ea9556 100644 --- a/plugins/trace_api_plugin/trace_api_plugin.cpp +++ b/plugins/trace_api_plugin/trace_api_plugin.cpp @@ -380,7 +380,7 @@ struct trace_api_plugin_impl { chain.accepted_block.connect([this](const chain::block_signal_params& t) { emit_killer([&](){ const auto& [ block, id ] = t; - extraction->signal_accepted_block(block, id, block->block_num()); + extraction->signal_accepted_block(block, id); }); })); From 49386409116b438b9ecdbb5f19a02a683efcd0b8 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Tue, 19 Dec 2023 11:31:33 -0500 Subject: [PATCH 19/19] remove unnecessary static_cast --- plugins/chain_plugin/account_query_db.cpp | 4 ++-- plugins/producer_plugin/producer_plugin.cpp | 2 +- unittests/state_history_tests.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/chain_plugin/account_query_db.cpp b/plugins/chain_plugin/account_query_db.cpp index 358fac5d78..f5a6cf6a32 100644 --- a/plugins/chain_plugin/account_query_db.cpp +++ b/plugins/chain_plugin/account_query_db.cpp @@ -265,7 +265,7 @@ namespace eosio::chain_apis { } else { const auto& po = *itr; - uint32_t last_updated_height = chain::block_timestamp_type(po.last_updated) == static_cast(*block).timestamp ? + uint32_t last_updated_height = chain::block_timestamp_type(po.last_updated) == block->timestamp ? bnum : last_updated_time_to_height(po.last_updated); index.modify(index.iterator_to(pi), [&po, last_updated_height](auto& mutable_pi) { @@ -375,7 +375,7 @@ namespace eosio::chain_apis { rollback_to_before(block); // insert this blocks time into the time map - time_to_block_num.emplace(static_cast(*block).timestamp, block_num); + time_to_block_num.emplace(block->timestamp, block_num); const auto bnum = block_num; auto& index = permission_info_index.get(); diff --git a/plugins/producer_plugin/producer_plugin.cpp b/plugins/producer_plugin/producer_plugin.cpp index ae597903a1..9994ddaf27 100644 --- a/plugins/producer_plugin/producer_plugin.cpp +++ b/plugins/producer_plugin/producer_plugin.cpp @@ -1335,7 +1335,7 @@ void producer_plugin_impl::plugin_startup() { })); _accepted_block_header_connection.emplace(chain.accepted_block_header.connect([this](const block_signal_params& t) { const auto& [ block, id ] = t; - on_block_header(static_cast(*block).producer, block->block_num(), block->timestamp); + on_block_header(block->producer, block->block_num(), block->timestamp); })); _irreversible_block_connection.emplace(chain.irreversible_block.connect([this](const block_signal_params& t) { const auto& [ block, id ] = t; diff --git a/unittests/state_history_tests.cpp b/unittests/state_history_tests.cpp index 08db6bc639..2114bf7647 100644 --- a/unittests/state_history_tests.cpp +++ b/unittests/state_history_tests.cpp @@ -641,7 +641,7 @@ struct state_history_tester : state_history_tester_logs, tester { trace_converter.pack(buf, false, block); }); - chain_state_log.pack_and_write_entry(header, static_cast(*block).previous, [&control](auto&& buf) { + chain_state_log.pack_and_write_entry(header, block->previous, [&control](auto&& buf) { eosio::state_history::pack_deltas(buf, control.db(), true); }); });