121 lines
7 KiB
C++
121 lines
7 KiB
C++
#pragma once
|
|
|
|
#include <nano/lib/numbers.hpp>
|
|
#include <nano/lib/timer.hpp>
|
|
#include <nano/secure/account_info.hpp>
|
|
#include <nano/secure/generate_cache_flags.hpp>
|
|
#include <nano/secure/ledger_cache.hpp>
|
|
#include <nano/secure/pending_info.hpp>
|
|
#include <nano/secure/transaction.hpp>
|
|
|
|
#include <deque>
|
|
#include <map>
|
|
|
|
namespace nano::store
|
|
{
|
|
class component;
|
|
}
|
|
|
|
namespace nano
|
|
{
|
|
class block;
|
|
enum class block_status;
|
|
enum class epoch : uint8_t;
|
|
class ledger_constants;
|
|
class pending_info;
|
|
class pending_key;
|
|
class stats;
|
|
|
|
class ledger final
|
|
{
|
|
friend class receivable_iterator;
|
|
|
|
public:
|
|
ledger (nano::store::component &, nano::stats &, nano::ledger_constants & constants, nano::generate_cache_flags const & = nano::generate_cache_flags{}, nano::uint128_t min_rep_weight_a = 0);
|
|
|
|
/** Start read-write transaction */
|
|
secure::write_transaction tx_begin_write (std::vector<nano::tables> const & tables_to_lock = {}, std::vector<nano::tables> const & tables_no_lock = {}) const;
|
|
/** Start read-only transaction */
|
|
secure::read_transaction tx_begin_read () const;
|
|
/**
|
|
* Returns the account for a given hash
|
|
* Returns std::nullopt if the block doesn't exist or has been pruned
|
|
*/
|
|
std::optional<nano::account> account (secure::transaction const &, nano::block_hash const &) const;
|
|
std::optional<nano::account_info> account_info (secure::transaction const & transaction, nano::account const & account) const;
|
|
std::optional<nano::uint128_t> amount (secure::transaction const &, nano::block_hash const &);
|
|
std::optional<nano::uint128_t> balance (secure::transaction const &, nano::block_hash const &) const;
|
|
std::shared_ptr<nano::block> block (secure::transaction const & transaction, nano::block_hash const & hash) const;
|
|
bool block_exists (secure::transaction const & transaction, nano::block_hash const & hash) const;
|
|
nano::uint128_t account_balance (secure::transaction const &, nano::account const &, bool = false) const;
|
|
nano::uint128_t account_receivable (secure::transaction const &, nano::account const &, bool = false);
|
|
/**
|
|
* Returns the cached vote weight for the given representative.
|
|
* If the weight is below the cache limit it returns 0.
|
|
* During bootstrap it returns the preconfigured bootstrap weights.
|
|
*/
|
|
nano::uint128_t weight (nano::account const &) const;
|
|
std::optional<nano::block_hash> successor (secure::transaction const &, nano::qualified_root const &) const noexcept;
|
|
std::optional<nano::block_hash> successor (secure::transaction const & transaction, nano::block_hash const & hash) const noexcept;
|
|
/* Returns the exact vote weight for the given representative by doing a database lookup */
|
|
nano::uint128_t weight_exact (secure::transaction const &, nano::account const &) const;
|
|
std::shared_ptr<nano::block> forked_block (secure::transaction const &, nano::block const &);
|
|
std::shared_ptr<nano::block> head_block (secure::transaction const &, nano::account const &);
|
|
bool block_confirmed (secure::transaction const &, nano::block_hash const &) const;
|
|
nano::block_hash latest (secure::transaction const &, nano::account const &);
|
|
nano::root latest_root (secure::transaction const &, nano::account const &);
|
|
nano::block_hash representative (secure::transaction const &, nano::block_hash const &);
|
|
nano::block_hash representative_calculated (secure::transaction const &, nano::block_hash const &);
|
|
bool block_or_pruned_exists (nano::block_hash const &) const;
|
|
bool block_or_pruned_exists (secure::transaction const &, nano::block_hash const &) const;
|
|
std::string block_text (char const *);
|
|
std::string block_text (nano::block_hash const &);
|
|
std::pair<nano::block_hash, nano::block_hash> hash_root_random (secure::transaction const &) const;
|
|
std::optional<nano::pending_info> pending_info (secure::transaction const & transaction, nano::pending_key const & key) const;
|
|
std::deque<std::shared_ptr<nano::block>> confirm (secure::write_transaction const & transaction, nano::block_hash const & hash);
|
|
nano::block_status process (secure::write_transaction const & transaction, std::shared_ptr<nano::block> block);
|
|
bool rollback (secure::write_transaction const &, nano::block_hash const &, std::vector<std::shared_ptr<nano::block>> &);
|
|
bool rollback (secure::write_transaction const &, nano::block_hash const &);
|
|
void update_account (secure::write_transaction const &, nano::account const &, nano::account_info const &, nano::account_info const &);
|
|
uint64_t pruning_action (secure::write_transaction &, nano::block_hash const &, uint64_t const);
|
|
void dump_account_chain (nano::account const &, std::ostream & = std::cout);
|
|
bool dependents_confirmed (secure::transaction const &, nano::block const &) const;
|
|
bool is_epoch_link (nano::link const &) const;
|
|
std::array<nano::block_hash, 2> dependent_blocks (secure::transaction const &, nano::block const &) const;
|
|
std::shared_ptr<nano::block> find_receive_block_by_send_hash (secure::transaction const & transaction, nano::account const & destination, nano::block_hash const & send_block_hash);
|
|
nano::account const & epoch_signer (nano::link const &) const;
|
|
nano::link const & epoch_link (nano::epoch) const;
|
|
bool migrate_lmdb_to_rocksdb (std::filesystem::path const &) const;
|
|
bool bootstrap_weight_reached () const;
|
|
static nano::epoch version (nano::block const & block);
|
|
nano::epoch version (secure::transaction const & transaction, nano::block_hash const & hash) const;
|
|
uint64_t height (secure::transaction const & transaction, nano::block_hash const & hash) const;
|
|
// Returns whether there are any receivable entries for 'account'
|
|
bool receivable_any (secure::transaction const & tx, nano::account const & account) const;
|
|
nano::receivable_iterator receivable_end () const;
|
|
// Returns the next receivable entry for an account greater than 'account'
|
|
nano::receivable_iterator receivable_upper_bound (secure::transaction const & tx, nano::account const & account) const;
|
|
// Returns the next receivable entry for the account 'account' with hash greater than 'hash'
|
|
nano::receivable_iterator receivable_upper_bound (secure::transaction const & tx, nano::account const & account, nano::block_hash const & hash) const;
|
|
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
|
uint64_t cemented_count () const;
|
|
uint64_t block_count () const;
|
|
uint64_t account_count () const;
|
|
uint64_t pruned_count () const;
|
|
static nano::uint128_t const unit;
|
|
nano::ledger_constants & constants;
|
|
nano::store::component & store;
|
|
nano::ledger_cache cache;
|
|
nano::stats & stats;
|
|
std::unordered_map<nano::account, nano::uint128_t> bootstrap_weights;
|
|
uint64_t bootstrap_weight_max_blocks{ 1 };
|
|
mutable std::atomic<bool> check_bootstrap_weights;
|
|
bool pruning{ false };
|
|
|
|
private:
|
|
// Returns the next receivable entry equal or greater than 'key'
|
|
std::optional<std::pair<nano::pending_key, nano::pending_info>> receivable_lower_bound (secure::transaction const & tx, nano::account const & account, nano::block_hash const & hash) const;
|
|
void initialize (nano::generate_cache_flags const &);
|
|
void confirm (secure::write_transaction const & transaction, nano::block const & block);
|
|
};
|
|
}
|