From 63d3c3cad61dcddf2d74b450616822b62baa82f9 Mon Sep 17 00:00:00 2001 From: Colin LeMahieu Date: Thu, 14 Sep 2023 20:16:49 +0100 Subject: [PATCH] Moving ::balance off of nano::store on to nano::ledger --- nano/node/json_handler.cpp | 4 ++-- nano/node/lmdb/lmdb.cpp | 12 +++--------- nano/node/lmdb/lmdb.hpp | 1 - nano/node/node.cpp | 2 +- nano/secure/ledger.cpp | 34 +++++++++++++++++++++++++++++++--- nano/secure/ledger.hpp | 1 + nano/secure/store.cpp | 30 ------------------------------ nano/secure/store.hpp | 2 -- 8 files changed, 38 insertions(+), 48 deletions(-) diff --git a/nano/node/json_handler.cpp b/nano/node/json_handler.cpp index ef4e9eab..738b64ad 100644 --- a/nano/node/json_handler.cpp +++ b/nano/node/json_handler.cpp @@ -402,7 +402,7 @@ uint64_t nano::json_handler::difficulty_ledger (nano::block const & block_a) // Send check if (block_previous != nullptr) { - details.is_send = node.store.block.balance (transaction, previous) > block_a.balance ().number (); + details.is_send = node.ledger.balance (transaction, previous) > block_a.balance ().number (); details_found = true; } // Epoch check @@ -1653,7 +1653,7 @@ void nano::json_handler::block_create () else if (previous_text.is_initialized () && balance_text.is_initialized () && type == "send") { auto transaction (node.store.tx_begin_read ()); - if (node.store.block.exists (transaction, previous) && node.store.block.balance (transaction, previous) != balance.number ()) + if (node.store.block.exists (transaction, previous) && node.ledger.balance (transaction, previous) != balance.number ()) { ec = nano::error_rpc::block_create_balance_mismatch; } diff --git a/nano/node/lmdb/lmdb.cpp b/nano/node/lmdb/lmdb.cpp index 4c6183a9..62c6e11c 100644 --- a/nano/node/lmdb/lmdb.cpp +++ b/nano/node/lmdb/lmdb.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -545,7 +546,8 @@ void nano::lmdb::store::upgrade_v17_to_v18 (nano::write_transaction const & tran nano::amount prev_balance (0); if (!block->hashables.previous.is_zero ()) { - prev_balance = block_balance_v18 (transaction_a, block->hashables.previous); + auto prev = block_get_v18 (transaction_a, block->hashables.previous); + prev_balance = nano::ledger::balance (*prev); } if (block->hashables.balance == prev_balance && constants.epochs.is_epoch_link (block->hashables.link)) { @@ -1061,14 +1063,6 @@ boost::optional nano::lmdb::store::block_raw_get_by_type_v18 (nan return result; } -nano::uint128_t nano::lmdb::store::block_balance_v18 (nano::transaction const & transaction, nano::block_hash const & hash) const -{ - auto block_l = block_get_v18 (transaction, hash); - release_assert (block_l); - nano::uint128_t result = block.balance (*block_l); - return result; -} - // All the v14 functions below are only needed during upgrades std::size_t nano::lmdb::store::block_successor_offset_v14 (nano::transaction const & transaction_a, std::size_t entry_size_a, nano::block_type type_a) const { diff --git a/nano/node/lmdb/lmdb.hpp b/nano/node/lmdb/lmdb.hpp index 84c4b432..a73bbc23 100644 --- a/nano/node/lmdb/lmdb.hpp +++ b/nano/node/lmdb/lmdb.hpp @@ -138,7 +138,6 @@ namespace lmdb std::shared_ptr block_get_v18 (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const; nano::mdb_val block_raw_get_v18 (nano::transaction const & transaction_a, nano::block_hash const & hash_a, nano::block_type & type_a) const; boost::optional block_raw_get_by_type_v18 (nano::transaction const & transaction_a, nano::block_hash const & hash_a, nano::block_type & type_a) const; - nano::uint128_t block_balance_v18 (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const; void open_databases (bool &, nano::transaction const &, unsigned); diff --git a/nano/node/node.cpp b/nano/node/node.cpp index ad3b6dbe..47fafd1e 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -1344,7 +1344,7 @@ void nano::node::process_confirmed_data (nano::transaction const & transaction_a auto previous (block_a->previous ()); bool error (false); auto previous_balance (ledger.balance_safe (transaction_a, previous, error)); - auto block_balance = store.block.balance (*block_a); + auto block_balance = ledger.balance (*block_a); if (hash_a != ledger.constants.genesis->account ()) { if (!error) diff --git a/nano/secure/ledger.cpp b/nano/secure/ledger.cpp index 2322a9f1..3974ed4c 100644 --- a/nano/secure/ledger.cpp +++ b/nano/secure/ledger.cpp @@ -736,10 +736,38 @@ void nano::ledger::initialize (nano::generate_cache const & generate_cache_a) } } -// Balance for account containing hash -nano::uint128_t nano::ledger::balance (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const +nano::uint128_t nano::ledger::balance (nano::block const & block) { - return hash_a.is_zero () ? 0 : store.block.balance (transaction_a, hash_a); + nano::uint128_t result; + switch (block.type ()) + { + case nano::block_type::open: + case nano::block_type::receive: + case nano::block_type::change: + result = block.sideband ().balance.number (); + break; + case nano::block_type::send: + case nano::block_type::state: + result = block.balance ().number (); + break; + case nano::block_type::invalid: + case nano::block_type::not_a_block: + release_assert (false); + break; + } + return result; +} + +// Balance for account containing hash +nano::uint128_t nano::ledger::balance (nano::transaction const & transaction, nano::block_hash const & hash) const +{ + if (hash.is_zero ()) + { + return 0; + } + auto block = store.block.get (transaction, hash); + debug_assert (block != nullptr); + return balance (*block); } nano::uint128_t nano::ledger::balance_safe (nano::transaction const & transaction_a, nano::block_hash const & hash_a, bool & error_a) const diff --git a/nano/secure/ledger.hpp b/nano/secure/ledger.hpp index 9af41ee2..762e438d 100644 --- a/nano/secure/ledger.hpp +++ b/nano/secure/ledger.hpp @@ -47,6 +47,7 @@ public: nano::uint128_t amount (nano::transaction const &, nano::block_hash const &); /** Safe for previous block, but block hash_a must exist */ nano::uint128_t amount_safe (nano::transaction const &, nano::block_hash const & hash_a, bool &) const; + static nano::uint128_t balance (nano::block const & block); nano::uint128_t balance (nano::transaction const &, nano::block_hash const &) const; nano::uint128_t balance_safe (nano::transaction const &, nano::block_hash const &, bool &) const; nano::uint128_t account_balance (nano::transaction const &, nano::account const &, bool = false); diff --git a/nano/secure/store.cpp b/nano/secure/store.cpp index d4667288..28d4a4dc 100644 --- a/nano/secure/store.cpp +++ b/nano/secure/store.cpp @@ -106,36 +106,6 @@ bool nano::write_transaction::contains (nano::tables table_a) const return impl->contains (table_a); } - -nano::uint128_t nano::block_store::balance (nano::block const & block) const -{ - nano::uint128_t result; - switch (block.type ()) - { - case nano::block_type::open: - case nano::block_type::receive: - case nano::block_type::change: - result = block.sideband ().balance.number (); - break; - case nano::block_type::send: - case nano::block_type::state: - result = block.balance ().number (); - break; - case nano::block_type::invalid: - case nano::block_type::not_a_block: - release_assert (false); - break; - } - return result; -} - -nano::uint128_t nano::block_store::balance (nano::transaction const & transaction, nano::block_hash const & hash) const -{ - auto block = get (transaction, hash); - debug_assert (block != nullptr); - return balance (*block); -} - // clang-format off nano::store::store ( nano::block_store & block_store_a, diff --git a/nano/secure/store.hpp b/nano/secure/store.hpp index 8be2e7d0..6832501a 100644 --- a/nano/secure/store.hpp +++ b/nano/secure/store.hpp @@ -755,8 +755,6 @@ public: virtual nano::store_iterator begin (nano::transaction const &, nano::block_hash const &) const = 0; virtual nano::store_iterator begin (nano::transaction const &) const = 0; virtual nano::store_iterator end () const = 0; - nano::uint128_t balance (nano::block const & block) const; - nano::uint128_t balance (nano::transaction const & transaction, nano::block_hash const & hash) const; virtual nano::epoch version (nano::transaction const &, nano::block_hash const &) = 0; virtual void for_each_par (std::function, nano::store_iterator)> const & action_a) const = 0; virtual uint64_t account_height (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const = 0;