Move representation with balances rather than trying to move it only on receive.
This commit is contained in:
parent
0471b23938
commit
e24dfe03a0
5 changed files with 66 additions and 103 deletions
|
@ -154,12 +154,13 @@ TEST (ledger, process_send)
|
|||
ASSERT_EQ (rai::genesis_amount - 50, pending1.amount.number ());
|
||||
ASSERT_EQ (0, ledger.account_balance (transaction, key2.pub));
|
||||
ASSERT_EQ (50, ledger.account_balance (transaction, rai::test_genesis_key.pub));
|
||||
ASSERT_EQ (rai::genesis_amount, ledger.weight (transaction, rai::test_genesis_key.pub));
|
||||
ASSERT_EQ (50, ledger.weight (transaction, rai::test_genesis_key.pub));
|
||||
ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
|
||||
rai::account_info info6;
|
||||
ASSERT_FALSE (ledger.store.account_get (transaction, rai::test_genesis_key.pub, info6));
|
||||
ASSERT_EQ (hash1, info6.head);
|
||||
ledger.rollback (transaction, info6.head);
|
||||
ASSERT_EQ (rai::genesis_amount, ledger.weight (transaction, rai::test_genesis_key.pub));
|
||||
ASSERT_EQ (rai::test_genesis_key.pub, store.frontier_get (transaction, info1.head));
|
||||
ASSERT_TRUE (store.frontier_get (transaction, hash1).is_zero ());
|
||||
rai::account_info info7;
|
||||
|
@ -289,11 +290,13 @@ TEST (ledger, rollback_representation)
|
|||
ASSERT_EQ (1, ledger.weight (transaction, key3.pub));
|
||||
ASSERT_EQ (rai::genesis_amount - 1, ledger.weight (transaction, key4.pub));
|
||||
ledger.rollback (transaction, receive1.hash ());
|
||||
ASSERT_EQ (50, ledger.weight (transaction, key3.pub));
|
||||
ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
|
||||
ASSERT_EQ (rai::genesis_amount - 50, ledger.weight (transaction, key4.pub));
|
||||
ledger.rollback (transaction, open.hash ());
|
||||
ASSERT_EQ (rai::genesis_amount, ledger.weight (transaction, key3.pub));
|
||||
ASSERT_EQ (1, ledger.weight (transaction, key3.pub));
|
||||
ASSERT_EQ (0, ledger.weight (transaction, key4.pub));
|
||||
ledger.rollback (transaction, send1.hash ());
|
||||
ASSERT_EQ (rai::genesis_amount, ledger.weight (transaction, key3.pub));
|
||||
ledger.rollback (transaction, change2.hash ());
|
||||
ASSERT_EQ (rai::genesis_amount, ledger.weight (transaction, key5.pub));
|
||||
ASSERT_EQ (0, ledger.weight (transaction, key3.pub));
|
||||
|
@ -591,7 +594,7 @@ TEST (ledger, representation)
|
|||
rai::keypair key2;
|
||||
rai::send_block block1 (genesis.hash (), key2.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
|
||||
ASSERT_EQ (rai::process_result::progress, ledger.process (transaction, block1).code);
|
||||
ASSERT_EQ (rai::genesis_amount, store.representation_get (transaction, rai::test_genesis_key.pub));
|
||||
ASSERT_EQ (rai::genesis_amount - 100, store.representation_get (transaction, rai::test_genesis_key.pub));
|
||||
rai::keypair key3;
|
||||
rai::open_block block2 (block1.hash (), key3.pub, key2.pub, key2.prv, key2.pub, 0);
|
||||
ASSERT_EQ (rai::process_result::progress, ledger.process (transaction, block2).code);
|
||||
|
@ -600,7 +603,7 @@ TEST (ledger, representation)
|
|||
ASSERT_EQ (100, store.representation_get (transaction, key3.pub));
|
||||
rai::send_block block3 (block1.hash (), key2.pub, rai::genesis_amount - 200, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
|
||||
ASSERT_EQ (rai::process_result::progress, ledger.process (transaction, block3).code);
|
||||
ASSERT_EQ (rai::genesis_amount - 100, store.representation_get (transaction, rai::test_genesis_key.pub));
|
||||
ASSERT_EQ (rai::genesis_amount - 200, store.representation_get (transaction, rai::test_genesis_key.pub));
|
||||
ASSERT_EQ (0, store.representation_get (transaction, key2.pub));
|
||||
ASSERT_EQ (100, store.representation_get (transaction, key3.pub));
|
||||
rai::receive_block block4 (block2.hash (), block3.hash (), key2.prv, key2.pub, 0);
|
||||
|
@ -621,7 +624,7 @@ TEST (ledger, representation)
|
|||
ASSERT_EQ (rai::genesis_amount - 200, store.representation_get (transaction, rai::test_genesis_key.pub));
|
||||
ASSERT_EQ (0, store.representation_get (transaction, key2.pub));
|
||||
ASSERT_EQ (0, store.representation_get (transaction, key3.pub));
|
||||
ASSERT_EQ (200, store.representation_get (transaction, key4.pub));
|
||||
ASSERT_EQ (100, store.representation_get (transaction, key4.pub));
|
||||
ASSERT_EQ (0, store.representation_get (transaction, key5.pub));
|
||||
rai::keypair key6;
|
||||
rai::open_block block7 (block6.hash (), key6.pub, key5.pub, key5.prv, key5.pub, 0);
|
||||
|
@ -637,7 +640,7 @@ TEST (ledger, representation)
|
|||
ASSERT_EQ (rai::genesis_amount - 200, store.representation_get (transaction, rai::test_genesis_key.pub));
|
||||
ASSERT_EQ (0, store.representation_get (transaction, key2.pub));
|
||||
ASSERT_EQ (0, store.representation_get (transaction, key3.pub));
|
||||
ASSERT_EQ (100, store.representation_get (transaction, key4.pub));
|
||||
ASSERT_EQ (0, store.representation_get (transaction, key4.pub));
|
||||
ASSERT_EQ (0, store.representation_get (transaction, key5.pub));
|
||||
ASSERT_EQ (100, store.representation_get (transaction, key6.pub));
|
||||
rai::receive_block block9 (block7.hash (), block8.hash (), key5.prv, key5.pub, 0);
|
||||
|
@ -717,7 +720,7 @@ TEST (votes, add_one)
|
|||
auto & node1 (*system.nodes [0]);
|
||||
rai::genesis genesis;
|
||||
rai::keypair key1;
|
||||
rai::send_block send1 (genesis.hash (), key1.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
|
||||
rai::send_block send1 (genesis.hash (), key1.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
|
||||
{
|
||||
rai::transaction transaction (node1.store.environment, nullptr, true);
|
||||
ASSERT_EQ (rai::process_result::progress, node1.ledger.process (transaction, send1).code);
|
||||
|
@ -738,7 +741,7 @@ TEST (votes, add_one)
|
|||
rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false);
|
||||
auto winner (node1.ledger.winner (transaction, votes1->votes));
|
||||
ASSERT_EQ (send1, *winner.second);
|
||||
ASSERT_EQ (rai::genesis_amount, winner.first);
|
||||
ASSERT_EQ (rai::genesis_amount - 100, winner.first);
|
||||
}
|
||||
|
||||
TEST (votes, add_two)
|
||||
|
@ -747,7 +750,7 @@ TEST (votes, add_two)
|
|||
auto & node1 (*system.nodes [0]);
|
||||
rai::genesis genesis;
|
||||
rai::keypair key1;
|
||||
rai::send_block send1 (genesis.hash (), key1.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
|
||||
rai::send_block send1 (genesis.hash (), key1.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
|
||||
{
|
||||
rai::transaction transaction (node1.store.environment, nullptr, true);
|
||||
ASSERT_EQ (rai::process_result::progress, node1.ledger.process (transaction, send1).code);
|
||||
|
@ -1332,4 +1335,28 @@ TEST (ledger, inactive_supply)
|
|||
ASSERT_EQ (0, ledger.supply (transaction));
|
||||
ledger.inactive_supply = 0;
|
||||
ASSERT_EQ (50, ledger.supply (transaction));
|
||||
}
|
||||
|
||||
TEST (ledger, change_representative_move_representation)
|
||||
{
|
||||
bool init (false);
|
||||
rai::block_store store (init, rai::unique_path ());
|
||||
ASSERT_TRUE (!init);
|
||||
rai::ledger ledger (store);
|
||||
rai::keypair key1;
|
||||
rai::transaction transaction (store.environment, nullptr, true);
|
||||
rai::genesis genesis;
|
||||
genesis.initialize (transaction, store);
|
||||
auto hash1 (genesis.hash ());
|
||||
ASSERT_EQ (rai::genesis_amount, ledger.weight (transaction, rai::test_genesis_key.pub));
|
||||
rai::send_block send (hash1, key1.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
|
||||
ASSERT_EQ (rai::process_result::progress, ledger.process (transaction, send).code);
|
||||
ASSERT_EQ (0, ledger.weight (transaction, rai::test_genesis_key.pub));
|
||||
rai::keypair key2;
|
||||
rai::change_block change (send.hash (), key2.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
|
||||
ASSERT_EQ (rai::process_result::progress, ledger.process (transaction, change).code);
|
||||
rai::keypair key3;
|
||||
rai::open_block open (send.hash (), key3.pub, key1.pub, key1.prv, key1.pub, 0);
|
||||
ASSERT_EQ (rai::process_result::progress, ledger.process (transaction, open).code);
|
||||
ASSERT_EQ (rai::genesis_amount, ledger.weight (transaction, key3.pub));
|
||||
}
|
|
@ -666,11 +666,11 @@ TEST (node, fork_publish)
|
|||
system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv);
|
||||
rai::keypair key1;
|
||||
rai::genesis genesis;
|
||||
std::unique_ptr <rai::send_block> send1 (new rai::send_block (genesis.hash (), key1.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0));
|
||||
std::unique_ptr <rai::send_block> send1 (new rai::send_block (genesis.hash (), key1.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0));
|
||||
rai::publish publish1;
|
||||
publish1.block = std::move (send1);
|
||||
rai::keypair key2;
|
||||
std::unique_ptr <rai::send_block> send2 (new rai::send_block (genesis.hash (), key2.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0));
|
||||
std::unique_ptr <rai::send_block> send2 (new rai::send_block (genesis.hash (), key2.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0));
|
||||
rai::publish publish2;
|
||||
publish2.block = std::move (send2);
|
||||
node1.process_message (publish1, node1.network.endpoint ());
|
||||
|
@ -703,7 +703,7 @@ TEST (node, fork_publish)
|
|||
rai::transaction transaction (node1.store.environment, nullptr, false);
|
||||
auto winner (node1.ledger.winner (transaction, votes1->votes));
|
||||
ASSERT_EQ (*publish1.block, *winner.second);
|
||||
ASSERT_EQ (rai::genesis_amount, winner.first);
|
||||
ASSERT_EQ (rai::genesis_amount - 100, winner.first);
|
||||
}
|
||||
ASSERT_TRUE (node0.expired ());
|
||||
}
|
||||
|
@ -717,11 +717,11 @@ TEST (node, fork_keep)
|
|||
system.wallet (0)->insert_adhoc ( rai::test_genesis_key.prv);
|
||||
rai::keypair key1;
|
||||
rai::genesis genesis;
|
||||
std::unique_ptr <rai::send_block> send1 (new rai::send_block (genesis.hash (), key1.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
std::unique_ptr <rai::send_block> send1 (new rai::send_block (genesis.hash (), key1.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
rai::publish publish1;
|
||||
publish1.block = std::move (send1);
|
||||
rai::keypair key2;
|
||||
std::unique_ptr <rai::send_block> send2 (new rai::send_block (genesis.hash (), key2.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
std::unique_ptr <rai::send_block> send2 (new rai::send_block (genesis.hash (), key2.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
rai::publish publish2;
|
||||
publish2.block = std::move (send2);
|
||||
node1.process_message (publish1, node1.network.endpoint ());
|
||||
|
@ -757,7 +757,7 @@ TEST (node, fork_keep)
|
|||
rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false);
|
||||
auto winner (node1.ledger.winner (transaction, votes1->votes));
|
||||
ASSERT_EQ (*publish1.block, *winner.second);
|
||||
ASSERT_EQ (rai::genesis_amount, winner.first);
|
||||
ASSERT_EQ (rai::genesis_amount - 100, winner.first);
|
||||
ASSERT_TRUE (system.nodes [0]->store.block_exists (transaction, publish1.block->hash ()));
|
||||
ASSERT_TRUE (system.nodes [1]->store.block_exists (transaction, publish1.block->hash ()));
|
||||
}
|
||||
|
@ -771,11 +771,11 @@ TEST (node, fork_flip)
|
|||
system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv);
|
||||
rai::keypair key1;
|
||||
rai::genesis genesis;
|
||||
std::unique_ptr <rai::send_block> send1 (new rai::send_block (genesis.hash (), key1.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
std::unique_ptr <rai::send_block> send1 (new rai::send_block (genesis.hash (), key1.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
rai::publish publish1;
|
||||
publish1.block = std::move (send1);
|
||||
rai::keypair key2;
|
||||
std::unique_ptr <rai::send_block> send2 (new rai::send_block (genesis.hash (), key2.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
std::unique_ptr <rai::send_block> send2 (new rai::send_block (genesis.hash (), key2.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
rai::publish publish2;
|
||||
publish2.block = std::move (send2);
|
||||
node1.process_message (publish1, node1.network.endpoint ());
|
||||
|
@ -814,7 +814,7 @@ TEST (node, fork_flip)
|
|||
rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false);
|
||||
auto winner (node2.ledger.winner (transaction, votes1->votes));
|
||||
ASSERT_EQ (*publish1.block, *winner.second);
|
||||
ASSERT_EQ (rai::genesis_amount, winner.first);
|
||||
ASSERT_EQ (rai::genesis_amount - 100, winner.first);
|
||||
ASSERT_TRUE (node1.store.block_exists (transaction, publish1.block->hash ()));
|
||||
ASSERT_TRUE (node2.store.block_exists (transaction, publish1.block->hash ()));
|
||||
ASSERT_FALSE (node2.store.block_exists (transaction, publish2.block->hash ()));
|
||||
|
@ -829,14 +829,14 @@ TEST (node, fork_multi_flip)
|
|||
system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv);
|
||||
rai::keypair key1;
|
||||
rai::genesis genesis;
|
||||
std::unique_ptr <rai::send_block> send1 (new rai::send_block (genesis.hash (), key1.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
std::unique_ptr <rai::send_block> send1 (new rai::send_block (genesis.hash (), key1.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
rai::publish publish1;
|
||||
publish1.block = std::move (send1);
|
||||
rai::keypair key2;
|
||||
std::unique_ptr <rai::send_block> send2 (new rai::send_block (genesis.hash (), key2.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
std::unique_ptr <rai::send_block> send2 (new rai::send_block (genesis.hash (), key2.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
|
||||
rai::publish publish2;
|
||||
publish2.block = std::move (send2);
|
||||
std::unique_ptr <rai::send_block> send3 (new rai::send_block (publish2.block->hash (), key2.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (publish2.block->hash ())));
|
||||
std::unique_ptr <rai::send_block> send3 (new rai::send_block (publish2.block->hash (), key2.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (publish2.block->hash ())));
|
||||
rai::publish publish3;
|
||||
publish3.block = std::move (send3);
|
||||
node1.process_message (publish1, node1.network.endpoint ());
|
||||
|
@ -878,7 +878,7 @@ TEST (node, fork_multi_flip)
|
|||
rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false);
|
||||
auto winner (node1.ledger.winner (transaction, votes1->votes));
|
||||
ASSERT_EQ (*publish1.block, *winner.second);
|
||||
ASSERT_EQ (rai::genesis_amount, winner.first);
|
||||
ASSERT_EQ (rai::genesis_amount - 100, winner.first);
|
||||
ASSERT_TRUE (node1.store.block_exists (transaction, publish1.block->hash ()));
|
||||
ASSERT_TRUE (node2.store.block_exists (transaction, publish1.block->hash ()));
|
||||
ASSERT_FALSE (node2.store.block_exists (transaction, publish2.block->hash ()));
|
||||
|
@ -1034,7 +1034,7 @@ TEST (node, fork_no_vote_quorum)
|
|||
auto block (system.wallet (0)->send_action (rai::test_genesis_key.pub, key1, node1.config.receive_minimum.number ()));
|
||||
ASSERT_NE (nullptr, block);
|
||||
auto iterations (0);
|
||||
while (node3.balance (key1) != node1.config.receive_minimum.number ())
|
||||
while (node3.balance (key1) != node1.config.receive_minimum.number () || node2.balance (key1) != node1.config.receive_minimum.number () || node1.balance (key1) != node1.config.receive_minimum.number ())
|
||||
{
|
||||
system.poll ();
|
||||
++iterations;
|
||||
|
|
|
@ -1345,69 +1345,6 @@ void rai::node::process_confirmation (rai::block const & block_a, rai::endpoint
|
|||
});
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
class rollback_visitor : public rai::block_visitor
|
||||
{
|
||||
public:
|
||||
rollback_visitor (rai::ledger & ledger_a) :
|
||||
ledger (ledger_a)
|
||||
{
|
||||
}
|
||||
void send_block (rai::send_block const & block_a) override
|
||||
{
|
||||
auto hash (block_a.hash ());
|
||||
rai::pending_info pending;
|
||||
rai::transaction transaction (ledger.store.environment, nullptr, true);
|
||||
while (ledger.store.pending_get (transaction, hash, pending))
|
||||
{
|
||||
ledger.rollback (transaction, ledger.latest (transaction, block_a.hashables.destination));
|
||||
}
|
||||
rai::account_info info;
|
||||
ledger.store.account_get (transaction, pending.source, info);
|
||||
ledger.store.pending_del (transaction, hash);
|
||||
ledger.change_latest (transaction, pending.source, block_a.hashables.previous, info.rep_block, ledger.balance (transaction, block_a.hashables.previous));
|
||||
ledger.store.block_del (transaction, hash);
|
||||
}
|
||||
void receive_block (rai::receive_block const & block_a) override
|
||||
{
|
||||
rai::transaction transaction (ledger.store.environment, nullptr, true);
|
||||
auto hash (block_a.hash ());
|
||||
auto representative (ledger.representative (transaction, block_a.hashables.source));
|
||||
auto amount (ledger.amount (transaction, block_a.hashables.source));
|
||||
auto destination_account (ledger.account (transaction, hash));
|
||||
ledger.move_representation (transaction, ledger.representative (transaction, hash), representative, amount);
|
||||
ledger.change_latest (transaction, destination_account, block_a.hashables.previous, representative, ledger.balance (transaction, block_a.hashables.previous));
|
||||
ledger.store.block_del (transaction, hash);
|
||||
ledger.store.pending_put (transaction, block_a.hashables.source, {ledger.account (transaction, block_a.hashables.source), amount, destination_account});
|
||||
}
|
||||
void open_block (rai::open_block const & block_a) override
|
||||
{
|
||||
rai::transaction transaction (ledger.store.environment, nullptr, true);
|
||||
auto hash (block_a.hash ());
|
||||
auto representative (ledger.representative (transaction, block_a.hashables.source));
|
||||
auto amount (ledger.amount (transaction, block_a.hashables.source));
|
||||
auto destination_account (ledger.account (transaction, hash));
|
||||
ledger.move_representation (transaction, ledger.representative (transaction, hash), representative, amount);
|
||||
ledger.change_latest (transaction, destination_account, 0, representative, 0);
|
||||
ledger.store.block_del (transaction, hash);
|
||||
ledger.store.pending_put (transaction, block_a.hashables.source, {ledger.account (transaction, block_a.hashables.source), amount, destination_account});
|
||||
}
|
||||
void change_block (rai::change_block const & block_a) override
|
||||
{
|
||||
rai::transaction transaction (ledger.store.environment, nullptr, true);
|
||||
auto representative (ledger.representative (transaction, block_a.hashables.previous));
|
||||
auto account (ledger.account (transaction, block_a.hashables.previous));
|
||||
rai::account_info info;
|
||||
ledger.store.account_get (transaction, account, info);
|
||||
ledger.move_representation (transaction, block_a.representative (), representative, ledger.balance (transaction, block_a.hashables.previous));
|
||||
ledger.store.block_del (transaction, block_a.hash ());
|
||||
ledger.change_latest (transaction, account, block_a.hashables.previous, representative, info.balance);
|
||||
}
|
||||
rai::ledger & ledger;
|
||||
};
|
||||
}
|
||||
|
||||
bool rai::parse_port (std::string const & string_a, uint16_t & port_a)
|
||||
{
|
||||
bool result;
|
||||
|
|
|
@ -2492,6 +2492,7 @@ public:
|
|||
rai::account_info info;
|
||||
ledger.store.account_get (transaction, pending.source, info);
|
||||
ledger.store.pending_del (transaction, hash);
|
||||
ledger.add_representation (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.store.block_del (transaction, hash);
|
||||
ledger.store.frontier_del (transaction, hash);
|
||||
|
@ -2504,7 +2505,7 @@ public:
|
|||
auto representative (ledger.representative (transaction, block_a.hashables.source));
|
||||
auto amount (ledger.amount (transaction, block_a.hashables.source));
|
||||
auto destination_account (ledger.account (transaction, hash));
|
||||
ledger.move_representation (transaction, ledger.representative (transaction, hash), representative, amount);
|
||||
ledger.add_representation (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.store.block_del (transaction, hash);
|
||||
ledger.store.pending_put (transaction, block_a.hashables.source, {ledger.account (transaction, block_a.hashables.source), amount, destination_account});
|
||||
|
@ -2518,7 +2519,7 @@ public:
|
|||
auto representative (ledger.representative (transaction, block_a.hashables.source));
|
||||
auto amount (ledger.amount (transaction, block_a.hashables.source));
|
||||
auto destination_account (ledger.account (transaction, hash));
|
||||
ledger.move_representation (transaction, ledger.representative (transaction, hash), representative, amount);
|
||||
ledger.add_representation (transaction, ledger.representative (transaction, hash), 0 - amount);
|
||||
ledger.change_latest (transaction, destination_account, 0, representative, 0);
|
||||
ledger.store.block_del (transaction, hash);
|
||||
ledger.store.pending_put (transaction, block_a.hashables.source, {ledger.account (transaction, block_a.hashables.source), amount, destination_account});
|
||||
|
@ -2531,7 +2532,9 @@ public:
|
|||
auto account (ledger.account (transaction, block_a.hashables.previous));
|
||||
rai::account_info info;
|
||||
ledger.store.account_get (transaction, account, info);
|
||||
ledger.move_representation (transaction, hash, representative, ledger.balance (transaction, block_a.hashables.previous));
|
||||
auto balance (ledger.balance (transaction, block_a.hashables.previous));
|
||||
ledger.add_representation (transaction, representative, balance);
|
||||
ledger.add_representation (transaction, hash, 0 - balance);
|
||||
ledger.store.block_del (transaction, hash);
|
||||
ledger.change_latest (transaction, account, block_a.hashables.previous, representative, info.balance);
|
||||
ledger.store.frontier_del (transaction, hash);
|
||||
|
@ -2682,21 +2685,14 @@ rai::uint128_t rai::ledger::amount (MDB_txn * transaction_a, rai::block_hash con
|
|||
return amount.result;
|
||||
}
|
||||
|
||||
void rai::ledger::move_representation (MDB_txn * transaction_a, rai::block_hash const & source_a, rai::block_hash const & destination_a, rai::uint128_t const & amount_a)
|
||||
void rai::ledger::add_representation (MDB_txn * transaction_a, rai::block_hash const & source_a, rai::uint128_t const & amount_a)
|
||||
{
|
||||
auto source_block (store.block_get (transaction_a, source_a));
|
||||
assert (source_block != nullptr);
|
||||
auto source_rep (source_block->representative ());
|
||||
assert (!source_rep.is_zero ());
|
||||
auto destination_block (store.block_get (transaction_a, destination_a));
|
||||
assert (destination_block != nullptr);
|
||||
auto destination_rep (destination_block->representative ());
|
||||
assert (!destination_rep.is_zero ());
|
||||
auto source_previous (store.representation_get (transaction_a, source_rep));
|
||||
assert (source_previous >= amount_a);
|
||||
store.representation_put (transaction_a, source_rep, source_previous - amount_a);
|
||||
auto destination_previous (store.representation_get (transaction_a, destination_rep));
|
||||
store.representation_put (transaction_a, destination_rep, destination_previous + amount_a);
|
||||
store.representation_put (transaction_a, source_rep, source_previous + amount_a);
|
||||
}
|
||||
|
||||
// Return latest block for account
|
||||
|
@ -2827,7 +2823,9 @@ void ledger_processor::change_block (rai::change_block const & block_a)
|
|||
if (result.code == rai::process_result::progress)
|
||||
{
|
||||
ledger.store.block_put (transaction, hash, block_a);
|
||||
ledger.move_representation (transaction, info.rep_block, hash, ledger.balance (transaction, block_a.hashables.previous));
|
||||
auto balance (ledger.balance (transaction, block_a.hashables.previous));
|
||||
ledger.add_representation (transaction, hash, balance);
|
||||
ledger.add_representation (transaction, info.rep_block, 0 - balance);
|
||||
ledger.change_latest (transaction, account, hash, hash, info.balance);
|
||||
ledger.store.frontier_del (transaction, block_a.hashables.previous);
|
||||
ledger.store.frontier_put (transaction, hash, account);
|
||||
|
@ -2865,6 +2863,7 @@ void ledger_processor::send_block (rai::send_block const & block_a)
|
|||
if (result.code == rai::process_result::progress)
|
||||
{
|
||||
auto amount (info.balance.number () - block_a.hashables.balance.number ());
|
||||
ledger.add_representation (transaction, info.rep_block, 0 - amount);
|
||||
ledger.store.block_put (transaction, hash, block_a);
|
||||
ledger.change_latest (transaction, account, hash, info.rep_block, block_a.hashables.balance);
|
||||
ledger.store.pending_put (transaction, hash, {account, amount, block_a.hashables.destination});
|
||||
|
@ -2915,7 +2914,7 @@ void ledger_processor::receive_block (rai::receive_block const & block_a)
|
|||
ledger.store.pending_del (transaction, block_a.hashables.source);
|
||||
ledger.store.block_put (transaction, hash, block_a);
|
||||
ledger.change_latest (transaction, pending.destination, hash, info.rep_block, new_balance);
|
||||
ledger.move_representation (transaction, source_info.rep_block, info.rep_block, pending.amount.number ());
|
||||
ledger.add_representation (transaction, info.rep_block, pending.amount.number ());
|
||||
ledger.store.frontier_del (transaction, block_a.hashables.previous);
|
||||
ledger.store.frontier_put (transaction, hash, pending.destination);
|
||||
result.account = pending.destination;
|
||||
|
@ -2963,7 +2962,7 @@ void ledger_processor::open_block (rai::open_block const & block_a)
|
|||
ledger.store.pending_del (transaction, block_a.hashables.source);
|
||||
ledger.store.block_put (transaction, hash, block_a);
|
||||
ledger.change_latest (transaction, pending.destination, hash, hash, pending.amount.number ());
|
||||
ledger.move_representation (transaction, source_info.rep_block, hash, pending.amount.number ());
|
||||
ledger.add_representation (transaction, hash, pending.amount.number ());
|
||||
ledger.store.frontier_put (transaction, hash, pending.destination);
|
||||
result.account = pending.destination;
|
||||
result.amount = pending.amount;
|
||||
|
|
|
@ -463,7 +463,7 @@ public:
|
|||
rai::process_return process (MDB_txn *, rai::block 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 move_representation (MDB_txn *, rai::account const &, rai::account const &, rai::uint128_t const &);
|
||||
void add_representation (MDB_txn *, rai::account const &, rai::uint128_t const &);
|
||||
void checksum_update (MDB_txn *, rai::block_hash const &);
|
||||
rai::checksum checksum (MDB_txn *, rai::account const &, rai::account const &);
|
||||
void dump_account_chain (rai::account const &);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue