diff --git a/libraries/chain/block_state.cpp b/libraries/chain/block_state.cpp index b96d537231..c60eb284ab 100644 --- a/libraries/chain/block_state.cpp +++ b/libraries/chain/block_state.cpp @@ -16,7 +16,6 @@ block_state::block_state(const block_header_state& prev, signed_block_ptr b, con , strong_digest(compute_finality_digest()) , weak_digest(create_weak_digest(strong_digest)) , pending_qc(prev.active_finalizer_policy->finalizers.size(), prev.active_finalizer_policy->threshold, prev.active_finalizer_policy->max_weak_sum_before_weak_final()) - , base_digest(compute_base_digest()) { // ASSUMPTION FROM controller_impl::apply_block = all untrusted blocks will have their signatures pre-validated here if( !skip_validate_signee ) { @@ -43,7 +42,6 @@ block_state::block_state(const block_header_state& bhs, , pub_keys_recovered(true) // called by produce_block so signature recovery of trxs must have been done , cached_trxs(std::move(trx_metas)) , action_mroot(action_mroot) - , base_digest(compute_base_digest()) { block->transactions = std::move(trx_receipts); @@ -95,7 +93,6 @@ block_state::block_state(const block_state_legacy& bsp, const digest_type& actio pub_keys_recovered = bsp._pub_keys_recovered; cached_trxs = bsp._cached_trxs; action_mroot = action_mroot_svnn; - base_digest = compute_base_digest(); } block_state::block_state(snapshot_detail::snapshot_block_state_v7&& sbs) @@ -306,11 +303,14 @@ digest_type block_state::get_finality_mroot_claim(const qc_claim_t& qc_claim) co return get_validation_mroot(next_core_metadata.final_on_strong_qc_block_num); } -finality_data_t block_state::get_finality_data() const { +finality_data_t block_state::get_finality_data() { + if (!base_digest) { + base_digest = compute_base_digest(); // cache it + } return { // other fields take the default values set by finality_data_t definition .action_mroot = action_mroot, - .base_digest = base_digest + .base_digest = *base_digest }; } diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index d70f408ba2..4aa89ce691 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -4123,12 +4123,7 @@ struct controller_impl { } std::optional head_finality_data() const { - // We cannot use apply_s here as it returns an empty `finality_data_t` in - // Legacy, which causes SHiP to generate a null `finality_data` log - // (we want no `finality_data` is generated at all). - return apply>(chain_head, - overloaded{ [](const block_state_legacy_ptr& head) { return std::nullopt; }, - [](const block_state_ptr& head) { return head->get_finality_data(); }}); + return apply_s>(chain_head, [](const block_state_ptr& head) { return head->get_finality_data(); }); } uint32_t earliest_available_block_num() const { diff --git a/libraries/chain/include/eosio/chain/block_state.hpp b/libraries/chain/include/eosio/chain/block_state.hpp index 5aed16b5a7..76d19e1c0a 100644 --- a/libraries/chain/include/eosio/chain/block_state.hpp +++ b/libraries/chain/include/eosio/chain/block_state.hpp @@ -78,8 +78,8 @@ struct block_state : public block_header_state { // block_header_state provi // ------ data members caching information available elsewhere ---------------------- bool pub_keys_recovered = false; deque cached_trxs; - digest_type action_mroot; // For base_digest sent to SHiP - digest_type base_digest; // For base_digest sent to SHiP + digest_type action_mroot; // For finality_data sent to SHiP + std::optional base_digest; // For finality_data sent to SHiP // ------ private methods ----------------------------------------------------------- bool is_valid() const { return validated; } @@ -120,7 +120,7 @@ struct block_state : public block_header_state { // block_header_state provi digest_type get_finality_mroot_claim(const qc_claim_t& qc_claim) const; // Returns finality_data of the current block - finality_data_t get_finality_data() const; + finality_data_t get_finality_data(); // vote_status vote_status aggregate_vote(const vote_message& vote); // aggregate vote into pending_qc diff --git a/libraries/state_history/include/eosio/state_history/types.hpp b/libraries/state_history/include/eosio/state_history/types.hpp index 338b152d3e..38cfb9af86 100644 --- a/libraries/state_history/include/eosio/state_history/types.hpp +++ b/libraries/state_history/include/eosio/state_history/types.hpp @@ -105,7 +105,7 @@ struct get_blocks_request_v0 { }; struct get_blocks_request_v1 : get_blocks_request_v0 { - bool fetch_finality_data = false;; + bool fetch_finality_data = false; }; struct get_blocks_ack_request_v0 { diff --git a/plugins/state_history_plugin/state_history_plugin.cpp b/plugins/state_history_plugin/state_history_plugin.cpp index 7ce4088fd2..966fe464d9 100644 --- a/plugins/state_history_plugin/state_history_plugin.cpp +++ b/plugins/state_history_plugin/state_history_plugin.cpp @@ -118,15 +118,15 @@ struct state_history_plugin_impl : std::enable_shared_from_this get_block_id(uint32_t block_num) { if( trace_log ) { - if ( auto id = trace_log->get_block_id( block_num ); id ) + if ( auto id = trace_log->get_block_id( block_num ) ) return id; } if( chain_state_log ) { - if( auto id = chain_state_log->get_block_id( block_num ); id ) + if( auto id = chain_state_log->get_block_id( block_num ) ) return id; } if( finality_data_log ) { - if( auto id = finality_data_log->get_block_id( block_num ); id ) + if( auto id = finality_data_log->get_block_id( block_num ) ) return id; } try {