Skip to content

Commit

Permalink
Move blockstore visitors to remove lmdb dependency (#1186)
Browse files Browse the repository at this point in the history
  • Loading branch information
cryptocode authored and rkeene committed Oct 4, 2018
1 parent ee1da88 commit 45dfa5c
Show file tree
Hide file tree
Showing 5 changed files with 268 additions and 266 deletions.
61 changes: 0 additions & 61 deletions rai/node/lmdb.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,68 +83,7 @@ class mdb_val
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 <typename T, typename U>
class mdb_iterator : public store_iterator_impl<T, U>
{
Expand Down
204 changes: 204 additions & 0 deletions rai/secure/blockstore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,207 @@
#include <rai/secure/blockstore.hpp>

#include <boost/polymorphic_cast.hpp>

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<rai::uint128_t>::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 ();
}
64 changes: 64 additions & 0 deletions rai/secure/blockstore.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 <typename T, typename U>
class store_iterator_impl
{
Expand Down
Loading

0 comments on commit 45dfa5c

Please sign in to comment.