Tracking block count for each account.
This commit is contained in:
parent
eae2e6d073
commit
bb10027287
8 changed files with 190 additions and 32 deletions
|
|
@ -279,7 +279,7 @@ TEST (block_store, frontier_retrieval)
|
||||||
rai::block_store store (init, rai::unique_path ());
|
rai::block_store store (init, rai::unique_path ());
|
||||||
ASSERT_TRUE (!init);
|
ASSERT_TRUE (!init);
|
||||||
rai::account account1 (0);
|
rai::account account1 (0);
|
||||||
rai::account_info info1 (0, 0, 0, 0, 0);
|
rai::account_info info1 (0, 0, 0, 0, 0, 0);
|
||||||
rai::transaction transaction (store.environment, nullptr, true);
|
rai::transaction transaction (store.environment, nullptr, true);
|
||||||
store.account_put (transaction, account1, info1);
|
store.account_put (transaction, account1, info1);
|
||||||
rai::account_info info2;
|
rai::account_info info2;
|
||||||
|
|
@ -295,7 +295,7 @@ TEST (block_store, one_account)
|
||||||
rai::account account (0);
|
rai::account account (0);
|
||||||
rai::block_hash hash (0);
|
rai::block_hash hash (0);
|
||||||
rai::transaction transaction (store.environment, nullptr, true);
|
rai::transaction transaction (store.environment, nullptr, true);
|
||||||
store.account_put (transaction, account, {hash, account, hash, 42, 100});
|
store.account_put (transaction, account, {hash, account, hash, 42, 100, 200});
|
||||||
auto begin (store.latest_begin (transaction));
|
auto begin (store.latest_begin (transaction));
|
||||||
auto end (store.latest_end ());
|
auto end (store.latest_end ());
|
||||||
ASSERT_NE (end, begin);
|
ASSERT_NE (end, begin);
|
||||||
|
|
@ -304,6 +304,7 @@ TEST (block_store, one_account)
|
||||||
ASSERT_EQ (hash, info.head);
|
ASSERT_EQ (hash, info.head);
|
||||||
ASSERT_EQ (42, info.balance.number ());
|
ASSERT_EQ (42, info.balance.number ());
|
||||||
ASSERT_EQ (100, info.modified);
|
ASSERT_EQ (100, info.modified);
|
||||||
|
ASSERT_EQ (200, info.block_count);
|
||||||
++begin;
|
++begin;
|
||||||
ASSERT_EQ (end, begin);
|
ASSERT_EQ (end, begin);
|
||||||
}
|
}
|
||||||
|
|
@ -339,8 +340,8 @@ TEST (block_store, two_account)
|
||||||
rai::account account2 (3);
|
rai::account account2 (3);
|
||||||
rai::block_hash hash2 (4);
|
rai::block_hash hash2 (4);
|
||||||
rai::transaction transaction (store.environment, nullptr, true);
|
rai::transaction transaction (store.environment, nullptr, true);
|
||||||
store.account_put (transaction, account1, {hash1, account1, hash1, 42, 100});
|
store.account_put (transaction, account1, {hash1, account1, hash1, 42, 100, 300});
|
||||||
store.account_put (transaction, account2, {hash2, account2, hash2, 84, 200});
|
store.account_put (transaction, account2, {hash2, account2, hash2, 84, 200, 400});
|
||||||
auto begin (store.latest_begin (transaction));
|
auto begin (store.latest_begin (transaction));
|
||||||
auto end (store.latest_end ());
|
auto end (store.latest_end ());
|
||||||
ASSERT_NE (end, begin);
|
ASSERT_NE (end, begin);
|
||||||
|
|
@ -349,6 +350,7 @@ TEST (block_store, two_account)
|
||||||
ASSERT_EQ (hash1, info1.head);
|
ASSERT_EQ (hash1, info1.head);
|
||||||
ASSERT_EQ (42, info1.balance.number ());
|
ASSERT_EQ (42, info1.balance.number ());
|
||||||
ASSERT_EQ (100, info1.modified);
|
ASSERT_EQ (100, info1.modified);
|
||||||
|
ASSERT_EQ (300, info1.block_count);
|
||||||
++begin;
|
++begin;
|
||||||
ASSERT_NE (end, begin);
|
ASSERT_NE (end, begin);
|
||||||
ASSERT_EQ (account2, begin->first);
|
ASSERT_EQ (account2, begin->first);
|
||||||
|
|
@ -356,6 +358,7 @@ TEST (block_store, two_account)
|
||||||
ASSERT_EQ (hash2, info2.head);
|
ASSERT_EQ (hash2, info2.head);
|
||||||
ASSERT_EQ (84, info2.balance.number ());
|
ASSERT_EQ (84, info2.balance.number ());
|
||||||
ASSERT_EQ (200, info2.modified);
|
ASSERT_EQ (200, info2.modified);
|
||||||
|
ASSERT_EQ (400, info2.block_count);
|
||||||
++begin;
|
++begin;
|
||||||
ASSERT_EQ (end, begin);
|
ASSERT_EQ (end, begin);
|
||||||
}
|
}
|
||||||
|
|
@ -370,8 +373,8 @@ TEST (block_store, latest_find)
|
||||||
rai::account account2 (3);
|
rai::account account2 (3);
|
||||||
rai::block_hash hash2 (4);
|
rai::block_hash hash2 (4);
|
||||||
rai::transaction transaction (store.environment, nullptr, true);
|
rai::transaction transaction (store.environment, nullptr, true);
|
||||||
store.account_put (transaction, account1, {hash1, account1, hash1, 100, 0});
|
store.account_put (transaction, account1, {hash1, account1, hash1, 100, 0, 300});
|
||||||
store.account_put (transaction, account2, {hash2, account2, hash2, 200, 0});
|
store.account_put (transaction, account2, {hash2, account2, hash2, 200, 0, 400});
|
||||||
auto first (store.latest_begin (transaction));
|
auto first (store.latest_begin (transaction));
|
||||||
auto second (store.latest_begin (transaction));
|
auto second (store.latest_begin (transaction));
|
||||||
++second;
|
++second;
|
||||||
|
|
@ -618,7 +621,9 @@ TEST (block_store, upgrade_v2_v3)
|
||||||
rai::account_info info;
|
rai::account_info info;
|
||||||
ASSERT_FALSE (store.account_get (transaction, rai::test_genesis_key.pub, info));
|
ASSERT_FALSE (store.account_get (transaction, rai::test_genesis_key.pub, info));
|
||||||
info.rep_block = 42;
|
info.rep_block = 42;
|
||||||
store.account_put (transaction, rai::test_genesis_key.pub, info);
|
rai::account_info_v5 info_old (info.head, info.rep_block, info.open_block, info.balance, info.modified);
|
||||||
|
auto status (mdb_put (transaction, store.accounts, rai::test_genesis_key.pub.val (), info_old.val (), 0));
|
||||||
|
assert (status == 0);
|
||||||
}
|
}
|
||||||
bool init (false);
|
bool init (false);
|
||||||
rai::block_store store (init, path);
|
rai::block_store store (init, path);
|
||||||
|
|
@ -687,6 +692,11 @@ TEST (block_store, upgrade_v4_v5)
|
||||||
genesis_hash = info.head;
|
genesis_hash = info.head;
|
||||||
store.block_successor_clear (transaction, info.head);
|
store.block_successor_clear (transaction, info.head);
|
||||||
ASSERT_TRUE (store.block_successor (transaction, genesis_hash).is_zero ());
|
ASSERT_TRUE (store.block_successor (transaction, genesis_hash).is_zero ());
|
||||||
|
rai::account_info info2;
|
||||||
|
store.account_get (transaction, rai::test_genesis_key.pub, info2);
|
||||||
|
rai::account_info_v5 info_old (info2.head, info2.rep_block, info2.open_block, info2.balance, info2.modified);
|
||||||
|
auto status (mdb_put (transaction, store.accounts, rai::test_genesis_key.pub.val (), info_old.val (), 0));
|
||||||
|
assert (status == 0);
|
||||||
}
|
}
|
||||||
bool init (false);
|
bool init (false);
|
||||||
rai::block_store store (init, path);
|
rai::block_store store (init, path);
|
||||||
|
|
@ -724,3 +734,29 @@ TEST (vote, validate)
|
||||||
ASSERT_EQ (rai::vote_result::replay, vote2.validate (transaction, store));
|
ASSERT_EQ (rai::vote_result::replay, vote2.validate (transaction, store));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST (block_store, upgrade_v5_v6)
|
||||||
|
{
|
||||||
|
auto path (rai::unique_path ());
|
||||||
|
{
|
||||||
|
bool init (false);
|
||||||
|
rai::block_store store (init, path);
|
||||||
|
ASSERT_FALSE (init);
|
||||||
|
rai::transaction transaction (store.environment, nullptr, true);
|
||||||
|
rai::genesis genesis;;
|
||||||
|
genesis.initialize (transaction, store);
|
||||||
|
store.version_put (transaction, 5);
|
||||||
|
rai::account_info info;
|
||||||
|
store.account_get (transaction, rai::test_genesis_key.pub, info);
|
||||||
|
rai::account_info_v5 info_old (info.head, info.rep_block, info.open_block, info.balance, info.modified);
|
||||||
|
auto status (mdb_put (transaction, store.accounts, rai::test_genesis_key.pub.val (), info_old.val (), 0));
|
||||||
|
assert (status == 0);
|
||||||
|
}
|
||||||
|
bool init (false);
|
||||||
|
rai::block_store store (init, path);
|
||||||
|
ASSERT_FALSE (init);
|
||||||
|
rai::transaction transaction (store.environment, nullptr, false);
|
||||||
|
rai::account_info info;
|
||||||
|
store.account_get (transaction, rai::test_genesis_key.pub, info);
|
||||||
|
ASSERT_EQ (1, info.block_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,7 @@ TEST (ledger, process_send)
|
||||||
rai::send_block send (info1.head, key2.pub, 50, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
|
rai::send_block send (info1.head, key2.pub, 50, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
|
||||||
rai::block_hash hash1 (send.hash ());
|
rai::block_hash hash1 (send.hash ());
|
||||||
ASSERT_EQ (rai::test_genesis_key.pub, store.frontier_get (transaction, info1.head));
|
ASSERT_EQ (rai::test_genesis_key.pub, store.frontier_get (transaction, info1.head));
|
||||||
|
ASSERT_EQ (1, info1.block_count);
|
||||||
// This was a valid block, it should progress.
|
// This was a valid block, it should progress.
|
||||||
auto return1 (ledger.process (transaction, send));
|
auto return1 (ledger.process (transaction, send));
|
||||||
ASSERT_EQ (rai::genesis_amount - 50, ledger.amount (transaction, hash1));
|
ASSERT_EQ (rai::genesis_amount - 50, ledger.amount (transaction, hash1));
|
||||||
|
|
@ -112,6 +113,7 @@ TEST (ledger, process_send)
|
||||||
ASSERT_EQ (rai::genesis_amount - 50, ledger.account_pending (transaction, key2.pub));
|
ASSERT_EQ (rai::genesis_amount - 50, ledger.account_pending (transaction, key2.pub));
|
||||||
rai::account_info info2;
|
rai::account_info info2;
|
||||||
ASSERT_FALSE (store.account_get (transaction, rai::test_genesis_key.pub, info2));
|
ASSERT_FALSE (store.account_get (transaction, rai::test_genesis_key.pub, info2));
|
||||||
|
ASSERT_EQ (2, info2.block_count);
|
||||||
auto latest6 (store.block_get (transaction, info2.head));
|
auto latest6 (store.block_get (transaction, info2.head));
|
||||||
ASSERT_NE (nullptr, latest6);
|
ASSERT_NE (nullptr, latest6);
|
||||||
auto latest7 (dynamic_cast <rai::send_block *> (latest6.get ()));
|
auto latest7 (dynamic_cast <rai::send_block *> (latest6.get ()));
|
||||||
|
|
@ -167,6 +169,7 @@ TEST (ledger, process_send)
|
||||||
ASSERT_TRUE (store.frontier_get (transaction, hash1).is_zero ());
|
ASSERT_TRUE (store.frontier_get (transaction, hash1).is_zero ());
|
||||||
rai::account_info info7;
|
rai::account_info info7;
|
||||||
ASSERT_FALSE (ledger.store.account_get (transaction, rai::test_genesis_key.pub, info7));
|
ASSERT_FALSE (ledger.store.account_get (transaction, rai::test_genesis_key.pub, info7));
|
||||||
|
ASSERT_EQ (1, info7.block_count);
|
||||||
ASSERT_EQ (info1.head, info7.head);
|
ASSERT_EQ (info1.head, info7.head);
|
||||||
rai::pending_info pending2;
|
rai::pending_info pending2;
|
||||||
ASSERT_TRUE (ledger.store.pending_get (transaction, rai::pending_key (key2.pub, hash1), pending2));
|
ASSERT_TRUE (ledger.store.pending_get (transaction, rai::pending_key (key2.pub, hash1), pending2));
|
||||||
|
|
|
||||||
|
|
@ -720,7 +720,7 @@ TEST (rpc, frontier)
|
||||||
{
|
{
|
||||||
rai::keypair key;
|
rai::keypair key;
|
||||||
source [key.pub] = key.prv.data;
|
source [key.pub] = key.prv.data;
|
||||||
system.nodes [0]->store.account_put (transaction, key.pub, rai::account_info (key.prv.data, 0, 0, 0, 0));
|
system.nodes [0]->store.account_put (transaction, key.pub, rai::account_info (key.prv.data, 0, 0, 0, 0, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rai::keypair key;
|
rai::keypair key;
|
||||||
|
|
@ -760,7 +760,7 @@ TEST (rpc, frontier_limited)
|
||||||
{
|
{
|
||||||
rai::keypair key;
|
rai::keypair key;
|
||||||
source [key.pub] = key.prv.data;
|
source [key.pub] = key.prv.data;
|
||||||
system.nodes [0]->store.account_put (transaction, key.pub, rai::account_info (key.prv.data, 0, 0, 0, 0));
|
system.nodes [0]->store.account_put (transaction, key.pub, rai::account_info (key.prv.data, 0, 0, 0, 0, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rai::keypair key;
|
rai::keypair key;
|
||||||
|
|
@ -790,7 +790,7 @@ TEST (rpc, frontier_startpoint)
|
||||||
{
|
{
|
||||||
rai::keypair key;
|
rai::keypair key;
|
||||||
source [key.pub] = key.prv.data;
|
source [key.pub] = key.prv.data;
|
||||||
system.nodes [0]->store.account_put (transaction, key.pub, rai::account_info (key.prv.data, 0, 0, 0, 0));
|
system.nodes [0]->store.account_put (transaction, key.pub, rai::account_info (key.prv.data, 0, 0, 0, 0, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rai::keypair key;
|
rai::keypair key;
|
||||||
|
|
@ -1313,7 +1313,7 @@ TEST (rpc, version)
|
||||||
ASSERT_EQ (200, response1.status);
|
ASSERT_EQ (200, response1.status);
|
||||||
ASSERT_EQ ("1", response1.json.get <std::string> ("rpc_version"));
|
ASSERT_EQ ("1", response1.json.get <std::string> ("rpc_version"));
|
||||||
ASSERT_EQ (200, response1.status);
|
ASSERT_EQ (200, response1.status);
|
||||||
ASSERT_EQ ("5", response1.json.get <std::string> ("store_version"));
|
ASSERT_EQ ("6", response1.json.get <std::string> ("store_version"));
|
||||||
ASSERT_EQ (boost::str (boost::format ("RaiBlocks %1%.%2%.%3%") % RAIBLOCKS_VERSION_MAJOR % RAIBLOCKS_VERSION_MINOR % RAIBLOCKS_VERSION_PATCH), response1.json.get <std::string> ("node_vendor"));
|
ASSERT_EQ (boost::str (boost::format ("RaiBlocks %1%.%2%.%3%") % RAIBLOCKS_VERSION_MAJOR % RAIBLOCKS_VERSION_MINOR % RAIBLOCKS_VERSION_PATCH), response1.json.get <std::string> ("node_vendor"));
|
||||||
auto & headers (response1.resp.fields);
|
auto & headers (response1.resp.fields);
|
||||||
auto access_control (std::find_if (headers.begin (), headers.end (), [] (decltype (*headers.begin ()) & header_a) { return boost::iequals (header_a.first, "Access-Control-Allow-Origin"); }));
|
auto access_control (std::find_if (headers.begin (), headers.end (), [] (decltype (*headers.begin ()) & header_a) { return boost::iequals (header_a.first, "Access-Control-Allow-Origin"); }));
|
||||||
|
|
|
||||||
|
|
@ -1549,7 +1549,7 @@ void rai::bulk_push_server::received_block (boost::system::error_code const & ec
|
||||||
rai::frontier_req_server::frontier_req_server (std::shared_ptr <rai::bootstrap_server> const & connection_a, std::unique_ptr <rai::frontier_req> request_a) :
|
rai::frontier_req_server::frontier_req_server (std::shared_ptr <rai::bootstrap_server> const & connection_a, std::unique_ptr <rai::frontier_req> request_a) :
|
||||||
connection (connection_a),
|
connection (connection_a),
|
||||||
current (request_a->start.number () - 1),
|
current (request_a->start.number () - 1),
|
||||||
info (0, 0, 0, 0, 0),
|
info (0, 0, 0, 0, 0, 0),
|
||||||
request (std::move (request_a))
|
request (std::move (request_a))
|
||||||
{
|
{
|
||||||
next ();
|
next ();
|
||||||
|
|
|
||||||
|
|
@ -1315,23 +1315,25 @@ head (0),
|
||||||
rep_block (0),
|
rep_block (0),
|
||||||
open_block (0),
|
open_block (0),
|
||||||
balance (0),
|
balance (0),
|
||||||
modified (0)
|
modified (0),
|
||||||
|
block_count (0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
rai::account_info::account_info (MDB_val const & val_a)
|
rai::account_info::account_info (MDB_val const & val_a)
|
||||||
{
|
{
|
||||||
assert (val_a.mv_size == sizeof (*this));
|
assert (val_a.mv_size == sizeof (*this));
|
||||||
static_assert (sizeof (head) + sizeof (rep_block) + sizeof (open_block) + sizeof (balance) + sizeof (modified) == sizeof (*this), "Class not packed");
|
static_assert (sizeof (head) + sizeof (rep_block) + sizeof (open_block) + sizeof (balance) + sizeof (modified) + sizeof (block_count) == sizeof (*this), "Class not packed");
|
||||||
std::copy (reinterpret_cast <uint8_t const *> (val_a.mv_data), reinterpret_cast <uint8_t const *> (val_a.mv_data) + sizeof (*this), reinterpret_cast <uint8_t *> (this));
|
std::copy (reinterpret_cast <uint8_t const *> (val_a.mv_data), reinterpret_cast <uint8_t const *> (val_a.mv_data) + sizeof (*this), reinterpret_cast <uint8_t *> (this));
|
||||||
}
|
}
|
||||||
|
|
||||||
rai::account_info::account_info (rai::block_hash const & head_a, rai::block_hash const & rep_block_a, rai::block_hash const & open_block_a, rai::amount const & balance_a, uint64_t modified_a) :
|
rai::account_info::account_info (rai::block_hash const & head_a, rai::block_hash const & rep_block_a, rai::block_hash const & open_block_a, rai::amount const & balance_a, uint64_t modified_a, uint64_t block_count_a) :
|
||||||
head (head_a),
|
head (head_a),
|
||||||
rep_block (rep_block_a),
|
rep_block (rep_block_a),
|
||||||
open_block (open_block_a),
|
open_block (open_block_a),
|
||||||
balance (balance_a),
|
balance (balance_a),
|
||||||
modified (modified_a)
|
modified (modified_a),
|
||||||
|
block_count (block_count_a)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1342,6 +1344,7 @@ void rai::account_info::serialize (rai::stream & stream_a) const
|
||||||
write (stream_a, open_block.bytes);
|
write (stream_a, open_block.bytes);
|
||||||
write (stream_a, balance.bytes);
|
write (stream_a, balance.bytes);
|
||||||
write (stream_a, modified);
|
write (stream_a, modified);
|
||||||
|
write (stream_a, block_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rai::account_info::deserialize (rai::stream & stream_a)
|
bool rai::account_info::deserialize (rai::stream & stream_a)
|
||||||
|
|
@ -1359,6 +1362,10 @@ bool rai::account_info::deserialize (rai::stream & stream_a)
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
result = read (stream_a, modified);
|
result = read (stream_a, modified);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
result = read (stream_a, block_count);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1368,7 +1375,7 @@ bool rai::account_info::deserialize (rai::stream & stream_a)
|
||||||
|
|
||||||
bool rai::account_info::operator == (rai::account_info const & other_a) const
|
bool rai::account_info::operator == (rai::account_info const & other_a) const
|
||||||
{
|
{
|
||||||
return head == other_a.head && rep_block == other_a.rep_block && open_block == other_a.open_block && balance == other_a.balance && modified == other_a.modified;
|
return head == other_a.head && rep_block == other_a.rep_block && open_block == other_a.open_block && balance == other_a.balance && modified == other_a.modified && block_count == other_a.block_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rai::account_info::operator != (rai::account_info const & other_a) const
|
bool rai::account_info::operator != (rai::account_info const & other_a) const
|
||||||
|
|
@ -1588,6 +1595,8 @@ void rai::block_store::do_upgrades (MDB_txn * transaction_a)
|
||||||
case 4:
|
case 4:
|
||||||
upgrade_v4_to_v5 (transaction_a);
|
upgrade_v4_to_v5 (transaction_a);
|
||||||
case 5:
|
case 5:
|
||||||
|
upgrade_v5_to_v6 (transaction_a);
|
||||||
|
case 6:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert (false);
|
assert (false);
|
||||||
|
|
@ -1606,7 +1615,7 @@ void rai::block_store::upgrade_v1_to_v2 (MDB_txn * transaction_a)
|
||||||
{
|
{
|
||||||
account = i->first;
|
account = i->first;
|
||||||
rai::account_info_v1 v1 (i->second);
|
rai::account_info_v1 v1 (i->second);
|
||||||
rai::account_info v2;
|
rai::account_info_v5 v2;
|
||||||
v2.balance = v1.balance;
|
v2.balance = v1.balance;
|
||||||
v2.head = v1.head;
|
v2.head = v1.head;
|
||||||
v2.modified = v1.modified;
|
v2.modified = v1.modified;
|
||||||
|
|
@ -1677,7 +1686,7 @@ void rai::block_store::upgrade_v2_to_v3 (MDB_txn * transaction_a)
|
||||||
for (auto i (latest_begin (transaction_a)), n (latest_end ()); i != n; ++i)
|
for (auto i (latest_begin (transaction_a)), n (latest_end ()); i != n; ++i)
|
||||||
{
|
{
|
||||||
rai::account account_l (i->first);
|
rai::account account_l (i->first);
|
||||||
account_info info (i->second);
|
rai::account_info_v5 info (i->second);
|
||||||
representative_visitor visitor (transaction_a, *this);
|
representative_visitor visitor (transaction_a, *this);
|
||||||
visitor.compute (info.head);
|
visitor.compute (info.head);
|
||||||
assert (!visitor.result.is_zero ());
|
assert (!visitor.result.is_zero ());
|
||||||
|
|
@ -1712,7 +1721,7 @@ void rai::block_store::upgrade_v4_to_v5 (MDB_txn * transaction_a)
|
||||||
for (auto i (latest_begin (transaction_a)), n (latest_end ()); i != n; ++i)
|
for (auto i (latest_begin (transaction_a)), n (latest_end ()); i != n; ++i)
|
||||||
{
|
{
|
||||||
rai::account account (i->first);
|
rai::account account (i->first);
|
||||||
rai::account_info info (i->second);
|
rai::account_info_v5 info (i->second);
|
||||||
rai::block_hash successor (0);
|
rai::block_hash successor (0);
|
||||||
auto block (block_get (transaction_a, info.head));
|
auto block (block_get (transaction_a, info.head));
|
||||||
while (block != nullptr)
|
while (block != nullptr)
|
||||||
|
|
@ -1731,6 +1740,32 @@ void rai::block_store::upgrade_v4_to_v5 (MDB_txn * transaction_a)
|
||||||
//std::cerr << boost::str (boost::format ("Fixed up %1% blocks\n") % fixes);
|
//std::cerr << boost::str (boost::format ("Fixed up %1% blocks\n") % fixes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rai::block_store::upgrade_v5_to_v6 (MDB_txn * transaction_a)
|
||||||
|
{
|
||||||
|
version_put (transaction_a, 6);
|
||||||
|
std::deque <std::pair <rai::account, rai::account_info>> headers;
|
||||||
|
for (auto i (latest_begin (transaction_a)), n (latest_end ()); i != n; ++i)
|
||||||
|
{
|
||||||
|
rai::account account (i->first);
|
||||||
|
rai::account_info_v5 info_old (i->second);
|
||||||
|
uint64_t block_count (0);
|
||||||
|
auto hash (info_old.head);
|
||||||
|
while (!hash.is_zero ())
|
||||||
|
{
|
||||||
|
++block_count;
|
||||||
|
auto block (block_get (transaction_a, hash));
|
||||||
|
assert (block != nullptr);
|
||||||
|
hash = block->previous ();
|
||||||
|
}
|
||||||
|
rai::account_info info (info_old.head, info_old.rep_block, info_old.open_block, info_old.balance, info_old.modified, block_count);
|
||||||
|
headers.push_back (std::make_pair (account, info));
|
||||||
|
}
|
||||||
|
for (auto i (headers.begin ()), n (headers.end ()); i != n; ++i)
|
||||||
|
{
|
||||||
|
account_put (transaction_a, i->first, i->second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void rai::block_store::clear (MDB_dbi db_a)
|
void rai::block_store::clear (MDB_dbi db_a)
|
||||||
{
|
{
|
||||||
rai::transaction transaction (environment, nullptr, true);
|
rai::transaction transaction (environment, nullptr, true);
|
||||||
|
|
@ -2671,7 +2706,7 @@ public:
|
||||||
assert (!error);
|
assert (!error);
|
||||||
ledger.store.pending_del (transaction, key);
|
ledger.store.pending_del (transaction, key);
|
||||||
ledger.store.representation_add (transaction, ledger.representative (transaction, hash), pending.amount.number ());
|
ledger.store.representation_add (transaction, ledger.representative (transaction, hash), pending.amount.number ());
|
||||||
ledger.change_latest (transaction, pending.source, block_a.hashables.previous, info.rep_block, ledger.balance (transaction, block_a.hashables.previous));
|
ledger.change_latest (transaction, pending.source, block_a.hashables.previous, info.rep_block, ledger.balance (transaction, block_a.hashables.previous), info.block_count - 1);
|
||||||
ledger.store.block_del (transaction, hash);
|
ledger.store.block_del (transaction, hash);
|
||||||
ledger.store.frontier_del (transaction, hash);
|
ledger.store.frontier_del (transaction, hash);
|
||||||
ledger.store.frontier_put (transaction, block_a.hashables.previous, pending.source);
|
ledger.store.frontier_put (transaction, block_a.hashables.previous, pending.source);
|
||||||
|
|
@ -2683,8 +2718,11 @@ public:
|
||||||
auto representative (ledger.representative (transaction, block_a.hashables.previous));
|
auto representative (ledger.representative (transaction, block_a.hashables.previous));
|
||||||
auto amount (ledger.amount (transaction, block_a.hashables.source));
|
auto amount (ledger.amount (transaction, block_a.hashables.source));
|
||||||
auto destination_account (ledger.account (transaction, hash));
|
auto destination_account (ledger.account (transaction, hash));
|
||||||
|
rai::account_info info;
|
||||||
|
auto error (ledger.store.account_get (transaction, destination_account, info));
|
||||||
|
assert (!error);
|
||||||
ledger.store.representation_add (transaction, ledger.representative (transaction, hash), 0 - amount);
|
ledger.store.representation_add (transaction, ledger.representative (transaction, hash), 0 - amount);
|
||||||
ledger.change_latest (transaction, destination_account, block_a.hashables.previous, representative, ledger.balance (transaction, block_a.hashables.previous));
|
ledger.change_latest (transaction, destination_account, block_a.hashables.previous, representative, ledger.balance (transaction, block_a.hashables.previous), info.block_count - 1);
|
||||||
ledger.store.block_del (transaction, hash);
|
ledger.store.block_del (transaction, hash);
|
||||||
ledger.store.pending_put (transaction, rai::pending_key (destination_account, block_a.hashables.source), {ledger.account (transaction, block_a.hashables.source), amount});
|
ledger.store.pending_put (transaction, rai::pending_key (destination_account, block_a.hashables.source), {ledger.account (transaction, block_a.hashables.source), amount});
|
||||||
ledger.store.frontier_del (transaction, hash);
|
ledger.store.frontier_del (transaction, hash);
|
||||||
|
|
@ -2698,7 +2736,7 @@ public:
|
||||||
auto amount (ledger.amount (transaction, block_a.hashables.source));
|
auto amount (ledger.amount (transaction, block_a.hashables.source));
|
||||||
auto destination_account (ledger.account (transaction, hash));
|
auto destination_account (ledger.account (transaction, hash));
|
||||||
ledger.store.representation_add (transaction, ledger.representative (transaction, hash), 0 - amount);
|
ledger.store.representation_add (transaction, ledger.representative (transaction, hash), 0 - amount);
|
||||||
ledger.change_latest (transaction, destination_account, 0, representative, 0);
|
ledger.change_latest (transaction, destination_account, 0, representative, 0, 0);
|
||||||
ledger.store.block_del (transaction, hash);
|
ledger.store.block_del (transaction, hash);
|
||||||
ledger.store.pending_put (transaction, rai::pending_key (destination_account, block_a.hashables.source), {ledger.account (transaction, block_a.hashables.source), amount});
|
ledger.store.pending_put (transaction, rai::pending_key (destination_account, block_a.hashables.source), {ledger.account (transaction, block_a.hashables.source), amount});
|
||||||
ledger.store.frontier_del (transaction, hash);
|
ledger.store.frontier_del (transaction, hash);
|
||||||
|
|
@ -2715,7 +2753,7 @@ public:
|
||||||
ledger.store.representation_add (transaction, representative, balance);
|
ledger.store.representation_add (transaction, representative, balance);
|
||||||
ledger.store.representation_add (transaction, hash, 0 - balance);
|
ledger.store.representation_add (transaction, hash, 0 - balance);
|
||||||
ledger.store.block_del (transaction, hash);
|
ledger.store.block_del (transaction, hash);
|
||||||
ledger.change_latest (transaction, account, block_a.hashables.previous, representative, info.balance);
|
ledger.change_latest (transaction, account, block_a.hashables.previous, representative, info.balance, info.block_count - 1);
|
||||||
ledger.store.frontier_del (transaction, hash);
|
ledger.store.frontier_del (transaction, hash);
|
||||||
ledger.store.frontier_put (transaction, block_a.hashables.previous, account);
|
ledger.store.frontier_put (transaction, block_a.hashables.previous, account);
|
||||||
ledger.store.block_successor_clear (transaction, block_a.hashables.previous);
|
ledger.store.block_successor_clear (transaction, block_a.hashables.previous);
|
||||||
|
|
@ -2958,7 +2996,7 @@ void rai::ledger::checksum_update (MDB_txn * transaction_a, rai::block_hash cons
|
||||||
store.checksum_put (transaction_a, 0, 0, value);
|
store.checksum_put (transaction_a, 0, 0, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rai::ledger::change_latest (MDB_txn * transaction_a, rai::account const & account_a, rai::block_hash const & hash_a, rai::block_hash const & rep_block_a, rai::amount const & balance_a)
|
void rai::ledger::change_latest (MDB_txn * transaction_a, rai::account const & account_a, rai::block_hash const & hash_a, rai::block_hash const & rep_block_a, rai::amount const & balance_a, uint64_t block_count_a)
|
||||||
{
|
{
|
||||||
rai::account_info info;
|
rai::account_info info;
|
||||||
auto exists (!store.account_get (transaction_a, account_a, info));
|
auto exists (!store.account_get (transaction_a, account_a, info));
|
||||||
|
|
@ -2977,6 +3015,7 @@ void rai::ledger::change_latest (MDB_txn * transaction_a, rai::account const & a
|
||||||
info.rep_block = rep_block_a;
|
info.rep_block = rep_block_a;
|
||||||
info.balance = balance_a;
|
info.balance = balance_a;
|
||||||
info.modified = store.now ();
|
info.modified = store.now ();
|
||||||
|
info.block_count = block_count_a;
|
||||||
store.account_put (transaction_a, account_a, info);
|
store.account_put (transaction_a, account_a, info);
|
||||||
checksum_update (transaction_a, hash_a);
|
checksum_update (transaction_a, hash_a);
|
||||||
}
|
}
|
||||||
|
|
@ -3051,7 +3090,7 @@ void ledger_processor::change_block (rai::change_block const & block_a)
|
||||||
auto balance (ledger.balance (transaction, block_a.hashables.previous));
|
auto balance (ledger.balance (transaction, block_a.hashables.previous));
|
||||||
ledger.store.representation_add (transaction, hash, balance);
|
ledger.store.representation_add (transaction, hash, balance);
|
||||||
ledger.store.representation_add (transaction, info.rep_block, 0 - balance);
|
ledger.store.representation_add (transaction, info.rep_block, 0 - balance);
|
||||||
ledger.change_latest (transaction, account, hash, hash, info.balance);
|
ledger.change_latest (transaction, account, hash, hash, info.balance, info.block_count + 1);
|
||||||
ledger.store.frontier_del (transaction, block_a.hashables.previous);
|
ledger.store.frontier_del (transaction, block_a.hashables.previous);
|
||||||
ledger.store.frontier_put (transaction, hash, account);
|
ledger.store.frontier_put (transaction, hash, account);
|
||||||
result.account = account;
|
result.account = account;
|
||||||
|
|
@ -3090,7 +3129,7 @@ void ledger_processor::send_block (rai::send_block const & block_a)
|
||||||
auto amount (info.balance.number () - block_a.hashables.balance.number ());
|
auto amount (info.balance.number () - block_a.hashables.balance.number ());
|
||||||
ledger.store.representation_add (transaction, info.rep_block, 0 - amount);
|
ledger.store.representation_add (transaction, info.rep_block, 0 - amount);
|
||||||
ledger.store.block_put (transaction, hash, block_a);
|
ledger.store.block_put (transaction, hash, block_a);
|
||||||
ledger.change_latest (transaction, account, hash, info.rep_block, block_a.hashables.balance);
|
ledger.change_latest (transaction, account, hash, info.rep_block, block_a.hashables.balance, info.block_count + 1);
|
||||||
ledger.store.pending_put (transaction, rai::pending_key (block_a.hashables.destination, hash), {account, amount});
|
ledger.store.pending_put (transaction, rai::pending_key (block_a.hashables.destination, hash), {account, amount});
|
||||||
ledger.store.frontier_del (transaction, block_a.hashables.previous);
|
ledger.store.frontier_del (transaction, block_a.hashables.previous);
|
||||||
ledger.store.frontier_put (transaction, hash, account);
|
ledger.store.frontier_put (transaction, hash, account);
|
||||||
|
|
@ -3136,7 +3175,7 @@ void ledger_processor::receive_block (rai::receive_block const & block_a)
|
||||||
assert (!error);
|
assert (!error);
|
||||||
ledger.store.pending_del (transaction, key);
|
ledger.store.pending_del (transaction, key);
|
||||||
ledger.store.block_put (transaction, hash, block_a);
|
ledger.store.block_put (transaction, hash, block_a);
|
||||||
ledger.change_latest (transaction, account, hash, info.rep_block, new_balance);
|
ledger.change_latest (transaction, account, hash, info.rep_block, new_balance, info.block_count + 1);
|
||||||
ledger.store.representation_add (transaction, info.rep_block, pending.amount.number ());
|
ledger.store.representation_add (transaction, info.rep_block, pending.amount.number ());
|
||||||
ledger.store.frontier_del (transaction, block_a.hashables.previous);
|
ledger.store.frontier_del (transaction, block_a.hashables.previous);
|
||||||
ledger.store.frontier_put (transaction, hash, account);
|
ledger.store.frontier_put (transaction, hash, account);
|
||||||
|
|
@ -3182,7 +3221,7 @@ void ledger_processor::open_block (rai::open_block const & block_a)
|
||||||
assert (!error);
|
assert (!error);
|
||||||
ledger.store.pending_del (transaction, key);
|
ledger.store.pending_del (transaction, key);
|
||||||
ledger.store.block_put (transaction, hash, block_a);
|
ledger.store.block_put (transaction, hash, block_a);
|
||||||
ledger.change_latest (transaction, block_a.hashables.account, hash, hash, pending.amount.number ());
|
ledger.change_latest (transaction, block_a.hashables.account, hash, hash, pending.amount.number (), info.block_count + 1);
|
||||||
ledger.store.representation_add (transaction, hash, pending.amount.number ());
|
ledger.store.representation_add (transaction, hash, pending.amount.number ());
|
||||||
ledger.store.frontier_put (transaction, hash, block_a.hashables.account);
|
ledger.store.frontier_put (transaction, hash, block_a.hashables.account);
|
||||||
result.account = block_a.hashables.account;
|
result.account = block_a.hashables.account;
|
||||||
|
|
@ -3284,7 +3323,7 @@ void rai::genesis::initialize (MDB_txn * transaction_a, rai::block_store & store
|
||||||
auto hash_l (hash ());
|
auto hash_l (hash ());
|
||||||
assert (store_a.latest_begin (transaction_a) == store_a.latest_end ());
|
assert (store_a.latest_begin (transaction_a) == store_a.latest_end ());
|
||||||
store_a.block_put (transaction_a, hash_l, *open);
|
store_a.block_put (transaction_a, hash_l, *open);
|
||||||
store_a.account_put (transaction_a, genesis_account, {hash_l, open->hash (), open->hash (), std::numeric_limits <rai::uint128_t>::max (), store_a.now ()});
|
store_a.account_put (transaction_a, genesis_account, {hash_l, open->hash (), open->hash (), std::numeric_limits <rai::uint128_t>::max (), store_a.now (), 1});
|
||||||
store_a.representation_put (transaction_a, genesis_account, std::numeric_limits <rai::uint128_t>::max ());
|
store_a.representation_put (transaction_a, genesis_account, std::numeric_limits <rai::uint128_t>::max ());
|
||||||
store_a.checksum_put (transaction_a, 0, 0, hash_l);
|
store_a.checksum_put (transaction_a, 0, 0, hash_l);
|
||||||
store_a.frontier_put (transaction_a, hash_l, genesis_account);
|
store_a.frontier_put (transaction_a, hash_l, genesis_account);
|
||||||
|
|
|
||||||
|
|
@ -241,7 +241,7 @@ public:
|
||||||
account_info ();
|
account_info ();
|
||||||
account_info (MDB_val const &);
|
account_info (MDB_val const &);
|
||||||
account_info (rai::account_info const &) = default;
|
account_info (rai::account_info const &) = default;
|
||||||
account_info (rai::block_hash const &, rai::block_hash const &, rai::block_hash const &, rai::amount const &, uint64_t);
|
account_info (rai::block_hash const &, rai::block_hash const &, rai::block_hash const &, rai::amount const &, uint64_t, uint64_t);
|
||||||
void serialize (rai::stream &) const;
|
void serialize (rai::stream &) const;
|
||||||
bool deserialize (rai::stream &);
|
bool deserialize (rai::stream &);
|
||||||
bool operator == (rai::account_info const &) const;
|
bool operator == (rai::account_info const &) const;
|
||||||
|
|
@ -252,6 +252,7 @@ public:
|
||||||
rai::block_hash open_block;
|
rai::block_hash open_block;
|
||||||
rai::amount balance;
|
rai::amount balance;
|
||||||
uint64_t modified;
|
uint64_t modified;
|
||||||
|
uint64_t block_count;
|
||||||
};
|
};
|
||||||
class store_entry
|
class store_entry
|
||||||
{
|
{
|
||||||
|
|
@ -392,6 +393,7 @@ public:
|
||||||
void upgrade_v2_to_v3 (MDB_txn *);
|
void upgrade_v2_to_v3 (MDB_txn *);
|
||||||
void upgrade_v3_to_v4 (MDB_txn *);
|
void upgrade_v3_to_v4 (MDB_txn *);
|
||||||
void upgrade_v4_to_v5 (MDB_txn *);
|
void upgrade_v4_to_v5 (MDB_txn *);
|
||||||
|
void upgrade_v5_to_v6 (MDB_txn *);
|
||||||
|
|
||||||
void clear (MDB_dbi);
|
void clear (MDB_dbi);
|
||||||
|
|
||||||
|
|
@ -507,7 +509,7 @@ public:
|
||||||
rai::uint128_t supply (MDB_txn *);
|
rai::uint128_t supply (MDB_txn *);
|
||||||
rai::process_return process (MDB_txn *, rai::block const &);
|
rai::process_return process (MDB_txn *, rai::block const &);
|
||||||
void rollback (MDB_txn *, rai::block_hash const &);
|
void rollback (MDB_txn *, rai::block_hash const &);
|
||||||
void change_latest (MDB_txn *, rai::account const &, rai::block_hash const &, rai::account const &, rai::uint128_union const &);
|
void change_latest (MDB_txn *, rai::account const &, rai::block_hash const &, rai::account const &, rai::uint128_union const &, uint64_t);
|
||||||
void checksum_update (MDB_txn *, rai::block_hash const &);
|
void checksum_update (MDB_txn *, rai::block_hash const &);
|
||||||
rai::checksum checksum (MDB_txn *, rai::account const &, rai::account const &);
|
rai::checksum checksum (MDB_txn *, rai::account const &, rai::account const &);
|
||||||
void dump_account_chain (rai::account const &);
|
void dump_account_chain (rai::account const &);
|
||||||
|
|
|
||||||
|
|
@ -105,3 +105,64 @@ rai::mdb_val rai::pending_info_v3::val () const
|
||||||
{
|
{
|
||||||
return rai::mdb_val (sizeof (*this), const_cast <rai::pending_info_v3 *> (this));
|
return rai::mdb_val (sizeof (*this), const_cast <rai::pending_info_v3 *> (this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rai::account_info_v5::account_info_v5 () :
|
||||||
|
head (0),
|
||||||
|
rep_block (0),
|
||||||
|
open_block (0),
|
||||||
|
balance (0),
|
||||||
|
modified (0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
rai::account_info_v5::account_info_v5 (MDB_val const & val_a)
|
||||||
|
{
|
||||||
|
assert (val_a.mv_size == sizeof (*this));
|
||||||
|
static_assert (sizeof (head) + sizeof (rep_block) + sizeof (open_block) + sizeof (balance) + sizeof (modified) == sizeof (*this), "Class not packed");
|
||||||
|
std::copy (reinterpret_cast <uint8_t const *> (val_a.mv_data), reinterpret_cast <uint8_t const *> (val_a.mv_data) + sizeof (*this), reinterpret_cast <uint8_t *> (this));
|
||||||
|
}
|
||||||
|
|
||||||
|
rai::account_info_v5::account_info_v5 (rai::block_hash const & head_a, rai::block_hash const & rep_block_a, rai::block_hash const & open_block_a, rai::amount const & balance_a, uint64_t modified_a) :
|
||||||
|
head (head_a),
|
||||||
|
rep_block (rep_block_a),
|
||||||
|
open_block (open_block_a),
|
||||||
|
balance (balance_a),
|
||||||
|
modified (modified_a)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void rai::account_info_v5::serialize (rai::stream & stream_a) const
|
||||||
|
{
|
||||||
|
write (stream_a, head.bytes);
|
||||||
|
write (stream_a, rep_block.bytes);
|
||||||
|
write (stream_a, open_block.bytes);
|
||||||
|
write (stream_a, balance.bytes);
|
||||||
|
write (stream_a, modified);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rai::account_info_v5::deserialize (rai::stream & stream_a)
|
||||||
|
{
|
||||||
|
auto result (read (stream_a, head.bytes));
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
result = read (stream_a, rep_block.bytes);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
result = read (stream_a, open_block.bytes);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
result = read (stream_a, balance.bytes);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
result = read (stream_a, modified);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
rai::mdb_val rai::account_info_v5::val () const
|
||||||
|
{
|
||||||
|
return rai::mdb_val (sizeof (*this), const_cast <rai::account_info_v5 *> (this));
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,4 +33,21 @@ public:
|
||||||
rai::amount amount;
|
rai::amount amount;
|
||||||
rai::account destination;
|
rai::account destination;
|
||||||
};
|
};
|
||||||
|
// Latest information about an account
|
||||||
|
class account_info_v5
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
account_info_v5 ();
|
||||||
|
account_info_v5 (MDB_val const &);
|
||||||
|
account_info_v5 (rai::account_info_v5 const &) = default;
|
||||||
|
account_info_v5 (rai::block_hash const &, rai::block_hash const &, rai::block_hash const &, rai::amount const &, uint64_t);
|
||||||
|
void serialize (rai::stream &) const;
|
||||||
|
bool deserialize (rai::stream &);
|
||||||
|
rai::mdb_val val () const;
|
||||||
|
rai::block_hash head;
|
||||||
|
rai::block_hash rep_block;
|
||||||
|
rai::block_hash open_block;
|
||||||
|
rai::amount balance;
|
||||||
|
uint64_t modified;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue