From 5332f2c3f5240977221c9c0263450602d8b798ec Mon Sep 17 00:00:00 2001 From: Colin LeMahieu Date: Fri, 8 Mar 2024 14:27:59 +0000 Subject: [PATCH] Change block::previous to block::previous_field and return std::optional depending if the block has the field. Add block::previous with backwards compatibility and a todo to fix up usages to not check for sentinel values. --- nano/lib/blocks.cpp | 27 ++++++++++++++++++++------- nano/lib/blocks.hpp | 16 +++++++++------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/nano/lib/blocks.cpp b/nano/lib/blocks.cpp index c174a6d99..060681ac1 100644 --- a/nano/lib/blocks.cpp +++ b/nano/lib/blocks.cpp @@ -293,6 +293,20 @@ nano::block_hash nano::block::source () const noexcept } } +// TODO - Remove comments below and fixup usages to not need to check .is_zero () +// std::optional nano::block::previous () const +nano::block_hash nano::block::previous () const noexcept +{ + std::optional result = previous_field (); + /* + if (result && result.value ().is_zero ()) + { + return std::nullopt; + } + return result;*/ + return result.value_or (0); +} + std::optional nano::block::account_field () const { return std::nullopt; @@ -573,7 +587,7 @@ bool nano::send_block::operator== (nano::send_block const & other_a) const return result; } -nano::block_hash const & nano::send_block::previous () const +std::optional nano::send_block::previous_field () const { return hashables.previous; } @@ -743,10 +757,9 @@ void nano::open_block::block_work_set (uint64_t work_a) work = work_a; } -nano::block_hash const & nano::open_block::previous () const +std::optional nano::open_block::previous_field () const { - static nano::block_hash result{ 0 }; - return result; + return std::nullopt; } std::optional nano::open_block::account_field () const @@ -1015,7 +1028,7 @@ void nano::change_block::block_work_set (uint64_t work_a) work = work_a; } -nano::block_hash const & nano::change_block::previous () const +std::optional nano::change_block::previous_field () const { return hashables.previous; } @@ -1314,7 +1327,7 @@ void nano::state_block::block_work_set (uint64_t work_a) work = work_a; } -nano::block_hash const & nano::state_block::previous () const +std::optional nano::state_block::previous_field () const { return hashables.previous; } @@ -1801,7 +1814,7 @@ bool nano::receive_block::valid_predecessor (nano::block const & block_a) const return result; } -nano::block_hash const & nano::receive_block::previous () const +std::optional nano::receive_block::previous_field () const { return hashables.previous; } diff --git a/nano/lib/blocks.hpp b/nano/lib/blocks.hpp index ad860a1bc..d6cca7437 100644 --- a/nano/lib/blocks.hpp +++ b/nano/lib/blocks.hpp @@ -33,8 +33,6 @@ public: virtual void hash (blake2b_state &) const = 0; virtual uint64_t block_work () const = 0; virtual void block_work_set (uint64_t) = 0; - // Previous block in account's chain, zero for open block - virtual nano::block_hash const & previous () const = 0; // Previous block or account number for open blocks virtual nano::root const & root () const = 0; // Qualified root value based on previous() and root() @@ -73,6 +71,10 @@ public: // Direct access to the block fields or nullopt if the block type does n virtual std::optional destination_field () const; // Link field for state blocks virtual std::optional link_field () const; + // Previous block if field exists or 0 + nano::block_hash previous () const noexcept; + // Previous block in chain if the field exists + virtual std::optional previous_field () const = 0; // Representative field for open/change blocks virtual std::optional representative_field () const; // Returns the source block hash for open/receive/state blocks that are receives @@ -122,7 +124,6 @@ public: void hash (blake2b_state &) const override; uint64_t block_work () const override; void block_work_set (uint64_t) override; - nano::block_hash const & previous () const override; nano::root const & root () const override; void serialize (nano::stream &) const override; bool deserialize (nano::stream &); @@ -145,6 +146,7 @@ public: public: // Send block fields std::optional balance_field () const override; std::optional destination_field () const override; + std::optional previous_field () const override; public: // Logging void operator() (nano::object_stream &) const override; @@ -175,7 +177,6 @@ public: void hash (blake2b_state &) const override; uint64_t block_work () const override; void block_work_set (uint64_t) override; - nano::block_hash const & previous () const override; nano::root const & root () const override; void serialize (nano::stream &) const override; bool deserialize (nano::stream &); @@ -196,6 +197,7 @@ public: static std::size_t constexpr size = nano::receive_hashables::size + sizeof (signature) + sizeof (work); public: // Receive block fields + std::optional previous_field () const override; std::optional source_field () const override; public: // Logging @@ -229,7 +231,6 @@ public: void hash (blake2b_state &) const override; uint64_t block_work () const override; void block_work_set (uint64_t) override; - nano::block_hash const & previous () const override; nano::root const & root () const override; void serialize (nano::stream &) const override; bool deserialize (nano::stream &); @@ -251,6 +252,7 @@ public: public: // Open block fields std::optional account_field () const override; + std::optional previous_field () const override; std::optional representative_field () const override; std::optional source_field () const override; @@ -283,7 +285,6 @@ public: void hash (blake2b_state &) const override; uint64_t block_work () const override; void block_work_set (uint64_t) override; - nano::block_hash const & previous () const override; nano::root const & root () const override; void serialize (nano::stream &) const override; bool deserialize (nano::stream &); @@ -304,6 +305,7 @@ public: static std::size_t constexpr size = nano::change_hashables::size + sizeof (signature) + sizeof (work); public: // Change block fields + std::optional previous_field () const override; std::optional representative_field () const override; public: // Logging @@ -348,7 +350,6 @@ public: void hash (blake2b_state &) const override; uint64_t block_work () const override; void block_work_set (uint64_t) override; - nano::block_hash const & previous () const override; nano::root const & root () const override; void serialize (nano::stream &) const override; bool deserialize (nano::stream &); @@ -372,6 +373,7 @@ public: // State block fields std::optional account_field () const override; std::optional balance_field () const override; std::optional link_field () const override; + std::optional previous_field () const override; std::optional representative_field () const override; public: // Logging