From c7fb36add8ca7d0e77a1ee887d5e3a4a3c11eae8 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Mon, 26 Feb 2024 17:24:00 -0500 Subject: [PATCH] Add chain_state cumulative_work. --- include/bitcoin/system/chain/chain_state.hpp | 2 + src/chain/chain_state.cpp | 41 ++++++++++++-------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/include/bitcoin/system/chain/chain_state.hpp b/include/bitcoin/system/chain/chain_state.hpp index bdc1aae566..64948a218f 100644 --- a/include/bitcoin/system/chain/chain_state.hpp +++ b/include/bitcoin/system/chain/chain_state.hpp @@ -173,6 +173,7 @@ class BC_API chain_state /// Properties. chain::context context() const NOEXCEPT; const hash_digest& hash() const NOEXCEPT; + const uint256_t& cumulative_work() const NOEXCEPT; uint32_t minimum_block_version() const NOEXCEPT; uint32_t work_required() const NOEXCEPT; uint32_t timestamp() const NOEXCEPT; @@ -237,6 +238,7 @@ class BC_API chain_state const activations active_; const uint32_t work_required_; const uint32_t median_time_past_; + const uint256_t cumulative_work_; }; } // namespace chain diff --git a/src/chain/chain_state.cpp b/src/chain/chain_state.cpp index 2e0d9dcb93..0fd0cc13df 100644 --- a/src/chain/chain_state.cpp +++ b/src/chain/chain_state.cpp @@ -584,13 +584,15 @@ chain_state::data chain_state::to_pool(const chain_state& top, // Top to pool. // This generates a state for the pool above the presumed top block state. +// Work is not acculuated for a pool state. chain_state::chain_state(const chain_state& top, const system::settings& settings) NOEXCEPT : data_(to_pool(top, settings)), forks_(top.forks_), active_(activation(data_, forks_, settings)), work_required_(work_required(data_, forks_, settings)), - median_time_past_(median_time_past(data_, forks_)) + median_time_past_(median_time_past(data_, forks_)), + cumulative_work_(top.cumulative_work()) { } @@ -627,7 +629,8 @@ chain_state::chain_state(const chain_state& pool, const block& block, forks_(pool.forks_), active_(activation(data_, forks_, settings)), work_required_(work_required(data_, forks_, settings)), - median_time_past_(median_time_past(data_, forks_)) + median_time_past_(median_time_past(data_, forks_)), + cumulative_work_(pool.cumulative_work() + block.header().proof()) { } @@ -665,7 +668,8 @@ chain_state::chain_state(const chain_state& parent, const header& header, forks_(parent.forks_), active_(activation(data_, forks_, settings)), work_required_(work_required(data_, forks_, settings)), - median_time_past_(median_time_past(data_, forks_)) + median_time_past_(median_time_past(data_, forks_)), + cumulative_work_(parent.cumulative_work() + header.proof()) { } @@ -683,11 +687,29 @@ chain_state::chain_state(data&& values, // Properties. // ---------------------------------------------------------------------------- +chain::context chain_state::context() const NOEXCEPT +{ + return + { + forks(), + timestamp(), + median_time_past(), + possible_narrow_cast(height()), + minimum_block_version(), + work_required() + }; +} + const hash_digest& chain_state::hash() const NOEXCEPT { return data_.hash; } +const uint256_t& chain_state::cumulative_work() const NOEXCEPT +{ + return cumulative_work_; +} + uint32_t chain_state::minimum_block_version() const NOEXCEPT { return active_.minimum_block_version; @@ -720,19 +742,6 @@ size_t chain_state::height() const NOEXCEPT return data_.height; } -chain::context chain_state::context() const NOEXCEPT -{ - return - { - forks(), - timestamp(), - median_time_past(), - possible_narrow_cast(height()), - minimum_block_version(), - work_required() - }; -} - } // namespace chain } // namespace system } // namespace libbitcoin