@ -352,6 +352,7 @@ bool Blockchain::init(BlockchainDB* db, const bool testnet, const cryptonote::te
// we only need 1
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 ( ! fakechain )
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 chain s container
for ( auto ch_ent : alt_chain )
{
m_alternative_chains . erase ( ch_ent ) ;
@ -991,8 +992,7 @@ bool Blockchain::validate_miner_transaction(const block& b, size_t cumulative_bl
return true ;
}
//------------------------------------------------------------------
// get the block sizes of the last <count> blocks, starting at <from_height>
// and return by reference <sz>.
// get the block sizes of the last <count> blocks, and return by reference <sz>.
void Blockchain : : get_last_n_blocks_sizes ( std : : vector < size_t > & sz , size_t count ) const
{
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
// to use BlockchainDB, as it calls other functions that were,
// 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 )
{
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 < 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 ) ;
if ( missed_tx_ids . size ( ) ! = 0 )
@ -1668,6 +1675,8 @@ uint64_t Blockchain::block_difficulty(uint64_t i) const
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 >
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 ;
}
//------------------------------------------------------------------
//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 >
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 ) ;
}
//FIXME: is this the correct way to handle this?
catch ( const std : : exception & e )
{
return false ;
@ -1965,6 +1975,11 @@ bool Blockchain::get_tx_outputs_gindexs(const crypto::hash& tx_id, std::vector<u
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
// an extra value (hash of highest block that holds an output used as input)
// 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)
// 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 )
{
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.
// 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 )
{
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 ( ) ;
// check ring signature
// collect output keys
outputs_visitor vi ( output_keys , * this ) ;
if ( ! scan_outputkeys_for_indexes ( txin , vi , tx_prefix_hash , pmax_related_block_height ) )
{
@ -2617,6 +2637,11 @@ leave:
txs . push_back ( tx ) ;
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.
// 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 ) ;
}
//------------------------------------------------------------------
//TODO: Refactor, consider returning a failure height and letting
// caller decide course of action.
void Blockchain : : check_against_checkpoints ( const checkpoints & points , bool enforce )
{
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 ) ;
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 )
{
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
{
try