Adding ledger observers.

This commit is contained in:
clemahieu 2014-12-03 20:01:55 -06:00
commit 4356ba13e3
3 changed files with 55 additions and 3 deletions

View file

@ -101,7 +101,16 @@ TEST (ledger, process_send)
send.hashables.destination = key2.pub;
rai::block_hash hash1 (send.hash ());
rai::sign_message (rai::test_genesis_key.prv, rai::test_genesis_key.pub, hash1, send.signature);
rai::account account1;
rai::amount amount1;
ledger.send_observer = [&account1, &amount1] (rai::account const & account_a, rai::amount const & amount_a)
{
account1 = account_a;
amount1 = amount_a;
};
ASSERT_EQ (rai::process_result::progress, ledger.process (send));
ASSERT_EQ (rai::test_genesis_key.pub, account1);
ASSERT_EQ (rai::amount (50), amount1);
ASSERT_EQ (50, ledger.account_balance (rai::test_genesis_key.pub));
rai::frontier frontier2;
ASSERT_FALSE (store.latest_get (rai::test_genesis_key.pub, frontier2));
@ -183,7 +192,19 @@ TEST (ledger, process_receive)
open.hashables.representative = key3.pub;
rai::block_hash hash2 (open.hash ());
rai::sign_message (key2.prv, key2.pub, hash2, open.signature);
rai::account account2;
rai::amount amount2;
rai::account account3;
ledger.open_observer = [&account2, &amount2, &account3] (rai::account const & account_a, rai::amount const & amount_a, rai::account const & representative_a)
{
account2 = account_a;
amount2 = amount_a;
account3 = representative_a;
};
ASSERT_EQ (rai::process_result::progress, ledger.process (open));
ASSERT_EQ (key2.pub, account2);
ASSERT_EQ (rai::amount (std::numeric_limits <rai::uint128_t>::max () - 50), amount2);
ASSERT_EQ (key3.pub, account3);
ASSERT_EQ (std::numeric_limits <rai::uint128_t>::max () - 50, ledger.weight (key3.pub));
rai::send_block send2;
send2.hashables.balance = 25;
@ -197,7 +218,16 @@ TEST (ledger, process_receive)
receive.hashables.source = hash3;
auto hash4 (receive.hash ());
rai::sign_message (key2.prv, key2.pub, hash4, receive.signature);
rai::account account1;
rai::amount amount1;
ledger.receive_observer = [&account1, &amount1] (rai::account const & account_a, rai::amount const & amount_a)
{
account1 = account_a;
amount1 = amount_a;
};
ASSERT_EQ (rai::process_result::progress, ledger.process (receive));
ASSERT_EQ (rai::uint128_union (std::numeric_limits <rai::uint128_t>::max () - 25), amount1);
ASSERT_EQ (key2.pub, account1);
ASSERT_EQ (hash4, ledger.latest (key2.pub));
ASSERT_EQ (25, ledger.account_balance (rai::test_genesis_key.pub));
ASSERT_EQ (std::numeric_limits <rai::uint128_t>::max () - 25, ledger.account_balance (key2.pub));
@ -385,7 +415,16 @@ TEST (ledger, representative_change)
rai::frontier frontier1;
ASSERT_FALSE (store.latest_get (rai::test_genesis_key.pub, frontier1));
rai::change_block block (key2.pub, frontier1.hash, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub);
rai::account account1;
rai::account account2;
ledger.change_observer = [&account1, &account2] (rai::account const & account_a, rai::account const & representative_a)
{
account1 = account_a;
account2 = representative_a;
};
ASSERT_EQ (rai::process_result::progress, ledger.process (block));
ASSERT_EQ (rai::test_genesis_key.pub, account1);
ASSERT_EQ (key2.pub, account2);
ASSERT_EQ (0, ledger.weight (rai::test_genesis_key.pub));
ASSERT_EQ (std::numeric_limits <rai::uint128_t>::max (), ledger.weight (key2.pub));
rai::frontier frontier2;

View file

@ -147,7 +147,11 @@ rai::keypair::keypair (std::string const & prv_a)
}
rai::ledger::ledger (bool & init_a, leveldb::Status const & store_init_a, rai::block_store & store_a) :
store (store_a)
store (store_a),
send_observer ([] (rai::account const &, rai::amount const &) {}),
receive_observer ([] (rai::account const &, rai::amount const &) {}),
open_observer ([] (rai::account const &, rai::amount const &, rai::account const &) {}),
change_observer ([] (rai::account const &, rai::account const &) {})
{
if (store_init_a.ok ())
{
@ -2518,6 +2522,7 @@ void ledger_processor::change_block (rai::change_block const & block_a)
ledger.move_representation (frontier.representative, block_a.hashables.representative, ledger.balance (block_a.hashables.previous));
ledger.store.block_put (message, block_a);
ledger.change_latest (account, message, block_a.hashables.representative, frontier.balance);
ledger.change_observer (account, block_a.hashables.representative);
}
}
}
@ -2551,6 +2556,7 @@ void ledger_processor::send_block (rai::send_block const & block_a)
ledger.store.block_put (message, block_a);
ledger.change_latest (account, message, frontier.representative, block_a.hashables.balance);
ledger.store.pending_put (message, {account, frontier.balance.number () - block_a.hashables.balance.number (), block_a.hashables.destination});
ledger.send_observer (account, block_a.hashables.balance);
}
}
}
@ -2583,13 +2589,15 @@ void ledger_processor::receive_block (rai::receive_block const & block_a)
result = frontier.hash == block_a.hashables.previous ? rai::process_result::progress : rai::process_result::gap_previous; // Block doesn't immediately follow latest block (Harmless)
if (result == rai::process_result::progress)
{
auto new_balance (frontier.balance.number () + receivable.amount.number ());
rai::frontier source_frontier;
auto error (ledger.store.latest_get (receivable.source, source_frontier));
assert (!error);
ledger.store.pending_del (block_a.hashables.source);
ledger.store.block_put (hash, block_a);
ledger.change_latest (receivable.destination, hash, frontier.representative, frontier.balance.number () + receivable.amount.number ());
ledger.change_latest (receivable.destination, hash, frontier.representative, new_balance);
ledger.move_representation (source_frontier.representative, frontier.representative, receivable.amount.number ());
ledger.receive_observer (receivable.destination, new_balance);
}
else
{
@ -2631,6 +2639,7 @@ void ledger_processor::open_block (rai::open_block const & block_a)
ledger.store.block_put (hash, block_a);
ledger.change_latest (receivable.destination, hash, block_a.hashables.representative, receivable.amount.number ());
ledger.move_representation (source_frontier.representative, block_a.hashables.representative, receivable.amount.number ());
ledger.open_observer (receivable.destination, receivable.amount, block_a.hashables.representative);
}
}
}

View file

@ -508,7 +508,11 @@ namespace rai
void move_representation (rai::account const &, rai::account const &, rai::uint128_t const &);
void checksum_update (rai::block_hash const &);
rai::checksum checksum (rai::account const &, rai::account const &);
rai::block_store & store;
rai::block_store & store;
std::function <void (rai::account const &, rai::amount const &)> send_observer;
std::function <void (rai::account const &, rai::amount const &)> receive_observer;
std::function <void (rai::account const &, rai::amount const &, rai::account const &)> open_observer;
std::function <void (rai::account const &, rai::account const &)> change_observer;
};
class vote
{