From 90ed0ffee46ecd9abcf2a53a8673fd44d90719f0 Mon Sep 17 00:00:00 2001 From: clemahieu Date: Fri, 27 Jan 2023 19:19:46 +0000 Subject: [PATCH] Rather than directly accessing the block store, users should use the ledger::pending_info interface to query for pending information. Result is returned as an std::optional instead of the less-obvious way it's currently reported through an error code. Most though not all of the pending_store::get references have been updated to use ledger::pending_info. --- nano/core_test/ledger.cpp | 116 ++++++++++++++++++------------------- nano/node/json_handler.cpp | 6 +- nano/node/node.cpp | 7 +-- nano/node/wallet.cpp | 12 ++-- nano/rpc_test/rpc.cpp | 12 ++-- nano/secure/ledger.cpp | 10 ++++ nano/secure/ledger.hpp | 1 + 7 files changed, 86 insertions(+), 78 deletions(-) diff --git a/nano/core_test/ledger.cpp b/nano/core_test/ledger.cpp index 044d6078..b0494530 100644 --- a/nano/core_test/ledger.cpp +++ b/nano/core_test/ledger.cpp @@ -164,10 +164,10 @@ TEST (ledger, process_send) ASSERT_TRUE (store.frontier.get (transaction, hash2).is_zero ()); auto info5 = ledger.account_info (transaction, key2.pub); ASSERT_FALSE (info5); - nano::pending_info pending1; - ASSERT_FALSE (ledger.store.pending.get (transaction, nano::pending_key (key2.pub, hash1), pending1)); - ASSERT_EQ (nano::dev::genesis_key.pub, pending1.source); - ASSERT_EQ (nano::dev::constants.genesis_amount - 50, pending1.amount.number ()); + auto pending1 = ledger.pending_info (transaction, nano::pending_key (key2.pub, hash1)); + ASSERT_TRUE (pending1); + ASSERT_EQ (nano::dev::genesis_key.pub, pending1->source); + ASSERT_EQ (nano::dev::constants.genesis_amount - 50, pending1->amount.number ()); ASSERT_EQ (0, ledger.account_balance (transaction, key2.pub)); ASSERT_EQ (nano::dev::constants.genesis_amount - 50, ledger.account_receivable (transaction, key2.pub)); ASSERT_EQ (50, ledger.account_balance (transaction, nano::dev::genesis_key.pub)); @@ -184,8 +184,7 @@ TEST (ledger, process_send) ASSERT_TRUE (info7); ASSERT_EQ (1, info7->block_count); ASSERT_EQ (info1->head, info7->head); - nano::pending_info pending2; - ASSERT_TRUE (ledger.store.pending.get (transaction, nano::pending_key (key2.pub, hash1), pending2)); + ASSERT_FALSE (ledger.pending_info (transaction, nano::pending_key (key2.pub, hash1))); ASSERT_EQ (nano::dev::constants.genesis_amount, ledger.account_balance (transaction, nano::dev::genesis_key.pub)); ASSERT_EQ (0, ledger.account_receivable (transaction, key2.pub)); ASSERT_EQ (store.account.count (transaction), ledger.cache.account_count); @@ -272,10 +271,10 @@ TEST (ledger, process_receive) ASSERT_EQ (nano::dev::constants.genesis_amount - 50, ledger.account_balance (transaction, key2.pub)); ASSERT_EQ (nano::dev::constants.genesis_amount - 50, ledger.weight (key3.pub)); ASSERT_EQ (hash2, ledger.latest (transaction, key2.pub)); - nano::pending_info pending1; - ASSERT_FALSE (ledger.store.pending.get (transaction, nano::pending_key (key2.pub, hash3), pending1)); - ASSERT_EQ (nano::dev::genesis_key.pub, pending1.source); - ASSERT_EQ (25, pending1.amount.number ()); + auto pending1 = ledger.pending_info (transaction, nano::pending_key (key2.pub, hash3)); + ASSERT_TRUE (pending1); + ASSERT_EQ (nano::dev::genesis_key.pub, pending1->source); + ASSERT_EQ (25, pending1->amount.number ()); ASSERT_EQ (store.account.count (transaction), ledger.cache.account_count); } @@ -325,8 +324,7 @@ TEST (ledger, rollback_receiver) ASSERT_EQ (0, ledger.weight (key3.pub)); ASSERT_FALSE (ledger.account_info (transaction, key2.pub)); ASSERT_EQ (store.account.count (transaction), ledger.cache.account_count); - nano::pending_info pending1; - ASSERT_TRUE (store.pending.get (transaction, nano::pending_key{ key2.pub, hash1 }, pending1)); + ASSERT_FALSE (ledger.pending_info (transaction, nano::pending_key{ key2.pub, hash1 })); } TEST (ledger, rollback_representation) @@ -3099,10 +3097,10 @@ TEST (ledger, state_rollback_send) ASSERT_EQ (*send1, *send2); ASSERT_EQ (nano::dev::constants.genesis_amount - nano::Gxrb_ratio, ledger.account_balance (transaction, nano::dev::genesis->account ())); ASSERT_EQ (nano::dev::constants.genesis_amount - nano::Gxrb_ratio, ledger.weight (nano::dev::genesis->account ())); - nano::pending_info info; - ASSERT_FALSE (store.pending.get (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ()), info)); - ASSERT_EQ (nano::dev::genesis->account (), info.source); - ASSERT_EQ (nano::Gxrb_ratio, info.amount.number ()); + auto info = ledger.pending_info (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ())); + ASSERT_TRUE (info); + ASSERT_EQ (nano::dev::genesis->account (), info->source); + ASSERT_EQ (nano::Gxrb_ratio, info->amount.number ()); ASSERT_FALSE (ledger.rollback (transaction, send1->hash ())); ASSERT_FALSE (store.block.exists (transaction, send1->hash ())); ASSERT_EQ (nano::dev::constants.genesis_amount, ledger.account_balance (transaction, nano::dev::genesis->account ())); @@ -3144,10 +3142,10 @@ TEST (ledger, state_rollback_receive) ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, *receive1).code); ASSERT_FALSE (store.pending.exists (transaction, nano::pending_key (nano::dev::genesis->account (), receive1->hash ()))); ASSERT_FALSE (ledger.rollback (transaction, receive1->hash ())); - nano::pending_info info; - ASSERT_FALSE (store.pending.get (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ()), info)); - ASSERT_EQ (nano::dev::genesis->account (), info.source); - ASSERT_EQ (nano::Gxrb_ratio, info.amount.number ()); + auto info = ledger.pending_info (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ())); + ASSERT_TRUE (info); + ASSERT_EQ (nano::dev::genesis->account (), info->source); + ASSERT_EQ (nano::Gxrb_ratio, info->amount.number ()); ASSERT_FALSE (store.block.exists (transaction, receive1->hash ())); ASSERT_EQ (nano::dev::constants.genesis_amount - nano::Gxrb_ratio, ledger.account_balance (transaction, nano::dev::genesis->account ())); ASSERT_EQ (nano::dev::constants.genesis_amount - nano::Gxrb_ratio, ledger.weight (nano::dev::genesis->account ())); @@ -3259,10 +3257,10 @@ TEST (ledger, state_open_rollback) ASSERT_FALSE (store.block.exists (transaction, open1->hash ())); ASSERT_EQ (0, ledger.account_balance (transaction, destination.pub)); ASSERT_EQ (nano::dev::constants.genesis_amount - nano::Gxrb_ratio, ledger.weight (nano::dev::genesis->account ())); - nano::pending_info info; - ASSERT_FALSE (store.pending.get (transaction, nano::pending_key (destination.pub, send1->hash ()), info)); - ASSERT_EQ (nano::dev::genesis->account (), info.source); - ASSERT_EQ (nano::Gxrb_ratio, info.amount.number ()); + auto info = ledger.pending_info (transaction, nano::pending_key (destination.pub, send1->hash ())); + ASSERT_TRUE (info); + ASSERT_EQ (nano::dev::genesis->account (), info->source); + ASSERT_EQ (nano::Gxrb_ratio, info->amount.number ()); ASSERT_EQ (store.account.count (transaction), ledger.cache.account_count); } @@ -3724,11 +3722,11 @@ TEST (ledger, epoch_blocks_receive_upgrade) destination_info = ledger.account_info (transaction, destination.pub); ASSERT_TRUE (destination_info); ASSERT_EQ (destination_info->epoch (), nano::epoch::epoch_0); - nano::pending_info pending_send2; - ASSERT_FALSE (ledger.store.pending.get (transaction, nano::pending_key (destination.pub, send2->hash ()), pending_send2)); - ASSERT_EQ (nano::dev::genesis_key.pub, pending_send2.source); - ASSERT_EQ (nano::Gxrb_ratio, pending_send2.amount.number ()); - ASSERT_EQ (nano::epoch::epoch_1, pending_send2.epoch); + auto pending_send2 = ledger.pending_info (transaction, nano::pending_key (destination.pub, send2->hash ())); + ASSERT_TRUE (pending_send2); + ASSERT_EQ (nano::dev::genesis_key.pub, pending_send2->source); + ASSERT_EQ (nano::Gxrb_ratio, pending_send2->amount.number ()); + ASSERT_EQ (nano::epoch::epoch_1, pending_send2->epoch); ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, *receive2).code); ASSERT_EQ (nano::epoch::epoch_1, receive2->sideband ().details.epoch); ASSERT_EQ (nano::epoch::epoch_1, receive2->sideband ().source_epoch); @@ -5131,11 +5129,11 @@ TEST (ledger, pruning_source_rollback) ASSERT_FALSE (store->block.exists (transaction, epoch1->hash ())); ASSERT_TRUE (store->pruned.exists (transaction, epoch1->hash ())); ASSERT_TRUE (store->block.exists (transaction, nano::dev::genesis->hash ())); - nano::pending_info info; - ASSERT_FALSE (store->pending.get (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ()), info)); - ASSERT_EQ (nano::dev::genesis->account (), info.source); - ASSERT_EQ (nano::Gxrb_ratio, info.amount.number ()); - ASSERT_EQ (nano::epoch::epoch_1, info.epoch); + auto info = ledger.pending_info (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ())); + ASSERT_TRUE (info); + ASSERT_EQ (nano::dev::genesis->account (), info->source); + ASSERT_EQ (nano::Gxrb_ratio, info->amount.number ()); + ASSERT_EQ (nano::epoch::epoch_1, info->epoch); // Receiving pruned block auto receive1 = builder .state () @@ -5153,11 +5151,11 @@ TEST (ledger, pruning_source_rollback) ASSERT_EQ (5, ledger.cache.block_count); // Rollback receive block ASSERT_FALSE (ledger.rollback (transaction, receive1->hash ())); - nano::pending_info info2; - ASSERT_FALSE (store->pending.get (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ()), info2)); - ASSERT_NE (nano::dev::genesis->account (), info2.source); // Tradeoff to not store pruned blocks accounts - ASSERT_EQ (nano::Gxrb_ratio, info2.amount.number ()); - ASSERT_EQ (nano::epoch::epoch_1, info2.epoch); + auto info2 = ledger.pending_info (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ())); + ASSERT_TRUE (info2); + ASSERT_NE (nano::dev::genesis->account (), info2->source); // Tradeoff to not store pruned blocks accounts + ASSERT_EQ (nano::Gxrb_ratio, info2->amount.number ()); + ASSERT_EQ (nano::epoch::epoch_1, info2->epoch); // Process receive block again ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, *receive1).code); ASSERT_FALSE (store->pending.exists (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ()))); @@ -5217,16 +5215,16 @@ TEST (ledger, pruning_source_rollback_legacy) ASSERT_FALSE (store->block.exists (transaction, send1->hash ())); ASSERT_TRUE (store->pruned.exists (transaction, send1->hash ())); ASSERT_TRUE (store->block.exists (transaction, nano::dev::genesis->hash ())); - nano::pending_info info1; - ASSERT_FALSE (store->pending.get (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ()), info1)); - ASSERT_EQ (nano::dev::genesis->account (), info1.source); - ASSERT_EQ (nano::Gxrb_ratio, info1.amount.number ()); - ASSERT_EQ (nano::epoch::epoch_0, info1.epoch); - nano::pending_info info2; - ASSERT_FALSE (store->pending.get (transaction, nano::pending_key (key1.pub, send2->hash ()), info2)); - ASSERT_EQ (nano::dev::genesis->account (), info2.source); - ASSERT_EQ (nano::Gxrb_ratio, info2.amount.number ()); - ASSERT_EQ (nano::epoch::epoch_0, info2.epoch); + auto info1 = ledger.pending_info (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ())); + ASSERT_TRUE (info1); + ASSERT_EQ (nano::dev::genesis->account (), info1->source); + ASSERT_EQ (nano::Gxrb_ratio, info1->amount.number ()); + ASSERT_EQ (nano::epoch::epoch_0, info1->epoch); + auto info2 = ledger.pending_info (transaction, nano::pending_key (key1.pub, send2->hash ())); + ASSERT_TRUE (info2); + ASSERT_EQ (nano::dev::genesis->account (), info2->source); + ASSERT_EQ (nano::Gxrb_ratio, info2->amount.number ()); + ASSERT_EQ (nano::epoch::epoch_0, info2->epoch); // Receiving pruned block auto receive1 = builder .receive () @@ -5241,11 +5239,11 @@ TEST (ledger, pruning_source_rollback_legacy) ASSERT_EQ (5, ledger.cache.block_count); // Rollback receive block ASSERT_FALSE (ledger.rollback (transaction, receive1->hash ())); - nano::pending_info info3; - ASSERT_FALSE (store->pending.get (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ()), info3)); - ASSERT_NE (nano::dev::genesis->account (), info3.source); // Tradeoff to not store pruned blocks accounts - ASSERT_EQ (nano::Gxrb_ratio, info3.amount.number ()); - ASSERT_EQ (nano::epoch::epoch_0, info3.epoch); + auto info3 = ledger.pending_info (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ())); + ASSERT_TRUE (info3); + ASSERT_NE (nano::dev::genesis->account (), info3->source); // Tradeoff to not store pruned blocks accounts + ASSERT_EQ (nano::Gxrb_ratio, info3->amount.number ()); + ASSERT_EQ (nano::epoch::epoch_0, info3->epoch); // Process receive block again ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, *receive1).code); ASSERT_FALSE (store->pending.exists (transaction, nano::pending_key (nano::dev::genesis->account (), send1->hash ()))); @@ -5266,11 +5264,11 @@ TEST (ledger, pruning_source_rollback_legacy) ASSERT_EQ (6, ledger.cache.block_count); // Rollback open block ASSERT_FALSE (ledger.rollback (transaction, open1->hash ())); - nano::pending_info info4; - ASSERT_FALSE (store->pending.get (transaction, nano::pending_key (key1.pub, send2->hash ()), info4)); - ASSERT_NE (nano::dev::genesis->account (), info4.source); // Tradeoff to not store pruned blocks accounts - ASSERT_EQ (nano::Gxrb_ratio, info4.amount.number ()); - ASSERT_EQ (nano::epoch::epoch_0, info4.epoch); + auto info4 = ledger.pending_info (transaction, nano::pending_key (key1.pub, send2->hash ())); + ASSERT_TRUE (info4); + ASSERT_NE (nano::dev::genesis->account (), info4->source); // Tradeoff to not store pruned blocks accounts + ASSERT_EQ (nano::Gxrb_ratio, info4->amount.number ()); + ASSERT_EQ (nano::epoch::epoch_0, info4->epoch); // Process open block again ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, *open1).code); ASSERT_FALSE (store->pending.exists (transaction, nano::pending_key (key1.pub, send2->hash ()))); diff --git a/nano/node/json_handler.cpp b/nano/node/json_handler.cpp index 18403498..2c859b3d 100644 --- a/nano/node/json_handler.cpp +++ b/nano/node/json_handler.cpp @@ -3376,14 +3376,14 @@ void nano::json_handler::receive () auto block_transaction (node.store.tx_begin_read ()); if (node.ledger.block_or_pruned_exists (block_transaction, hash)) { - nano::pending_info pending_info; - if (!node.store.pending.get (block_transaction, nano::pending_key (account, hash), pending_info)) + auto pending_info = node.ledger.pending_info (block_transaction, nano::pending_key (account, hash)); + if (pending_info) { auto work (work_optional_impl ()); if (!ec && work) { nano::root head; - nano::epoch epoch = pending_info.epoch; + nano::epoch epoch = pending_info->epoch; auto info = node.ledger.account_info (block_transaction, account); if (info) { diff --git a/nano/node/node.cpp b/nano/node/node.cpp index 3b433eae..70eb5a9a 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -1314,12 +1314,11 @@ void nano::node::receive_confirmed (nano::transaction const & block_transaction_ if (wallet->store.exists (wallet_transaction, destination_a)) { nano::account representative; - nano::pending_info pending; representative = wallet->store.representative (wallet_transaction); - auto error (store.pending.get (block_transaction_a, nano::pending_key (destination_a, hash_a), pending)); - if (!error) + auto pending = ledger.pending_info (block_transaction_a, nano::pending_key (destination_a, hash_a)); + if (pending) { - auto amount (pending.amount.number ()); + auto amount (pending->amount.number ()); wallet->receive_async (hash_a, representative, amount, destination_a, [] (std::shared_ptr const &) {}); } else diff --git a/nano/node/wallet.cpp b/nano/node/wallet.cpp index 79a64e94..73badcbc 100644 --- a/nano/node/wallet.cpp +++ b/nano/node/wallet.cpp @@ -837,10 +837,10 @@ std::shared_ptr nano::wallet::receive_action (nano::block_hash cons { auto block_transaction (wallets.node.ledger.store.tx_begin_read ()); auto transaction (wallets.tx_begin_read ()); - nano::pending_info pending_info; if (wallets.node.ledger.block_or_pruned_exists (block_transaction, send_hash_a)) { - if (!wallets.node.ledger.store.pending.get (block_transaction, nano::pending_key (account_a, send_hash_a), pending_info)) + auto pending_info = wallets.node.ledger.pending_info (block_transaction, nano::pending_key (account_a, send_hash_a)); + if (pending_info) { nano::raw_key prv; if (!store.fetch (transaction, account_a, prv)) @@ -852,13 +852,13 @@ std::shared_ptr nano::wallet::receive_action (nano::block_hash cons auto info = wallets.node.ledger.account_info (block_transaction, account_a); if (info) { - block = std::make_shared (account_a, info->head, info->representative, info->balance.number () + pending_info.amount.number (), send_hash_a, prv, account_a, work_a); - details.epoch = std::max (info->epoch (), pending_info.epoch); + block = std::make_shared (account_a, info->head, info->representative, info->balance.number () + pending_info->amount.number (), send_hash_a, prv, account_a, work_a); + details.epoch = std::max (info->epoch (), pending_info->epoch); } else { - block = std::make_shared (account_a, 0, representative_a, pending_info.amount, reinterpret_cast (send_hash_a), prv, account_a, work_a); - details.epoch = pending_info.epoch; + block = std::make_shared (account_a, 0, representative_a, pending_info->amount, reinterpret_cast (send_hash_a), prv, account_a, work_a); + details.epoch = pending_info->epoch; } } else diff --git a/nano/rpc_test/rpc.cpp b/nano/rpc_test/rpc.cpp index bf8fe4d0..79c2b19e 100644 --- a/nano/rpc_test/rpc.cpp +++ b/nano/rpc_test/rpc.cpp @@ -6925,9 +6925,9 @@ TEST (rpc, epoch_upgrade) { // Check pending entry auto transaction (node->store.tx_begin_read ()); - nano::pending_info info; - ASSERT_FALSE (node->store.pending.get (transaction, nano::pending_key (key3.pub, send7->hash ()), info)); - ASSERT_EQ (nano::epoch::epoch_1, info.epoch); + auto info = node->ledger.pending_info (transaction, nano::pending_key (key3.pub, send7->hash ())); + ASSERT_TRUE (info); + ASSERT_EQ (nano::epoch::epoch_1, info->epoch); } rpc_ctx.io_scope->renew (); @@ -7091,9 +7091,9 @@ TEST (rpc, epoch_upgrade_multithreaded) { // Check pending entry auto transaction (node->store.tx_begin_read ()); - nano::pending_info info; - ASSERT_FALSE (node->store.pending.get (transaction, nano::pending_key (key3.pub, send7->hash ()), info)); - ASSERT_EQ (nano::epoch::epoch_1, info.epoch); + auto info = node->ledger.pending_info (transaction, nano::pending_key (key3.pub, send7->hash ())); + ASSERT_TRUE (info); + ASSERT_EQ (nano::epoch::epoch_1, info->epoch); } rpc_ctx.io_scope->renew (); diff --git a/nano/secure/ledger.cpp b/nano/secure/ledger.cpp index e5a6c12e..9f8e2954 100644 --- a/nano/secure/ledger.cpp +++ b/nano/secure/ledger.cpp @@ -802,6 +802,16 @@ nano::uint128_t nano::ledger::account_receivable (nano::transaction const & tran return result; } +std::optional nano::ledger::pending_info (nano::transaction const & transaction, nano::pending_key const & key) const +{ + nano::pending_info result; + if (!store.pending.get (transaction, key, result)) + { + return result; + } + return std::nullopt; +} + nano::process_return nano::ledger::process (nano::write_transaction const & transaction_a, nano::block & block_a) { debug_assert (!constants.work.validate_entry (block_a) || constants.genesis == nano::dev::genesis); diff --git a/nano/secure/ledger.hpp b/nano/secure/ledger.hpp index d12b0d1c..9cbb78c2 100644 --- a/nano/secure/ledger.hpp +++ b/nano/secure/ledger.hpp @@ -67,6 +67,7 @@ public: 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; + std::optional pending_info (nano::transaction const & transaction, nano::pending_key const & key) const; nano::process_return process (nano::write_transaction const &, nano::block &); bool rollback (nano::write_transaction const &, nano::block_hash const &, std::vector> &); bool rollback (nano::write_transaction const &, nano::block_hash const &);