mirror of
https://github.com/monero-project/monero.git
synced 2024-11-17 16:27:39 +00:00
Updated documentation for blockchain.*
All functions are now documented in doxygen format. Comments have been updated to reflect the current state of the code. Many areas for improvement in clarity and design have been noted, as well as cruft to be removed. These changes are not reflected in this commit both to allow time for comment and to keep commits organized by purpose.
This commit is contained in:
parent
eb1b87d239
commit
3a484497bc
2 changed files with 925 additions and 14 deletions
|
@ -352,6 +352,7 @@ bool Blockchain::init(BlockchainDB* db, const bool testnet, const cryptonote::te
|
||||||
// we only need 1
|
// we only need 1
|
||||||
m_async_pool.create_thread(boost::bind(&boost::asio::io_service::run, &m_async_service));
|
m_async_pool.create_thread(boost::bind(&boost::asio::io_service::run, &m_async_service));
|
||||||
|
|
||||||
|
//TODO: move this block into separate functions?
|
||||||
#if defined(PER_BLOCK_CHECKPOINT)
|
#if defined(PER_BLOCK_CHECKPOINT)
|
||||||
if (!fakechain)
|
if (!fakechain)
|
||||||
load_compiled_in_block_hashes();
|
load_compiled_in_block_hashes();
|
||||||
|
@ -840,7 +841,7 @@ bool Blockchain::switch_to_alternative_blockchain(std::list<blocks_ext_by_hash::
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//removing alt_chain entries from alternative chain
|
//removing alt_chain entries from alternative chains container
|
||||||
for (auto ch_ent: alt_chain)
|
for (auto ch_ent: alt_chain)
|
||||||
{
|
{
|
||||||
m_alternative_chains.erase(ch_ent);
|
m_alternative_chains.erase(ch_ent);
|
||||||
|
@ -991,8 +992,7 @@ bool Blockchain::validate_miner_transaction(const block& b, size_t cumulative_bl
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
// get the block sizes of the last <count> blocks, starting at <from_height>
|
// get the block sizes of the last <count> blocks, and return by reference <sz>.
|
||||||
// and return by reference <sz>.
|
|
||||||
void Blockchain::get_last_n_blocks_sizes(std::vector<size_t>& sz, size_t count) const
|
void Blockchain::get_last_n_blocks_sizes(std::vector<size_t>& sz, size_t count) const
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||||
|
@ -1408,6 +1408,10 @@ bool Blockchain::get_blocks(uint64_t start_offset, size_t count, std::list<block
|
||||||
//TODO: This function *looks* like it won't need to be rewritten
|
//TODO: This function *looks* like it won't need to be rewritten
|
||||||
// to use BlockchainDB, as it calls other functions that were,
|
// to use BlockchainDB, as it calls other functions that were,
|
||||||
// but it warrants some looking into later.
|
// but it warrants some looking into later.
|
||||||
|
//
|
||||||
|
//FIXME: This function appears to want to return false if any transactions
|
||||||
|
// that belong with blocks are missing, but not if blocks themselves
|
||||||
|
// are missing.
|
||||||
bool Blockchain::handle_get_objects(NOTIFY_REQUEST_GET_OBJECTS::request& arg, NOTIFY_RESPONSE_GET_OBJECTS::request& rsp)
|
bool Blockchain::handle_get_objects(NOTIFY_REQUEST_GET_OBJECTS::request& arg, NOTIFY_RESPONSE_GET_OBJECTS::request& rsp)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||||
|
@ -1421,6 +1425,9 @@ bool Blockchain::handle_get_objects(NOTIFY_REQUEST_GET_OBJECTS::request& arg, NO
|
||||||
{
|
{
|
||||||
std::list<crypto::hash> missed_tx_ids;
|
std::list<crypto::hash> missed_tx_ids;
|
||||||
std::list<transaction> txs;
|
std::list<transaction> txs;
|
||||||
|
|
||||||
|
// FIXME: s/rsp.missed_ids/missed_tx_id/ ? Seems like rsp.missed_ids
|
||||||
|
// is for missed blocks, not missed transactions as well.
|
||||||
get_transactions(bl.tx_hashes, txs, missed_tx_ids);
|
get_transactions(bl.tx_hashes, txs, missed_tx_ids);
|
||||||
|
|
||||||
if (missed_tx_ids.size() != 0)
|
if (missed_tx_ids.size() != 0)
|
||||||
|
@ -1668,6 +1675,8 @@ uint64_t Blockchain::block_difficulty(uint64_t i) const
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
//TODO: return type should be void, throw on exception
|
||||||
|
// alternatively, return true only if no blocks missed
|
||||||
template<class t_ids_container, class t_blocks_container, class t_missed_container>
|
template<class t_ids_container, class t_blocks_container, class t_missed_container>
|
||||||
bool Blockchain::get_blocks(const t_ids_container& block_ids, t_blocks_container& blocks, t_missed_container& missed_bs) const
|
bool Blockchain::get_blocks(const t_ids_container& block_ids, t_blocks_container& blocks, t_missed_container& missed_bs) const
|
||||||
{
|
{
|
||||||
|
@ -1692,6 +1701,8 @@ bool Blockchain::get_blocks(const t_ids_container& block_ids, t_blocks_container
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
//TODO: return type should be void, throw on exception
|
||||||
|
// alternatively, return true only if no transactions missed
|
||||||
template<class t_ids_container, class t_tx_container, class t_missed_container>
|
template<class t_ids_container, class t_tx_container, class t_missed_container>
|
||||||
bool Blockchain::get_transactions(const t_ids_container& txs_ids, t_tx_container& txs, t_missed_container& missed_txs) const
|
bool Blockchain::get_transactions(const t_ids_container& txs_ids, t_tx_container& txs, t_missed_container& missed_txs) const
|
||||||
{
|
{
|
||||||
|
@ -1708,7 +1719,6 @@ bool Blockchain::get_transactions(const t_ids_container& txs_ids, t_tx_container
|
||||||
{
|
{
|
||||||
missed_txs.push_back(tx_hash);
|
missed_txs.push_back(tx_hash);
|
||||||
}
|
}
|
||||||
//FIXME: is this the correct way to handle this?
|
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -1965,6 +1975,11 @@ bool Blockchain::get_tx_outputs_gindexs(const crypto::hash& tx_id, std::vector<u
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
//FIXME: it seems this function is meant to be merely a wrapper around
|
||||||
|
// another function of the same name, this one adding one bit of
|
||||||
|
// functionality. Should probably move anything more than that
|
||||||
|
// (getting the hash of the block at height max_used_block_id)
|
||||||
|
// to the other function to keep everything in one place.
|
||||||
// This function overloads its sister function with
|
// This function overloads its sister function with
|
||||||
// an extra value (hash of highest block that holds an output used as input)
|
// an extra value (hash of highest block that holds an output used as input)
|
||||||
// as a return-by-reference.
|
// as a return-by-reference.
|
||||||
|
@ -1975,6 +1990,7 @@ bool Blockchain::check_tx_inputs(const transaction& tx, uint64_t& max_used_block
|
||||||
|
|
||||||
#if defined(PER_BLOCK_CHECKPOINT)
|
#if defined(PER_BLOCK_CHECKPOINT)
|
||||||
// check if we're doing per-block checkpointing
|
// check if we're doing per-block checkpointing
|
||||||
|
// FIXME: investigate why this block returns
|
||||||
if (m_db->height() < m_blocks_hash_check.size() && kept_by_block)
|
if (m_db->height() < m_blocks_hash_check.size() && kept_by_block)
|
||||||
{
|
{
|
||||||
TIME_MEASURE_START(a);
|
TIME_MEASURE_START(a);
|
||||||
|
@ -2038,6 +2054,10 @@ bool Blockchain::have_tx_keyimges_as_spent(const transaction &tx) const
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
// This function validates transaction inputs and their keys.
|
// This function validates transaction inputs and their keys.
|
||||||
|
// FIXME: consider moving functionality specific to one input into
|
||||||
|
// check_tx_input() rather than here, and use this function simply
|
||||||
|
// to iterate the inputs as necessary (splitting the task
|
||||||
|
// using threads, etc.)
|
||||||
bool Blockchain::check_tx_inputs(const transaction& tx, uint64_t* pmax_used_block_height)
|
bool Blockchain::check_tx_inputs(const transaction& tx, uint64_t* pmax_used_block_height)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||||
|
@ -2320,7 +2340,7 @@ bool Blockchain::check_tx_input(const txin_to_key& txin, const crypto::hash& tx_
|
||||||
|
|
||||||
output_keys.clear();
|
output_keys.clear();
|
||||||
|
|
||||||
//check ring signature
|
// collect output keys
|
||||||
outputs_visitor vi(output_keys, *this);
|
outputs_visitor vi(output_keys, *this);
|
||||||
if (!scan_outputkeys_for_indexes(txin, vi, tx_prefix_hash, pmax_related_block_height))
|
if (!scan_outputkeys_for_indexes(txin, vi, tx_prefix_hash, pmax_related_block_height))
|
||||||
{
|
{
|
||||||
|
@ -2617,6 +2637,11 @@ leave:
|
||||||
txs.push_back(tx);
|
txs.push_back(tx);
|
||||||
TIME_MEASURE_START(dd);
|
TIME_MEASURE_START(dd);
|
||||||
|
|
||||||
|
// FIXME: the storage should not be responsible for validation.
|
||||||
|
// If it does any, it is merely a sanity check.
|
||||||
|
// Validation is the purview of the Blockchain class
|
||||||
|
// - TW
|
||||||
|
//
|
||||||
// ND: this is not needed, db->add_block() checks for duplicate k_images and fails accordingly.
|
// ND: this is not needed, db->add_block() checks for duplicate k_images and fails accordingly.
|
||||||
// if (!check_for_double_spend(tx, keys))
|
// if (!check_for_double_spend(tx, keys))
|
||||||
// {
|
// {
|
||||||
|
@ -2797,6 +2822,8 @@ bool Blockchain::add_new_block(const block& bl_, block_verification_context& bvc
|
||||||
return handle_block_to_main_chain(bl, id, bvc);
|
return handle_block_to_main_chain(bl, id, bvc);
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
//TODO: Refactor, consider returning a failure height and letting
|
||||||
|
// caller decide course of action.
|
||||||
void Blockchain::check_against_checkpoints(const checkpoints& points, bool enforce)
|
void Blockchain::check_against_checkpoints(const checkpoints& points, bool enforce)
|
||||||
{
|
{
|
||||||
const auto& pts = points.get_points();
|
const auto& pts = points.get_points();
|
||||||
|
@ -2878,6 +2905,8 @@ void Blockchain::block_longhash_worker(const uint64_t height, const std::vector<
|
||||||
TIME_MEASURE_START(t);
|
TIME_MEASURE_START(t);
|
||||||
slow_hash_allocate_state();
|
slow_hash_allocate_state();
|
||||||
|
|
||||||
|
//FIXME: height should be changing here, as get_block_longhash expects
|
||||||
|
// the height of the block passed to it
|
||||||
for (const auto & block : blocks)
|
for (const auto & block : blocks)
|
||||||
{
|
{
|
||||||
crypto::hash id = get_block_hash(block);
|
crypto::hash id = get_block_hash(block);
|
||||||
|
@ -2933,6 +2962,7 @@ bool Blockchain::cleanup_handle_incoming_blocks(bool force_sync)
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
//FIXME: unused parameter txs
|
||||||
void Blockchain::output_scan_worker(const uint64_t amount, const std::vector<uint64_t> &offsets, std::vector<output_data_t> &outputs, std::unordered_map<crypto::hash, cryptonote::transaction> &txs) const
|
void Blockchain::output_scan_worker(const uint64_t amount, const std::vector<uint64_t> &offsets, std::vector<output_data_t> &outputs, std::unordered_map<crypto::hash, cryptonote::transaction> &txs) const
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue