From 2fc6329a11bb7ae53153df6ed5d11b3c63ef2083 Mon Sep 17 00:00:00 2001 From: clemahieu Date: Wed, 21 Apr 2021 21:14:53 +0200 Subject: [PATCH] This checks the response from ledger::dependencies_confirmed to ensure it supports pruned blocks. (#3218) --- nano/core_test/ledger.cpp | 52 +++++++++++++++++++++++++++++++++++++++ nano/secure/ledger.cpp | 2 +- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/nano/core_test/ledger.cpp b/nano/core_test/ledger.cpp index b83c427e2..b670ae230 100644 --- a/nano/core_test/ledger.cpp +++ b/nano/core_test/ledger.cpp @@ -3238,6 +3238,58 @@ TEST (ledger, dependents_confirmed) ASSERT_TRUE (ledger.dependents_confirmed (transaction, *receive2)); } +TEST (ledger, dependents_confirmed_pruning) +{ + nano::block_builder builder; + nano::logger_mt logger; + auto store = nano::make_store (logger, nano::unique_path ()); + ASSERT_FALSE (store->init_error ()); + nano::stat stats; + nano::ledger ledger (*store, stats); + ledger.pruning = true; + auto transaction (store->tx_begin_write ()); + nano::genesis genesis; + store->initialize (transaction, genesis, ledger.cache); + nano::work_pool pool (std::numeric_limits::max ()); + nano::keypair key1; + auto send1 = builder.state () + .account (nano::genesis_account) + .previous (genesis.hash ()) + .representative (nano::genesis_account) + .balance (nano::genesis_amount - 100) + .link (key1.pub) + .sign (nano::dev_genesis_key.prv, nano::dev_genesis_key.pub) + .work (*pool.generate (genesis.hash ())) + .build_shared (); + ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, *send1).code); + auto send2 = builder.state () + .account (nano::genesis_account) + .previous (send1->hash ()) + .representative (nano::genesis_account) + .balance (nano::genesis_amount - 200) + .link (key1.pub) + .sign (nano::dev_genesis_key.prv, nano::dev_genesis_key.pub) + .work (*pool.generate (send1->hash ())) + .build_shared (); + ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, *send2).code); + nano::confirmation_height_info height; + ASSERT_FALSE (ledger.store.confirmation_height_get (transaction, nano::genesis_account, height)); + height.height = 3; + ledger.store.confirmation_height_put (transaction, nano::genesis_account, height); + ASSERT_TRUE (ledger.block_confirmed (transaction, send1->hash ())); + ASSERT_EQ (2, ledger.pruning_action (transaction, send2->hash (), 1)); + auto receive1 = builder.state () + .account (key1.pub) + .previous (0) + .representative (nano::genesis_account) + .balance (100) + .link (send1->hash ()) + .sign (key1.prv, key1.pub) + .work (*pool.generate (key1.pub)) + .build_shared (); + ASSERT_TRUE (ledger.dependents_confirmed (transaction, *receive1)); +} + TEST (ledger, block_confirmed) { nano::block_builder builder; diff --git a/nano/secure/ledger.cpp b/nano/secure/ledger.cpp index 892c08050..592642aa0 100644 --- a/nano/secure/ledger.cpp +++ b/nano/secure/ledger.cpp @@ -1172,7 +1172,7 @@ bool nano::ledger::dependents_confirmed (nano::transaction const & transaction_a auto result (hash_a.is_zero ()); if (!result) { - result = block_confirmed (transaction_a, hash_a); + result = block_confirmed_or_pruned_exists (transaction_a, hash_a); } return result; });