From 45dfa5cebfe5ea7ed35974f4f6d2116d79c72436 Mon Sep 17 00:00:00 2001 From: cryptocode <34946442+cryptocode@users.noreply.github.com> Date: Thu, 4 Oct 2018 03:35:32 +0200 Subject: [PATCH] Move blockstore visitors to remove lmdb dependency (#1186) --- rai/node/lmdb.hpp | 61 ------------ rai/secure/blockstore.cpp | 204 ++++++++++++++++++++++++++++++++++++++ rai/secure/blockstore.hpp | 64 ++++++++++++ rai/secure/common.cpp | 204 -------------------------------------- rai/secure/ledger.cpp | 1 - 5 files changed, 268 insertions(+), 266 deletions(-) diff --git a/rai/node/lmdb.hpp b/rai/node/lmdb.hpp index 6a22c785..4d743a02 100644 --- a/rai/node/lmdb.hpp +++ b/rai/node/lmdb.hpp @@ -83,68 +83,7 @@ public: rai::epoch epoch; }; class block_store; -/** - * Determine the balance as of this block - */ -class balance_visitor : public rai::block_visitor -{ -public: - balance_visitor (rai::transaction const &, rai::block_store &); - virtual ~balance_visitor () = default; - void compute (rai::block_hash const &); - void send_block (rai::send_block const &) override; - void receive_block (rai::receive_block const &) override; - void open_block (rai::open_block const &) override; - void change_block (rai::change_block const &) override; - void state_block (rai::state_block const &) override; - rai::transaction const & transaction; - rai::block_store & store; - rai::block_hash current_balance; - rai::block_hash current_amount; - rai::uint128_t balance; -}; -/** - * Determine the amount delta resultant from this block - */ -class amount_visitor : public rai::block_visitor -{ -public: - amount_visitor (rai::transaction const &, rai::block_store &); - virtual ~amount_visitor () = default; - void compute (rai::block_hash const &); - void send_block (rai::send_block const &) override; - void receive_block (rai::receive_block const &) override; - void open_block (rai::open_block const &) override; - void change_block (rai::change_block const &) override; - void state_block (rai::state_block const &) override; - void from_send (rai::block_hash const &); - rai::transaction const & transaction; - rai::block_store & store; - rai::block_hash current_amount; - rai::block_hash current_balance; - rai::uint128_t amount; -}; - -/** - * Determine the representative for this block - */ -class representative_visitor : public rai::block_visitor -{ -public: - representative_visitor (rai::transaction const & transaction_a, rai::block_store & store_a); - virtual ~representative_visitor () = default; - void compute (rai::block_hash const & hash_a); - void send_block (rai::send_block const & block_a) override; - void receive_block (rai::receive_block const & block_a) override; - void open_block (rai::open_block const & block_a) override; - void change_block (rai::change_block const & block_a) override; - void state_block (rai::state_block const & block_a) override; - rai::transaction const & transaction; - rai::block_store & store; - rai::block_hash current; - rai::block_hash result; -}; template class mdb_iterator : public store_iterator_impl { diff --git a/rai/secure/blockstore.cpp b/rai/secure/blockstore.cpp index 783312c2..41749f16 100644 --- a/rai/secure/blockstore.cpp +++ b/rai/secure/blockstore.cpp @@ -4,3 +4,207 @@ #include #include + +rai::amount_visitor::amount_visitor (rai::transaction const & transaction_a, rai::block_store & store_a) : +transaction (transaction_a), +store (store_a), +current_amount (0), +current_balance (0), +amount (0) +{ +} + +void rai::amount_visitor::send_block (rai::send_block const & block_a) +{ + current_balance = block_a.hashables.previous; + amount = block_a.hashables.balance.number (); + current_amount = 0; +} + +void rai::amount_visitor::receive_block (rai::receive_block const & block_a) +{ + current_amount = block_a.hashables.source; +} + +void rai::amount_visitor::open_block (rai::open_block const & block_a) +{ + if (block_a.hashables.source != rai::genesis_account) + { + current_amount = block_a.hashables.source; + } + else + { + amount = rai::genesis_amount; + current_amount = 0; + } +} + +void rai::amount_visitor::state_block (rai::state_block const & block_a) +{ + current_balance = block_a.hashables.previous; + amount = block_a.hashables.balance.number (); + current_amount = 0; +} + +void rai::amount_visitor::change_block (rai::change_block const & block_a) +{ + amount = 0; + current_amount = 0; +} + +void rai::amount_visitor::compute (rai::block_hash const & block_hash) +{ + current_amount = block_hash; + while (!current_amount.is_zero () || !current_balance.is_zero ()) + { + if (!current_amount.is_zero ()) + { + auto block (store.block_get (transaction, current_amount)); + if (block != nullptr) + { + block->visit (*this); + } + else + { + if (block_hash == rai::genesis_account) + { + amount = std::numeric_limits::max (); + current_amount = 0; + } + else + { + assert (false); + amount = 0; + current_amount = 0; + } + } + } + else + { + balance_visitor prev (transaction, store); + prev.compute (current_balance); + amount = amount < prev.balance ? prev.balance - amount : amount - prev.balance; + current_balance = 0; + } + } +} + +rai::balance_visitor::balance_visitor (rai::transaction const & transaction_a, rai::block_store & store_a) : +transaction (transaction_a), +store (store_a), +current_balance (0), +current_amount (0), +balance (0) +{ +} + +void rai::balance_visitor::send_block (rai::send_block const & block_a) +{ + balance += block_a.hashables.balance.number (); + current_balance = 0; +} + +void rai::balance_visitor::receive_block (rai::receive_block const & block_a) +{ + rai::block_info block_info; + if (!store.block_info_get (transaction, block_a.hash (), block_info)) + { + balance += block_info.balance.number (); + current_balance = 0; + } + else + { + current_amount = block_a.hashables.source; + current_balance = block_a.hashables.previous; + } +} + +void rai::balance_visitor::open_block (rai::open_block const & block_a) +{ + current_amount = block_a.hashables.source; + current_balance = 0; +} + +void rai::balance_visitor::change_block (rai::change_block const & block_a) +{ + rai::block_info block_info; + if (!store.block_info_get (transaction, block_a.hash (), block_info)) + { + balance += block_info.balance.number (); + current_balance = 0; + } + else + { + current_balance = block_a.hashables.previous; + } +} + +void rai::balance_visitor::state_block (rai::state_block const & block_a) +{ + balance = block_a.hashables.balance.number (); + current_balance = 0; +} + +void rai::balance_visitor::compute (rai::block_hash const & block_hash) +{ + current_balance = block_hash; + while (!current_balance.is_zero () || !current_amount.is_zero ()) + { + if (!current_amount.is_zero ()) + { + amount_visitor source (transaction, store); + source.compute (current_amount); + balance += source.amount; + current_amount = 0; + } + else + { + auto block (store.block_get (transaction, current_balance)); + assert (block != nullptr); + block->visit (*this); + } + } +} + +rai::representative_visitor::representative_visitor (rai::transaction const & transaction_a, rai::block_store & store_a) : +transaction (transaction_a), +store (store_a), +result (0) +{ +} + +void rai::representative_visitor::compute (rai::block_hash const & hash_a) +{ + current = hash_a; + while (result.is_zero ()) + { + auto block (store.block_get (transaction, current)); + assert (block != nullptr); + block->visit (*this); + } +} + +void rai::representative_visitor::send_block (rai::send_block const & block_a) +{ + current = block_a.previous (); +} + +void rai::representative_visitor::receive_block (rai::receive_block const & block_a) +{ + current = block_a.previous (); +} + +void rai::representative_visitor::open_block (rai::open_block const & block_a) +{ + result = block_a.hash (); +} + +void rai::representative_visitor::change_block (rai::change_block const & block_a) +{ + result = block_a.hash (); +} + +void rai::representative_visitor::state_block (rai::state_block const & block_a) +{ + result = block_a.hash (); +} diff --git a/rai/secure/blockstore.hpp b/rai/secure/blockstore.hpp index 3c4393b8..58495511 100644 --- a/rai/secure/blockstore.hpp +++ b/rai/secure/blockstore.hpp @@ -4,6 +4,70 @@ namespace rai { +class transaction; +class block_store; +/** + * Determine the balance as of this block + */ +class balance_visitor : public rai::block_visitor +{ +public: + balance_visitor (rai::transaction const &, rai::block_store &); + virtual ~balance_visitor () = default; + void compute (rai::block_hash const &); + void send_block (rai::send_block const &) override; + void receive_block (rai::receive_block const &) override; + void open_block (rai::open_block const &) override; + void change_block (rai::change_block const &) override; + void state_block (rai::state_block const &) override; + rai::transaction const & transaction; + rai::block_store & store; + rai::block_hash current_balance; + rai::block_hash current_amount; + rai::uint128_t balance; +}; + +/** + * Determine the amount delta resultant from this block + */ +class amount_visitor : public rai::block_visitor +{ +public: + amount_visitor (rai::transaction const &, rai::block_store &); + virtual ~amount_visitor () = default; + void compute (rai::block_hash const &); + void send_block (rai::send_block const &) override; + void receive_block (rai::receive_block const &) override; + void open_block (rai::open_block const &) override; + void change_block (rai::change_block const &) override; + void state_block (rai::state_block const &) override; + void from_send (rai::block_hash const &); + rai::transaction const & transaction; + rai::block_store & store; + rai::block_hash current_amount; + rai::block_hash current_balance; + rai::uint128_t amount; +}; + +/** + * Determine the representative for this block + */ +class representative_visitor : public rai::block_visitor +{ +public: + representative_visitor (rai::transaction const & transaction_a, rai::block_store & store_a); + virtual ~representative_visitor () = default; + void compute (rai::block_hash const & hash_a); + void send_block (rai::send_block const & block_a) override; + void receive_block (rai::receive_block const & block_a) override; + void open_block (rai::open_block const & block_a) override; + void change_block (rai::change_block const & block_a) override; + void state_block (rai::state_block const & block_a) override; + rai::transaction const & transaction; + rai::block_store & store; + rai::block_hash current; + rai::block_hash result; +}; template class store_iterator_impl { diff --git a/rai/secure/common.cpp b/rai/secure/common.cpp index 15a7d74b..e230c6ec 100644 --- a/rai/secure/common.cpp +++ b/rai/secure/common.cpp @@ -396,210 +396,6 @@ std::string rai::vote::to_json () const return stream.str (); } -rai::amount_visitor::amount_visitor (rai::transaction const & transaction_a, rai::block_store & store_a) : -transaction (transaction_a), -store (store_a), -current_amount (0), -current_balance (0), -amount (0) -{ -} - -void rai::amount_visitor::send_block (rai::send_block const & block_a) -{ - current_balance = block_a.hashables.previous; - amount = block_a.hashables.balance.number (); - current_amount = 0; -} - -void rai::amount_visitor::receive_block (rai::receive_block const & block_a) -{ - current_amount = block_a.hashables.source; -} - -void rai::amount_visitor::open_block (rai::open_block const & block_a) -{ - if (block_a.hashables.source != rai::genesis_account) - { - current_amount = block_a.hashables.source; - } - else - { - amount = rai::genesis_amount; - current_amount = 0; - } -} - -void rai::amount_visitor::state_block (rai::state_block const & block_a) -{ - current_balance = block_a.hashables.previous; - amount = block_a.hashables.balance.number (); - current_amount = 0; -} - -void rai::amount_visitor::change_block (rai::change_block const & block_a) -{ - amount = 0; - current_amount = 0; -} - -void rai::amount_visitor::compute (rai::block_hash const & block_hash) -{ - current_amount = block_hash; - while (!current_amount.is_zero () || !current_balance.is_zero ()) - { - if (!current_amount.is_zero ()) - { - auto block (store.block_get (transaction, current_amount)); - if (block != nullptr) - { - block->visit (*this); - } - else - { - if (block_hash == rai::genesis_account) - { - amount = std::numeric_limits::max (); - current_amount = 0; - } - else - { - assert (false); - amount = 0; - current_amount = 0; - } - } - } - else - { - balance_visitor prev (transaction, store); - prev.compute (current_balance); - amount = amount < prev.balance ? prev.balance - amount : amount - prev.balance; - current_balance = 0; - } - } -} - -rai::balance_visitor::balance_visitor (rai::transaction const & transaction_a, rai::block_store & store_a) : -transaction (transaction_a), -store (store_a), -current_balance (0), -current_amount (0), -balance (0) -{ -} - -void rai::balance_visitor::send_block (rai::send_block const & block_a) -{ - balance += block_a.hashables.balance.number (); - current_balance = 0; -} - -void rai::balance_visitor::receive_block (rai::receive_block const & block_a) -{ - rai::block_info block_info; - if (!store.block_info_get (transaction, block_a.hash (), block_info)) - { - balance += block_info.balance.number (); - current_balance = 0; - } - else - { - current_amount = block_a.hashables.source; - current_balance = block_a.hashables.previous; - } -} - -void rai::balance_visitor::open_block (rai::open_block const & block_a) -{ - current_amount = block_a.hashables.source; - current_balance = 0; -} - -void rai::balance_visitor::change_block (rai::change_block const & block_a) -{ - rai::block_info block_info; - if (!store.block_info_get (transaction, block_a.hash (), block_info)) - { - balance += block_info.balance.number (); - current_balance = 0; - } - else - { - current_balance = block_a.hashables.previous; - } -} - -void rai::balance_visitor::state_block (rai::state_block const & block_a) -{ - balance = block_a.hashables.balance.number (); - current_balance = 0; -} - -void rai::balance_visitor::compute (rai::block_hash const & block_hash) -{ - current_balance = block_hash; - while (!current_balance.is_zero () || !current_amount.is_zero ()) - { - if (!current_amount.is_zero ()) - { - amount_visitor source (transaction, store); - source.compute (current_amount); - balance += source.amount; - current_amount = 0; - } - else - { - auto block (store.block_get (transaction, current_balance)); - assert (block != nullptr); - block->visit (*this); - } - } -} - -rai::representative_visitor::representative_visitor (rai::transaction const & transaction_a, rai::block_store & store_a) : -transaction (transaction_a), -store (store_a), -result (0) -{ -} - -void rai::representative_visitor::compute (rai::block_hash const & hash_a) -{ - current = hash_a; - while (result.is_zero ()) - { - auto block (store.block_get (transaction, current)); - assert (block != nullptr); - block->visit (*this); - } -} - -void rai::representative_visitor::send_block (rai::send_block const & block_a) -{ - current = block_a.previous (); -} - -void rai::representative_visitor::receive_block (rai::receive_block const & block_a) -{ - current = block_a.previous (); -} - -void rai::representative_visitor::open_block (rai::open_block const & block_a) -{ - result = block_a.hash (); -} - -void rai::representative_visitor::change_block (rai::change_block const & block_a) -{ - result = block_a.hash (); -} - -void rai::representative_visitor::state_block (rai::state_block const & block_a) -{ - result = block_a.hash (); -} - rai::vote::vote (rai::vote const & other_a) : sequence (other_a.sequence), blocks (other_a.blocks), diff --git a/rai/secure/ledger.cpp b/rai/secure/ledger.cpp index 9da7b2fe..fedbdfff 100644 --- a/rai/secure/ledger.cpp +++ b/rai/secure/ledger.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include