From 08575c5b041783c9a0d22205770e4c03f316f2c5 Mon Sep 17 00:00:00 2001 From: Colin LeMahieu Date: Tue, 20 Aug 2024 11:33:02 +0100 Subject: [PATCH 1/2] Add test to ensure state open blocks have type receive --- nano/rpc_test/rpc.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/nano/rpc_test/rpc.cpp b/nano/rpc_test/rpc.cpp index 1708a36ff..411512a72 100644 --- a/nano/rpc_test/rpc.cpp +++ b/nano/rpc_test/rpc.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -1329,6 +1330,26 @@ TEST (rpc, history_pruning) ASSERT_EQ (usend->hash ().to_string (), entry.get ("hash")); } +TEST (rpc, account_history_state_open) +{ + nano::test::system system; + nano::keypair key; + auto node0 = add_ipc_enabled_node (system); + auto blocks = nano::test::setup_new_account (system, *node0, 1, nano::dev::genesis_key, key, key.pub, true); + auto const rpc_ctx = add_rpc (system, node0); + boost::property_tree::ptree request; + request.put ("action", "account_history"); + request.put ("account", key.pub.to_account ()); + request.put ("count", 1); + auto response (wait_response (system, rpc_ctx, request, 10s)); + auto & history_node (response.get_child ("history")); + ASSERT_EQ (1, history_node.size ()); + auto history0 = *history_node.begin (); + ASSERT_EQ ("1", history0.second.get ("height")); + ASSERT_EQ ("receive", history0.second.get ("type")); + ASSERT_EQ (blocks.second->hash ().to_string (), history0.second.get ("hash")); +} + TEST (rpc, process_block) { nano::test::system system; From ed11b943930ffb4363a73412a5e5f1b21d6b6471 Mon Sep 17 00:00:00 2001 From: Colin LeMahieu Date: Tue, 20 Aug 2024 12:35:43 +0100 Subject: [PATCH 2/2] Properly distinguish between open blocks which have no previous block, and pruned previous blocks. --- nano/node/json_handler.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/nano/node/json_handler.cpp b/nano/node/json_handler.cpp index 10b267d88..726532b21 100644 --- a/nano/node/json_handler.cpp +++ b/nano/node/json_handler.cpp @@ -2525,9 +2525,11 @@ public: tree.put ("previous", block_a.hashables.previous.to_string ()); } auto balance (block_a.hashables.balance.number ()); - auto previous_balance = handler.node.ledger.any.block_balance (transaction, block_a.hashables.previous); - if (!previous_balance) + auto previous_balance_raw = handler.node.ledger.any.block_balance (transaction, block_a.hashables.previous); + auto previous_balance = previous_balance_raw.value_or (0); + if (!block_a.hashables.previous.is_zero () && !previous_balance_raw.has_value ()) { + // If previous hash is non-zero and we can't query the balance, e.g. it's pruned, we can't determine the block type if (raw) { tree.put ("subtype", "unknown"); @@ -2537,7 +2539,7 @@ public: tree.put ("type", "unknown"); } } - else if (balance < previous_balance.value ().number ()) + else if (balance < previous_balance.number ()) { if (should_ignore_account (block_a.hashables.link.as_account ())) { @@ -2553,7 +2555,7 @@ public: tree.put ("type", "send"); } tree.put ("account", block_a.hashables.link.to_account ()); - tree.put ("amount", (previous_balance.value ().number () - balance).convert_to ()); + tree.put ("amount", (previous_balance.number () - balance).convert_to ()); } else { @@ -2592,7 +2594,7 @@ public: { tree.put ("account", source_account.value ().to_account ()); } - tree.put ("amount", (balance - previous_balance.value ().number ()).convert_to ()); + tree.put ("amount", (balance - previous_balance.number ()).convert_to ()); } } }