Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add confirmation height #1770

Merged
merged 30 commits into from Mar 3, 2019
Merged
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
dea4861
Upgrade database confirmation height to 0
wezrule Feb 11, 2019
ade75aa
Merge branch 'master' into confirmation_height
wezrule Feb 11, 2019
63aacca
Constify getters
wezrule Feb 11, 2019
655842a
Set confirmation when blocks are confirmed
wezrule Feb 14, 2019
9387395
Merge branch 'master' into confirmation_height
wezrule Feb 15, 2019
e2f6e7d
iterative solution working however it needs to only do it on live con…
wezrule Feb 15, 2019
31513ac
Merge branch 'master' into confirmation_height
wezrule Feb 18, 2019
9f4f930
Update with new sideband height open blocks starting at 1
wezrule Feb 18, 2019
d26bd23
Remove unnecessary changes. Make sure it is done with live transactio…
wezrule Feb 22, 2019
a983a62
Formatting
wezrule Feb 22, 2019
f92a3ed
Merge with master
wezrule Feb 22, 2019
243dc10
Fix incorrect merge
wezrule Feb 22, 2019
7b233e3
Update account info in db separately from traversing old data
wezrule Feb 22, 2019
d7428ac
Add account_confirmation_height RPC
wezrule Feb 22, 2019
9679cf2
Merged with master
wezrule Feb 22, 2019
d25e0ca
Fix 128 nested deep blocks error with MSVC
wezrule Feb 23, 2019
50c52f8
Remove unneeded include
wezrule Feb 23, 2019
41676a3
Add confirmation_height_clear CLI optional option to --snapshot
wezrule Feb 26, 2019
e0c6275
Check confirmation height in --snapshot option is not 0 before trying…
wezrule Feb 26, 2019
f48c155
Add --confirmation_height_clear as an independent CLI option
wezrule Feb 26, 2019
c5be171
Merged with master
wezrule Feb 28, 2019
3ee1342
Rpc conflict
wezrule Feb 28, 2019
d501184
Make review suggestions
wezrule Feb 28, 2019
d18cbed
Be able to selectively clear confirmation height for an account via CLI
wezrule Feb 28, 2019
aa663d3
Remove old test and the unnecessary check for confirmation == 0. Revi…
wezrule Mar 1, 2019
14e8089
Add tests for accounts which have gaps in them, and remove unused unc…
wezrule Mar 1, 2019
7b458dd
Merged with master
wezrule Mar 2, 2019
5f1f260
Add missing block_confirmed rpc_handler function to map after merge
wezrule Mar 2, 2019
938af9c
Make release_assert a gtest assert in block_store test
wezrule Mar 2, 2019
c19f4cf
Put transaction back to read in process_confirmed
wezrule Mar 3, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
272 changes: 174 additions & 98 deletions nano/core_test/block_store.cpp

Large diffs are not rendered by default.

74 changes: 50 additions & 24 deletions nano/core_test/ledger.cpp
Expand Up @@ -132,7 +132,7 @@ TEST (ledger, process_send)
auto latest5 (dynamic_cast<nano::open_block *> (latest4.get ()));
ASSERT_NE (nullptr, latest5);
ASSERT_EQ (open, *latest5);
ledger.rollback (transaction, hash2);
ASSERT_FALSE (ledger.rollback (transaction, hash2));
ASSERT_TRUE (store.frontier_get (transaction, hash2).is_zero ());
nano::account_info info5;
ASSERT_TRUE (ledger.store.account_get (transaction, key2.pub, info5));
Expand All @@ -148,7 +148,7 @@ TEST (ledger, process_send)
nano::account_info info6;
ASSERT_FALSE (ledger.store.account_get (transaction, nano::test_genesis_key.pub, info6));
ASSERT_EQ (hash1, info6.head);
ledger.rollback (transaction, info6.head);
ASSERT_FALSE (ledger.rollback (transaction, info6.head));
ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::test_genesis_key.pub));
ASSERT_EQ (nano::test_genesis_key.pub, store.frontier_get (transaction, info1.head));
ASSERT_TRUE (store.frontier_get (transaction, hash1).is_zero ());
Expand Down Expand Up @@ -205,7 +205,7 @@ TEST (ledger, process_receive)
ASSERT_EQ (0, ledger.account_pending (transaction, key2.pub));
ASSERT_EQ (nano::genesis_amount - 25, ledger.account_balance (transaction, key2.pub));
ASSERT_EQ (nano::genesis_amount - 25, ledger.weight (transaction, key3.pub));
ledger.rollback (transaction, hash4);
ASSERT_FALSE (ledger.rollback (transaction, hash4));
ASSERT_TRUE (store.block_successor (transaction, hash2).is_zero ());
ASSERT_EQ (key2.pub, store.frontier_get (transaction, hash2));
ASSERT_TRUE (store.frontier_get (transaction, hash4).is_zero ());
Expand Down Expand Up @@ -247,7 +247,7 @@ TEST (ledger, rollback_receiver)
ASSERT_EQ (50, ledger.weight (transaction, nano::test_genesis_key.pub));
ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
ASSERT_EQ (nano::genesis_amount - 50, ledger.weight (transaction, key3.pub));
ledger.rollback (transaction, hash1);
ASSERT_FALSE (ledger.rollback (transaction, hash1));
ASSERT_EQ (nano::genesis_amount, ledger.account_balance (transaction, nano::test_genesis_key.pub));
ASSERT_EQ (0, ledger.account_balance (transaction, key2.pub));
ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::test_genesis_key.pub));
Expand Down Expand Up @@ -291,21 +291,21 @@ TEST (ledger, rollback_representation)
nano::account_info info1;
ASSERT_FALSE (store.account_get (transaction, key2.pub, info1));
ASSERT_EQ (open.hash (), info1.rep_block);
ledger.rollback (transaction, receive1.hash ());
ASSERT_FALSE (ledger.rollback (transaction, receive1.hash ()));
nano::account_info info2;
ASSERT_FALSE (store.account_get (transaction, key2.pub, info2));
ASSERT_EQ (open.hash (), info2.rep_block);
ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
ASSERT_EQ (nano::genesis_amount - 50, ledger.weight (transaction, key4.pub));
ledger.rollback (transaction, open.hash ());
ASSERT_FALSE (ledger.rollback (transaction, open.hash ()));
ASSERT_EQ (1, ledger.weight (transaction, key3.pub));
ASSERT_EQ (0, ledger.weight (transaction, key4.pub));
ledger.rollback (transaction, send1.hash ());
ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, key3.pub));
nano::account_info info3;
ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info3));
ASSERT_EQ (change2.hash (), info3.rep_block);
ledger.rollback (transaction, change2.hash ());
ASSERT_FALSE (ledger.rollback (transaction, change2.hash ()));
nano::account_info info4;
ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info4));
ASSERT_EQ (change1.hash (), info4.rep_block);
Expand All @@ -328,7 +328,7 @@ TEST (ledger, receive_rollback)
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send).code);
nano::receive_block receive (send.hash (), send.hash (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive).code);
ledger.rollback (transaction, receive.hash ());
ASSERT_FALSE (ledger.rollback (transaction, receive.hash ()));
}

TEST (ledger, process_duplicate)
Expand Down Expand Up @@ -413,7 +413,7 @@ TEST (ledger, representative_change)
nano::account_info info2;
ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info2));
ASSERT_EQ (block.hash (), info2.head);
ledger.rollback (transaction, info2.head);
ASSERT_FALSE (ledger.rollback (transaction, info2.head));
ASSERT_EQ (nano::test_genesis_key.pub, store.frontier_get (transaction, info1.head));
ASSERT_TRUE (store.frontier_get (transaction, block.hash ()).is_zero ());
nano::account_info info3;
Expand Down Expand Up @@ -685,7 +685,7 @@ TEST (ledger, double_open)
ASSERT_EQ (nano::process_result::fork, ledger.process (transaction, open2).code);
}

TEST (ledegr, double_receive)
TEST (ledger, double_receive)
{
nano::logging logging;
bool init (false);
Expand Down Expand Up @@ -1509,23 +1509,23 @@ TEST (ledger, send_open_receive_rollback)
ASSERT_EQ (100, ledger.weight (transaction, key2.pub));
ASSERT_EQ (0, ledger.weight (transaction, nano::test_genesis_key.pub));
ASSERT_EQ (nano::genesis_amount - 100, ledger.weight (transaction, key3.pub));
ledger.rollback (transaction, receive.hash ());
ASSERT_FALSE (ledger.rollback (transaction, receive.hash ()));
ASSERT_EQ (50, ledger.weight (transaction, key2.pub));
ASSERT_EQ (0, ledger.weight (transaction, nano::test_genesis_key.pub));
ASSERT_EQ (nano::genesis_amount - 100, ledger.weight (transaction, key3.pub));
ledger.rollback (transaction, open.hash ());
ASSERT_FALSE (ledger.rollback (transaction, open.hash ()));
ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
ASSERT_EQ (0, ledger.weight (transaction, nano::test_genesis_key.pub));
ASSERT_EQ (nano::genesis_amount - 100, ledger.weight (transaction, key3.pub));
ledger.rollback (transaction, change1.hash ());
ASSERT_FALSE (ledger.rollback (transaction, change1.hash ()));
ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
ASSERT_EQ (0, ledger.weight (transaction, key3.pub));
ASSERT_EQ (nano::genesis_amount - 100, ledger.weight (transaction, nano::test_genesis_key.pub));
ledger.rollback (transaction, send2.hash ());
ASSERT_FALSE (ledger.rollback (transaction, send2.hash ()));
ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
ASSERT_EQ (0, ledger.weight (transaction, key3.pub));
ASSERT_EQ (nano::genesis_amount - 50, ledger.weight (transaction, nano::test_genesis_key.pub));
ledger.rollback (transaction, send1.hash ());
ASSERT_FALSE (ledger.rollback (transaction, send1.hash ()));
ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
ASSERT_EQ (0, ledger.weight (transaction, key3.pub));
ASSERT_EQ (nano::genesis_amount - 0, ledger.weight (transaction, nano::test_genesis_key.pub));
Expand Down Expand Up @@ -2101,7 +2101,7 @@ TEST (ledger, state_rollback_send)
ASSERT_FALSE (store.pending_get (transaction, nano::pending_key (nano::genesis_account, send1.hash ()), info));
ASSERT_EQ (nano::genesis_account, info.source);
ASSERT_EQ (nano::Gxrb_ratio, info.amount.number ());
ledger.rollback (transaction, send1.hash ());
ASSERT_FALSE (ledger.rollback (transaction, send1.hash ()));
ASSERT_FALSE (store.block_exists (transaction, send1.hash ()));
ASSERT_EQ (nano::genesis_amount, ledger.account_balance (transaction, nano::genesis_account));
ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::genesis_account));
Expand All @@ -2125,7 +2125,7 @@ TEST (ledger, state_rollback_receive)
nano::state_block receive1 (nano::genesis_account, send1.hash (), nano::genesis_account, nano::genesis_amount, send1.hash (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
ASSERT_FALSE (store.pending_exists (transaction, nano::pending_key (nano::genesis_account, receive1.hash ())));
ledger.rollback (transaction, receive1.hash ());
ASSERT_FALSE (ledger.rollback (transaction, receive1.hash ()));
nano::pending_info info;
ASSERT_FALSE (store.pending_get (transaction, nano::pending_key (nano::genesis_account, send1.hash ()), info));
ASSERT_EQ (nano::genesis_account, info.source);
Expand All @@ -2152,7 +2152,7 @@ TEST (ledger, state_rollback_received_send)
nano::state_block receive1 (key.pub, 0, key.pub, nano::Gxrb_ratio, send1.hash (), key.prv, key.pub, 0);
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
ASSERT_FALSE (store.pending_exists (transaction, nano::pending_key (nano::genesis_account, receive1.hash ())));
ledger.rollback (transaction, send1.hash ());
ASSERT_FALSE (ledger.rollback (transaction, send1.hash ()));
ASSERT_FALSE (store.pending_exists (transaction, nano::pending_key (nano::genesis_account, send1.hash ())));
ASSERT_FALSE (store.block_exists (transaction, send1.hash ()));
ASSERT_FALSE (store.block_exists (transaction, receive1.hash ()));
Expand All @@ -2176,7 +2176,7 @@ TEST (ledger, state_rep_change_rollback)
nano::keypair rep;
nano::state_block change1 (nano::genesis_account, genesis.hash (), rep.pub, nano::genesis_amount, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, change1).code);
ledger.rollback (transaction, change1.hash ());
ASSERT_FALSE (ledger.rollback (transaction, change1.hash ()));
ASSERT_FALSE (store.block_exists (transaction, change1.hash ()));
ASSERT_EQ (nano::genesis_amount, ledger.account_balance (transaction, nano::genesis_account));
ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::genesis_account));
Expand All @@ -2199,7 +2199,7 @@ TEST (ledger, state_open_rollback)
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
nano::state_block open1 (destination.pub, 0, nano::genesis_account, nano::Gxrb_ratio, send1.hash (), destination.prv, destination.pub, 0);
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
ledger.rollback (transaction, open1.hash ());
ASSERT_FALSE (ledger.rollback (transaction, open1.hash ()));
ASSERT_FALSE (store.block_exists (transaction, open1.hash ()));
ASSERT_EQ (0, ledger.account_balance (transaction, destination.pub));
ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.weight (transaction, nano::genesis_account));
Expand All @@ -2223,7 +2223,7 @@ TEST (ledger, state_send_change_rollback)
nano::keypair rep;
nano::state_block send1 (nano::genesis_account, genesis.hash (), rep.pub, nano::genesis_amount - nano::Gxrb_ratio, nano::genesis_account, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
ledger.rollback (transaction, send1.hash ());
ASSERT_FALSE (ledger.rollback (transaction, send1.hash ()));
ASSERT_FALSE (store.block_exists (transaction, send1.hash ()));
ASSERT_EQ (nano::genesis_amount, ledger.account_balance (transaction, nano::genesis_account));
ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::genesis_account));
Expand All @@ -2246,7 +2246,7 @@ TEST (ledger, state_receive_change_rollback)
nano::keypair rep;
nano::state_block receive1 (nano::genesis_account, send1.hash (), rep.pub, nano::genesis_amount, send1.hash (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
ledger.rollback (transaction, receive1.hash ());
ASSERT_FALSE (ledger.rollback (transaction, receive1.hash ()));
ASSERT_FALSE (store.block_exists (transaction, receive1.hash ()));
ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.account_balance (transaction, nano::genesis_account));
ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.weight (transaction, nano::genesis_account));
Expand All @@ -2273,7 +2273,7 @@ TEST (ledger, epoch_blocks_general)
nano::account_info genesis_info;
ASSERT_FALSE (ledger.store.account_get (transaction, nano::genesis_account, genesis_info));
ASSERT_EQ (genesis_info.epoch, nano::epoch::epoch_1);
ledger.rollback (transaction, epoch1.hash ());
ASSERT_FALSE (ledger.rollback (transaction, epoch1.hash ()));
ASSERT_FALSE (ledger.store.account_get (transaction, nano::genesis_account, genesis_info));
ASSERT_EQ (genesis_info.epoch, nano::epoch::epoch_0);
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, epoch1).code);
Expand Down Expand Up @@ -2328,7 +2328,7 @@ TEST (ledger, epoch_blocks_receive_upgrade)
nano::account_info destination_info;
ASSERT_FALSE (ledger.store.account_get (transaction, destination.pub, destination_info));
ASSERT_EQ (destination_info.epoch, nano::epoch::epoch_1);
ledger.rollback (transaction, receive2.hash ());
ASSERT_FALSE (ledger.rollback (transaction, receive2.hash ()));
ASSERT_FALSE (ledger.store.account_get (transaction, destination.pub, destination_info));
ASSERT_EQ (destination_info.epoch, nano::epoch::epoch_0);
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive2).code);
Expand Down Expand Up @@ -2587,3 +2587,29 @@ TEST (ledger, unchecked_receive)
ASSERT_EQ (unchecked_count, 0);
}
}

TEST (ledger, confirmation_height_not_updated)
{
bool error (false);
nano::logging logging;
nano::mdb_store store (error, logging, nano::unique_path ());
ASSERT_TRUE (!error);
nano::stat stats;
nano::ledger ledger (store, stats);
auto transaction (store.tx_begin (true));
nano::genesis genesis;
store.initialize (transaction, genesis);
nano::account_info account_info;
ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, account_info));
nano::keypair key;
nano::send_block send1 (account_info.head, key.pub, 50, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
ASSERT_EQ (0, account_info.confirmation_height);
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, account_info));
ASSERT_EQ (0, account_info.confirmation_height);
nano::open_block open1 (send1.hash (), nano::genesis_account, key.pub, key.prv, key.pub, 0);
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
nano::account_info account_info1;
ASSERT_FALSE (store.account_get (transaction, key.pub, account_info1));
ASSERT_EQ (0, account_info1.confirmation_height);
}