diff --git a/rai/common.cpp b/rai/common.cpp index 52644118..c39673cf 100644 --- a/rai/common.cpp +++ b/rai/common.cpp @@ -421,22 +421,24 @@ void rai::amount_visitor::send_block (rai::send_block const & block_a) balance_visitor prev (transaction, store); prev.compute (block_a.hashables.previous); result = prev.result - block_a.hashables.balance.number (); + current = 0; } void rai::amount_visitor::receive_block (rai::receive_block const & block_a) { - from_send (block_a.hashables.source); + current = block_a.hashables.source; } void rai::amount_visitor::open_block (rai::open_block const & block_a) { if (block_a.hashables.source != rai::genesis_account) { - from_send (block_a.hashables.source); + current = block_a.hashables.source; } else { result = rai::genesis_amount; + current = 0; } } @@ -446,37 +448,38 @@ void rai::amount_visitor::state_block (rai::state_block const & block_a) prev.compute (block_a.hashables.previous); result = block_a.hashables.balance.number (); result = result < prev.result ? prev.result - result : result - prev.result; + current = 0; } void rai::amount_visitor::change_block (rai::change_block const & block_a) { result = 0; -} - -void rai::amount_visitor::from_send (rai::block_hash const & hash_a) -{ - auto source_block (store.block_get (transaction, hash_a)); - assert (source_block != nullptr); - source_block->visit (*this); + current = 0; } void rai::amount_visitor::compute (rai::block_hash const & block_hash) { - auto block (store.block_get (transaction, block_hash)); - if (block != nullptr) + current = block_hash; + while (!current.is_zero ()) { - block->visit (*this); - } - else - { - if (block_hash == rai::genesis_account) + auto block (store.block_get (transaction, current)); + if (block != nullptr) { - result = std::numeric_limits::max (); + block->visit (*this); } else { - assert (false); - result = 0; + if (block_hash == rai::genesis_account) + { + result = std::numeric_limits::max (); + current = 0; + } + else + { + assert (false); + result = 0; + current = 0; + } } } } @@ -497,8 +500,6 @@ void rai::balance_visitor::send_block (rai::send_block const & block_a) void rai::balance_visitor::receive_block (rai::receive_block const & block_a) { - amount_visitor source (transaction, store); - source.compute (block_a.hashables.source); rai::block_info block_info; if (!store.block_info_get (transaction, block_a.hash (), block_info)) { @@ -507,6 +508,8 @@ void rai::balance_visitor::receive_block (rai::receive_block const & block_a) } else { + amount_visitor source (transaction, store); + source.compute (block_a.hashables.source); result += source.result; current = block_a.hashables.previous; } diff --git a/rai/common.hpp b/rai/common.hpp index 2d6efc84..cddd5faf 100644 --- a/rai/common.hpp +++ b/rai/common.hpp @@ -61,6 +61,7 @@ public: void from_send (rai::block_hash const &); MDB_txn * transaction; rai::block_store & store; + rai::block_hash current; rai::uint128_t result; };