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.
This commit is contained in:
Colin LeMahieu 2024-03-08 14:27:59 +00:00
commit 5332f2c3f5
No known key found for this signature in database
GPG key ID: 43708520C8DFB938
2 changed files with 29 additions and 14 deletions

View file

@ -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_hash> nano::block::previous () const
nano::block_hash nano::block::previous () const noexcept
{
std::optional<nano::block_hash> result = previous_field ();
/*
if (result && result.value ().is_zero ())
{
return std::nullopt;
}
return result;*/
return result.value_or (0);
}
std::optional<nano::account> 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::block_hash> 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::block_hash> nano::open_block::previous_field () const
{
static nano::block_hash result{ 0 };
return result;
return std::nullopt;
}
std::optional<nano::account> 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::block_hash> 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::block_hash> 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::block_hash> nano::receive_block::previous_field () const
{
return hashables.previous;
}

View file

@ -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<nano::account> destination_field () const;
// Link field for state blocks
virtual std::optional<nano::link> 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<nano::block_hash> previous_field () const = 0;
// Representative field for open/change blocks
virtual std::optional<nano::account> 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<nano::amount> balance_field () const override;
std::optional<nano::account> destination_field () const override;
std::optional<nano::block_hash> 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<nano::block_hash> previous_field () const override;
std::optional<nano::block_hash> 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<nano::account> account_field () const override;
std::optional<nano::block_hash> previous_field () const override;
std::optional<nano::account> representative_field () const override;
std::optional<nano::block_hash> 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<nano::block_hash> previous_field () const override;
std::optional<nano::account> 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<nano::account> account_field () const override;
std::optional<nano::amount> balance_field () const override;
std::optional<nano::link> link_field () const override;
std::optional<nano::block_hash> previous_field () const override;
std::optional<nano::account> representative_field () const override;
public: // Logging