From be4a72c48bcd68e64442ac4e9876c43bb86d6c73 Mon Sep 17 00:00:00 2001 From: clemahieu Date: Sat, 9 Jul 2022 14:52:20 +0100 Subject: [PATCH] Expanding ability for ledger::is_send to process non-state blocks. Two new ledger contexts generate a send/receive pair on the genesis chain with state and legacy blocks. --- nano/core_test/ledger.cpp | 29 +++++++++++++++++++++++++++++ nano/secure/ledger.cpp | 12 ++++++++---- nano/secure/ledger.hpp | 2 +- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/nano/core_test/ledger.cpp b/nano/core_test/ledger.cpp index 6a744622c..64fc0d246 100644 --- a/nano/core_test/ledger.cpp +++ b/nano/core_test/ledger.cpp @@ -5646,3 +5646,32 @@ TEST (ledger, unconfirmed_frontiers) ASSERT_EQ (uncemented_info1.cemented_frontier, uncemented_info2.cemented_frontier); ASSERT_EQ (uncemented_info1.frontier, uncemented_info2.frontier); } + +TEST (ledger, is_send_genesis) +{ + auto ctx = nano::test::context::ledger_empty (); + auto & ledger = ctx.ledger (); + auto & store = ctx.store (); + auto tx = store.tx_begin_read (); + ASSERT_FALSE (ledger.is_send (tx, *nano::dev::genesis)); +} + +TEST (ledger, is_send_state) +{ + auto ctx = nano::test::context::ledger_send_receive (); + auto & ledger = ctx.ledger (); + auto & store = ctx.store (); + auto tx = store.tx_begin_read (); + ASSERT_TRUE (ledger.is_send (tx, *ctx.blocks ()[0])); + ASSERT_FALSE (ledger.is_send (tx, *ctx.blocks ()[1])); +} + +TEST (ledger, is_send_legacy) +{ + auto ctx = nano::test::context::ledger_send_receive_legacy (); + auto & ledger = ctx.ledger (); + auto & store = ctx.store (); + auto tx = store.tx_begin_read (); + ASSERT_TRUE (ledger.is_send (tx, *ctx.blocks ()[0])); + ASSERT_FALSE (ledger.is_send (tx, *ctx.blocks ()[1])); +} diff --git a/nano/secure/ledger.cpp b/nano/secure/ledger.cpp index a52103c29..e650276b7 100644 --- a/nano/secure/ledger.cpp +++ b/nano/secure/ledger.cpp @@ -923,14 +923,19 @@ std::string nano::ledger::block_text (nano::block_hash const & hash_a) return result; } -bool nano::ledger::is_send (nano::transaction const & transaction_a, nano::state_block const & block_a) const +bool nano::ledger::is_send (nano::transaction const & transaction_a, nano::block const & block_a) const { + if (block_a.type () != nano::block_type::state) + { + return block_a.type () == nano::block_type::send; + } + nano::block_hash previous = block_a.previous (); /* * if block_a does not have a sideband, then is_send() * requires that the previous block exists in the database. * This is because it must retrieve the balance of the previous block. */ - debug_assert (block_a.has_sideband () || block_a.hashables.previous.is_zero () || store.block.exists (transaction_a, block_a.hashables.previous)); + debug_assert (block_a.has_sideband () || previous.is_zero () || store.block.exists (transaction_a, previous)); bool result (false); if (block_a.has_sideband ()) @@ -939,10 +944,9 @@ bool nano::ledger::is_send (nano::transaction const & transaction_a, nano::state } else { - nano::block_hash previous (block_a.hashables.previous); if (!previous.is_zero ()) { - if (block_a.hashables.balance < balance (transaction_a, previous)) + if (block_a.balance () < balance (transaction_a, previous)) { result = true; } diff --git a/nano/secure/ledger.hpp b/nano/secure/ledger.hpp index 3f6857ad8..489cf7857 100644 --- a/nano/secure/ledger.hpp +++ b/nano/secure/ledger.hpp @@ -51,7 +51,7 @@ public: bool root_exists (nano::transaction const &, nano::root const &); std::string block_text (char const *); std::string block_text (nano::block_hash const &); - bool is_send (nano::transaction const &, nano::state_block const &) const; + bool is_send (nano::transaction const &, nano::block const &) const; nano::account const & block_destination (nano::transaction const &, nano::block const &); nano::block_hash block_source (nano::transaction const &, nano::block const &); std::pair hash_root_random (nano::transaction const &) const;