diff --git a/libraries/chain/block_state.cpp b/libraries/chain/block_state.cpp index e287e4f8f3..f33d5345f1 100644 --- a/libraries/chain/block_state.cpp +++ b/libraries/chain/block_state.cpp @@ -337,11 +337,28 @@ finality_data_t block_state::get_finality_data() { if (!base_digest) { base_digest = compute_base_digest(); // cache it } + + // Check if there is any proposed finalizer policy in the block + std::optional proposed_finalizer_policy; + if (is_savanna_genesis_block()) { + // For Genesis Block, use the active finalizer policy which was proposed in the block. + proposed_finalizer_policy = *active_finalizer_policy; + } else { + auto range = finalizer_policies.equal_range(block_num()); + for (auto itr = range.first; itr != range.second; ++itr) { + if (itr->second.state == finalizer_policy_tracker::state_t::proposed) { + proposed_finalizer_policy = *itr->second.policy; + break; + } + } + } + return { // other fields take the default values set by finality_data_t definition .active_finalizer_policy_generation = active_finalizer_policy->generation, - .action_mroot = action_mroot, - .base_digest = *base_digest + .action_mroot = action_mroot, + .base_digest = *base_digest, + .proposed_finalizer_policy = std::move(proposed_finalizer_policy) }; } diff --git a/libraries/chain/include/eosio/chain/block_header_state.hpp b/libraries/chain/include/eosio/chain/block_header_state.hpp index e6c6c6fb6e..9daf9d7815 100644 --- a/libraries/chain/include/eosio/chain/block_header_state.hpp +++ b/libraries/chain/include/eosio/chain/block_header_state.hpp @@ -119,6 +119,10 @@ struct block_header_state { digest_type compute_base_digest() const; digest_type compute_finality_digest() const; + // Returns true if the block is a Savanna Genesis Block. + // This method is applicable to any transition block which is re-classified as a Savanna block. + bool is_savanna_genesis_block() const { return core.is_genesis_block_num(block_num()); } + // Returns true if the block is a Proper Savanna Block bool is_proper_svnn_block() const { return header.is_proper_svnn_block(); } diff --git a/libraries/chain/include/eosio/chain/block_state.hpp b/libraries/chain/include/eosio/chain/block_state.hpp index 35cfcf098e..04039e864a 100644 --- a/libraries/chain/include/eosio/chain/block_state.hpp +++ b/libraries/chain/include/eosio/chain/block_state.hpp @@ -64,6 +64,7 @@ struct finality_data_t { uint32_t active_finalizer_policy_generation{0}; digest_type action_mroot{}; digest_type base_digest{}; + std::optional proposed_finalizer_policy; // finalizer policy, if proposed in the block }; struct block_state : public block_header_state { // block_header_state provides parent link @@ -176,5 +177,5 @@ using block_state_pair = std::pair, blo // not exporting pending_qc or valid_qc FC_REFLECT( eosio::chain::valid_t::finality_leaf_node_t, (major_version)(minor_version)(block_num)(finality_digest)(action_mroot) ) FC_REFLECT( eosio::chain::valid_t, (validation_tree)(validation_mroots)) -FC_REFLECT( eosio::chain::finality_data_t, (major_version)(minor_version)(active_finalizer_policy_generation)(action_mroot)(base_digest)) +FC_REFLECT( eosio::chain::finality_data_t, (major_version)(minor_version)(active_finalizer_policy_generation)(action_mroot)(base_digest)(proposed_finalizer_policy) ) FC_REFLECT_DERIVED( eosio::chain::block_state, (eosio::chain::block_header_state), (block)(strong_digest)(weak_digest)(pending_qc)(valid)(validated) )