From 4356ba13e391f95ef468e80b81c9d152098c7d2d Mon Sep 17 00:00:00 2001 From: clemahieu Date: Wed, 3 Dec 2014 20:01:55 -0600 Subject: [PATCH] Adding ledger observers. --- rai/core_test/ledger.cpp | 39 +++++++++++++++++++++++++++++++++++++++ rai/secure.cpp | 13 +++++++++++-- rai/secure.hpp | 6 +++++- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/rai/core_test/ledger.cpp b/rai/core_test/ledger.cpp index 025488ad..2059a3de 100644 --- a/rai/core_test/ledger.cpp +++ b/rai/core_test/ledger.cpp @@ -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 ::max () - 50), amount2); + ASSERT_EQ (key3.pub, account3); ASSERT_EQ (std::numeric_limits ::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 ::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 ::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 ::max (), ledger.weight (key2.pub)); rai::frontier frontier2; diff --git a/rai/secure.cpp b/rai/secure.cpp index 18f68103..f67afedd 100644 --- a/rai/secure.cpp +++ b/rai/secure.cpp @@ -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); } } } diff --git a/rai/secure.hpp b/rai/secure.hpp index 682bb9b1..d9b078e5 100644 --- a/rai/secure.hpp +++ b/rai/secure.hpp @@ -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 send_observer; + std::function receive_observer; + std::function open_observer; + std::function change_observer; }; class vote {