replace std::list with std::vector on some hot paths

also use reserve where appropriate
release-v0.5.1
moneromooo-monero 6 years ago
parent 209ec963b5
commit ed2c81ed95
No known key found for this signature in database
GPG Key ID: 686F07454D6CEFC3

@ -164,7 +164,7 @@ int pop_blocks(cryptonote::core& core, int num_blocks)
return num_blocks; return num_blocks;
} }
int check_flush(cryptonote::core &core, std::list<block_complete_entry> &blocks, bool force) int check_flush(cryptonote::core &core, std::vector<block_complete_entry> &blocks, bool force)
{ {
if (blocks.empty()) if (blocks.empty())
return 0; return 0;
@ -176,7 +176,7 @@ int check_flush(cryptonote::core &core, std::list<block_complete_entry> &blocks,
if (!force && new_height % HASH_OF_HASHES_STEP) if (!force && new_height % HASH_OF_HASHES_STEP)
return 0; return 0;
std::list<crypto::hash> hashes; std::vector<crypto::hash> hashes;
for (const auto &b: blocks) for (const auto &b: blocks)
{ {
cryptonote::block block; cryptonote::block block;
@ -312,7 +312,7 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
MINFO("Reading blockchain from bootstrap file..."); MINFO("Reading blockchain from bootstrap file...");
std::cout << ENDL; std::cout << ENDL;
std::list<block_complete_entry> blocks; std::vector<block_complete_entry> blocks;
// Skip to start_height before we start adding. // Skip to start_height before we start adding.
{ {
@ -437,7 +437,7 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
{ {
cryptonote::blobdata block; cryptonote::blobdata block;
cryptonote::block_to_blob(bp.block, block); cryptonote::block_to_blob(bp.block, block);
std::list<cryptonote::blobdata> txs; std::vector<cryptonote::blobdata> txs;
for (const auto &tx: bp.txs) for (const auto &tx: bp.txs)
{ {
txs.push_back(cryptonote::blobdata()); txs.push_back(cryptonote::blobdata());

@ -52,7 +52,7 @@ namespace cryptonote
}; };
state m_state; state m_state;
std::list<crypto::hash> m_needed_objects; std::vector<crypto::hash> m_needed_objects;
std::unordered_set<crypto::hash> m_requested_objects; std::unordered_set<crypto::hash> m_requested_objects;
uint64_t m_remote_blockchain_height; uint64_t m_remote_blockchain_height;
uint64_t m_last_response_height; uint64_t m_last_response_height;

@ -242,6 +242,7 @@ bool Blockchain::scan_outputkeys_for_indexes(size_t tx_version, const txin_to_ke
MDEBUG("Additional outputs needed: " << absolute_offsets.size() - outputs.size()); MDEBUG("Additional outputs needed: " << absolute_offsets.size() - outputs.size());
std::vector < uint64_t > add_offsets; std::vector < uint64_t > add_offsets;
std::vector<output_data_t> add_outputs; std::vector<output_data_t> add_outputs;
add_outputs.reserve(absolute_offsets.size() - outputs.size());
for (size_t i = outputs.size(); i < absolute_offsets.size(); i++) for (size_t i = outputs.size(); i < absolute_offsets.size(); i++)
add_offsets.push_back(absolute_offsets[i]); add_offsets.push_back(absolute_offsets[i]);
try try
@ -850,6 +851,11 @@ difficulty_type Blockchain::get_difficulty_for_next_block()
timestamps.clear(); timestamps.clear();
difficulties.clear(); difficulties.clear();
if (height > offset)
{
timestamps.reserve(height - offset);
difficulties.reserve(height - offset);
}
for (; offset < height; offset++) for (; offset < height; offset++)
{ {
timestamps.push_back(m_db->get_block_timestamp(offset)); timestamps.push_back(m_db->get_block_timestamp(offset));
@ -1170,6 +1176,7 @@ void Blockchain::get_last_n_blocks_sizes(std::vector<size_t>& sz, size_t count)
m_db->block_txn_start(true); m_db->block_txn_start(true);
// add size of last <count> blocks to vector <sz> (or less, if blockchain size < count) // add size of last <count> blocks to vector <sz> (or less, if blockchain size < count)
size_t start_offset = h - std::min<size_t>(h, count); size_t start_offset = h - std::min<size_t>(h, count);
sz.reserve(sz.size() + h - start_offset);
for(size_t i = start_offset; i < h; i++) for(size_t i = start_offset; i < h; i++)
{ {
sz.push_back(m_db->get_block_size(i)); sz.push_back(m_db->get_block_size(i));
@ -1367,6 +1374,7 @@ bool Blockchain::complete_timestamps_vector(uint64_t start_top_height, std::vect
size_t need_elements = BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW - timestamps.size(); size_t need_elements = BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW - timestamps.size();
CHECK_AND_ASSERT_MES(start_top_height < m_db->height(), false, "internal error: passed start_height not < " << " m_db->height() -- " << start_top_height << " >= " << m_db->height()); CHECK_AND_ASSERT_MES(start_top_height < m_db->height(), false, "internal error: passed start_height not < " << " m_db->height() -- " << start_top_height << " >= " << m_db->height());
size_t stop_offset = start_top_height > need_elements ? start_top_height - need_elements : 0; size_t stop_offset = start_top_height > need_elements ? start_top_height - need_elements : 0;
timestamps.reserve(timestamps.size() + start_top_height - stop_offset);
while (start_top_height != stop_offset) while (start_top_height != stop_offset)
{ {
timestamps.push_back(m_db->get_block_timestamp(start_top_height)); timestamps.push_back(m_db->get_block_timestamp(start_top_height));
@ -1566,7 +1574,7 @@ bool Blockchain::handle_alternative_block(const block& b, const crypto::hash& id
return true; return true;
} }
//------------------------------------------------------------------ //------------------------------------------------------------------
bool Blockchain::get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata,block>>& blocks, std::list<cryptonote::blobdata>& txs) const bool Blockchain::get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata,block>>& blocks, std::vector<cryptonote::blobdata>& txs) const
{ {
LOG_PRINT_L3("Blockchain::" << __func__); LOG_PRINT_L3("Blockchain::" << __func__);
CRITICAL_REGION_LOCAL(m_blockchain_lock); CRITICAL_REGION_LOCAL(m_blockchain_lock);
@ -1580,7 +1588,7 @@ bool Blockchain::get_blocks(uint64_t start_offset, size_t count, std::list<std::
for(const auto& blk : blocks) for(const auto& blk : blocks)
{ {
std::list<crypto::hash> missed_ids; std::vector<crypto::hash> missed_ids;
get_transactions_blobs(blk.second.tx_hashes, txs, missed_ids); get_transactions_blobs(blk.second.tx_hashes, txs, missed_ids);
CHECK_AND_ASSERT_MES(!missed_ids.size(), false, "has missed transactions in own block in main blockchain"); CHECK_AND_ASSERT_MES(!missed_ids.size(), false, "has missed transactions in own block in main blockchain");
} }
@ -1588,14 +1596,16 @@ bool Blockchain::get_blocks(uint64_t start_offset, size_t count, std::list<std::
return true; return true;
} }
//------------------------------------------------------------------ //------------------------------------------------------------------
bool Blockchain::get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata,block>>& blocks) const bool Blockchain::get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata,block>>& blocks) const
{ {
LOG_PRINT_L3("Blockchain::" << __func__); LOG_PRINT_L3("Blockchain::" << __func__);
CRITICAL_REGION_LOCAL(m_blockchain_lock); CRITICAL_REGION_LOCAL(m_blockchain_lock);
if(start_offset >= m_db->height()) const uint64_t height = m_db->height();
if(start_offset >= height)
return false; return false;
for(size_t i = start_offset; i < start_offset + count && i < m_db->height();i++) blocks.reserve(blocks.size() + height - start_offset);
for(size_t i = start_offset; i < start_offset + count && i < height;i++)
{ {
blocks.push_back(std::make_pair(m_db->get_block_blob_from_height(i), block())); blocks.push_back(std::make_pair(m_db->get_block_blob_from_height(i), block()));
if (!parse_and_validate_block_from_blob(blocks.back().first, blocks.back().second)) if (!parse_and_validate_block_from_blob(blocks.back().first, blocks.back().second))
@ -1620,13 +1630,13 @@ bool Blockchain::handle_get_objects(NOTIFY_REQUEST_GET_OBJECTS::request& arg, NO
CRITICAL_REGION_LOCAL(m_blockchain_lock); CRITICAL_REGION_LOCAL(m_blockchain_lock);
m_db->block_txn_start(true); m_db->block_txn_start(true);
rsp.current_blockchain_height = get_current_blockchain_height(); rsp.current_blockchain_height = get_current_blockchain_height();
std::list<std::pair<cryptonote::blobdata,block>> blocks; std::vector<std::pair<cryptonote::blobdata,block>> blocks;
get_blocks(arg.blocks, blocks, rsp.missed_ids); get_blocks(arg.blocks, blocks, rsp.missed_ids);
for (const auto& bl: blocks) for (const auto& bl: blocks)
{ {
std::list<crypto::hash> missed_tx_ids; std::vector<crypto::hash> missed_tx_ids;
std::list<cryptonote::blobdata> txs; std::vector<cryptonote::blobdata> txs;
// FIXME: s/rsp.missed_ids/missed_tx_id/ ? Seems like rsp.missed_ids // FIXME: s/rsp.missed_ids/missed_tx_id/ ? Seems like rsp.missed_ids
// is for missed blocks, not missed transactions as well. // is for missed blocks, not missed transactions as well.
@ -1642,7 +1652,7 @@ bool Blockchain::handle_get_objects(NOTIFY_REQUEST_GET_OBJECTS::request& arg, NO
// append missed transaction hashes to response missed_ids field, // append missed transaction hashes to response missed_ids field,
// as done below if any standalone transactions were requested // as done below if any standalone transactions were requested
// and missed. // and missed.
rsp.missed_ids.splice(rsp.missed_ids.end(), missed_tx_ids); rsp.missed_ids.insert(rsp.missed_ids.end(), missed_tx_ids.begin(), missed_tx_ids.end());
m_db->block_txn_stop(); m_db->block_txn_stop();
return false; return false;
} }
@ -1656,7 +1666,7 @@ bool Blockchain::handle_get_objects(NOTIFY_REQUEST_GET_OBJECTS::request& arg, NO
e.txs.push_back(tx); e.txs.push_back(tx);
} }
//get another transactions, if need //get another transactions, if need
std::list<cryptonote::blobdata> txs; std::vector<cryptonote::blobdata> txs;
get_transactions_blobs(arg.txs, txs, rsp.missed_ids); get_transactions_blobs(arg.txs, txs, rsp.missed_ids);
//pack aside transactions //pack aside transactions
for (const auto& tx: txs) for (const auto& tx: txs)
@ -1666,11 +1676,12 @@ bool Blockchain::handle_get_objects(NOTIFY_REQUEST_GET_OBJECTS::request& arg, NO
return true; return true;
} }
//------------------------------------------------------------------ //------------------------------------------------------------------
bool Blockchain::get_alternative_blocks(std::list<block>& blocks) const bool Blockchain::get_alternative_blocks(std::vector<block>& blocks) const
{ {
LOG_PRINT_L3("Blockchain::" << __func__); LOG_PRINT_L3("Blockchain::" << __func__);
CRITICAL_REGION_LOCAL(m_blockchain_lock); CRITICAL_REGION_LOCAL(m_blockchain_lock);
blocks.reserve(m_alternative_chains.size());
for (const auto& alt_bl: m_alternative_chains) for (const auto& alt_bl: m_alternative_chains)
{ {
blocks.push_back(alt_bl.second.bl); blocks.push_back(alt_bl.second.bl);
@ -2090,6 +2101,9 @@ uint64_t Blockchain::block_difficulty(uint64_t i) const
return 0; return 0;
} }
//------------------------------------------------------------------ //------------------------------------------------------------------
template<typename T> void reserve_container(std::vector<T> &v, size_t N) { v.reserve(N); }
template<typename T> void reserve_container(std::list<T> &v, size_t N) { }
//------------------------------------------------------------------
//TODO: return type should be void, throw on exception //TODO: return type should be void, throw on exception
// alternatively, return true only if no blocks missed // 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>
@ -2098,6 +2112,7 @@ bool Blockchain::get_blocks(const t_ids_container& block_ids, t_blocks_container
LOG_PRINT_L3("Blockchain::" << __func__); LOG_PRINT_L3("Blockchain::" << __func__);
CRITICAL_REGION_LOCAL(m_blockchain_lock); CRITICAL_REGION_LOCAL(m_blockchain_lock);
reserve_container(blocks, block_ids.size());
for (const auto& block_hash : block_ids) for (const auto& block_hash : block_ids)
{ {
try try
@ -2132,6 +2147,7 @@ bool Blockchain::get_transactions_blobs(const t_ids_container& txs_ids, t_tx_con
LOG_PRINT_L3("Blockchain::" << __func__); LOG_PRINT_L3("Blockchain::" << __func__);
CRITICAL_REGION_LOCAL(m_blockchain_lock); CRITICAL_REGION_LOCAL(m_blockchain_lock);
reserve_container(txs, txs_ids.size());
for (const auto& tx_hash : txs_ids) for (const auto& tx_hash : txs_ids)
{ {
try try
@ -2158,6 +2174,7 @@ bool Blockchain::get_transactions(const t_ids_container& txs_ids, t_tx_container
LOG_PRINT_L3("Blockchain::" << __func__); LOG_PRINT_L3("Blockchain::" << __func__);
CRITICAL_REGION_LOCAL(m_blockchain_lock); CRITICAL_REGION_LOCAL(m_blockchain_lock);
reserve_container(txs, txs_ids.size());
for (const auto& tx_hash : txs_ids) for (const auto& tx_hash : txs_ids)
{ {
try try
@ -2186,7 +2203,7 @@ bool Blockchain::get_transactions(const t_ids_container& txs_ids, t_tx_container
// Find the split point between us and foreign blockchain and return // Find the split point between us and foreign blockchain and return
// (by reference) the most recent common block hash along with up to // (by reference) the most recent common block hash along with up to
// BLOCKS_IDS_SYNCHRONIZING_DEFAULT_COUNT additional (more recent) hashes. // BLOCKS_IDS_SYNCHRONIZING_DEFAULT_COUNT additional (more recent) hashes.
bool Blockchain::find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, std::list<crypto::hash>& hashes, uint64_t& start_height, uint64_t& current_height) const bool Blockchain::find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, std::vector<crypto::hash>& hashes, uint64_t& start_height, uint64_t& current_height) const
{ {
LOG_PRINT_L3("Blockchain::" << __func__); LOG_PRINT_L3("Blockchain::" << __func__);
CRITICAL_REGION_LOCAL(m_blockchain_lock); CRITICAL_REGION_LOCAL(m_blockchain_lock);
@ -2200,6 +2217,7 @@ bool Blockchain::find_blockchain_supplement(const std::list<crypto::hash>& qbloc
m_db->block_txn_start(true); m_db->block_txn_start(true);
current_height = get_current_blockchain_height(); current_height = get_current_blockchain_height();
size_t count = 0; size_t count = 0;
hashes.reserve(std::max((size_t)(current_height - start_height), (size_t)BLOCKS_IDS_SYNCHRONIZING_DEFAULT_COUNT));
for(size_t i = start_height; i < current_height && count < BLOCKS_IDS_SYNCHRONIZING_DEFAULT_COUNT; i++, count++) for(size_t i = start_height; i < current_height && count < BLOCKS_IDS_SYNCHRONIZING_DEFAULT_COUNT; i++, count++)
{ {
hashes.push_back(m_db->get_block_hash_from_height(i)); hashes.push_back(m_db->get_block_hash_from_height(i));
@ -2224,7 +2242,7 @@ bool Blockchain::find_blockchain_supplement(const std::list<crypto::hash>& qbloc
// find split point between ours and foreign blockchain (or start at // find split point between ours and foreign blockchain (or start at
// blockchain height <req_start_block>), and return up to max_count FULL // blockchain height <req_start_block>), and return up to max_count FULL
// blocks by reference. // blocks by reference.
bool Blockchain::find_blockchain_supplement(const uint64_t req_start_block, const std::list<crypto::hash>& qblock_ids, std::list<std::pair<cryptonote::blobdata, std::list<cryptonote::blobdata> > >& blocks, uint64_t& total_height, uint64_t& start_height, bool pruned, size_t max_count) const bool Blockchain::find_blockchain_supplement(const uint64_t req_start_block, const std::list<crypto::hash>& qblock_ids, std::vector<std::pair<cryptonote::blobdata, std::vector<cryptonote::blobdata> > >& blocks, uint64_t& total_height, uint64_t& start_height, bool pruned, size_t max_count) const
{ {
LOG_PRINT_L3("Blockchain::" << __func__); LOG_PRINT_L3("Blockchain::" << __func__);
CRITICAL_REGION_LOCAL(m_blockchain_lock); CRITICAL_REGION_LOCAL(m_blockchain_lock);
@ -2250,13 +2268,14 @@ bool Blockchain::find_blockchain_supplement(const uint64_t req_start_block, cons
m_db->block_txn_start(true); m_db->block_txn_start(true);
total_height = get_current_blockchain_height(); total_height = get_current_blockchain_height();
size_t count = 0, size = 0; size_t count = 0, size = 0;
blocks.reserve(std::min(std::min(max_count, (size_t)10000), (size_t)(total_height - start_height)));
for(size_t i = start_height; i < total_height && count < max_count && (size < FIND_BLOCKCHAIN_SUPPLEMENT_MAX_SIZE || count < 3); i++, count++) for(size_t i = start_height; i < total_height && count < max_count && (size < FIND_BLOCKCHAIN_SUPPLEMENT_MAX_SIZE || count < 3); i++, count++)
{ {
blocks.resize(blocks.size()+1); blocks.resize(blocks.size()+1);
blocks.back().first = m_db->get_block_blob_from_height(i); blocks.back().first = m_db->get_block_blob_from_height(i);
block b; block b;
CHECK_AND_ASSERT_MES(parse_and_validate_block_from_blob(blocks.back().first, b), false, "internal error, invalid block"); CHECK_AND_ASSERT_MES(parse_and_validate_block_from_blob(blocks.back().first, b), false, "internal error, invalid block");
std::list<crypto::hash> mis; std::vector<crypto::hash> mis;
get_transactions_blobs(b.tx_hashes, blocks.back().second, mis, pruned); get_transactions_blobs(b.tx_hashes, blocks.back().second, mis, pruned);
CHECK_AND_ASSERT_MES(!mis.size(), false, "internal error, transaction from block not found"); CHECK_AND_ASSERT_MES(!mis.size(), false, "internal error, transaction from block not found");
size += blocks.back().first.size(); size += blocks.back().first.size();
@ -2991,6 +3010,7 @@ bool Blockchain::check_tx_inputs(transaction& tx, tx_verification_context &tvc,
void Blockchain::check_ring_signature(const crypto::hash &tx_prefix_hash, const crypto::key_image &key_image, const std::vector<rct::ctkey> &pubkeys, const std::vector<crypto::signature>& sig, uint64_t &result) void Blockchain::check_ring_signature(const crypto::hash &tx_prefix_hash, const crypto::key_image &key_image, const std::vector<rct::ctkey> &pubkeys, const std::vector<crypto::signature>& sig, uint64_t &result)
{ {
std::vector<const crypto::public_key *> p_output_keys; std::vector<const crypto::public_key *> p_output_keys;
p_output_keys.reserve(pubkeys.size());
for (auto &key : pubkeys) for (auto &key : pubkeys)
{ {
// rct::key and crypto::public_key have the same structure, avoid object ctor/memcpy // rct::key and crypto::public_key have the same structure, avoid object ctor/memcpy
@ -3087,6 +3107,7 @@ uint64_t Blockchain::get_dynamic_per_kb_fee_estimate(uint64_t grace_blocks) cons
const uint64_t min_block_size = get_min_block_size(version); const uint64_t min_block_size = get_min_block_size(version);
std::vector<size_t> sz; std::vector<size_t> sz;
get_last_n_blocks_sizes(sz, CRYPTONOTE_REWARD_BLOCKS_WINDOW - grace_blocks); get_last_n_blocks_sizes(sz, CRYPTONOTE_REWARD_BLOCKS_WINDOW - grace_blocks);
sz.reserve(grace_blocks);
for (size_t i = 0; i < grace_blocks; ++i) for (size_t i = 0; i < grace_blocks; ++i)
sz.push_back(min_block_size); sz.push_back(min_block_size);
@ -3244,6 +3265,7 @@ bool Blockchain::check_block_timestamp(const block& b, uint64_t& median_ts) cons
// need most recent 60 blocks, get index of first of those // need most recent 60 blocks, get index of first of those
size_t offset = h - BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW; size_t offset = h - BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW;
timestamps.reserve(h - offset);
for(;offset < h; ++offset) for(;offset < h; ++offset)
{ {
timestamps.push_back(m_db->get_block_timestamp(offset)); timestamps.push_back(m_db->get_block_timestamp(offset));
@ -3270,7 +3292,7 @@ void Blockchain::return_tx_to_pool(std::vector<transaction> &txs)
} }
} }
//------------------------------------------------------------------ //------------------------------------------------------------------
bool Blockchain::flush_txes_from_pool(const std::list<crypto::hash> &txids) bool Blockchain::flush_txes_from_pool(const std::vector<crypto::hash> &txids)
{ {
CRITICAL_REGION_LOCAL(m_tx_pool); CRITICAL_REGION_LOCAL(m_tx_pool);
@ -3460,6 +3482,7 @@ leave:
// Iterate over the block's transaction hashes, grabbing each // Iterate over the block's transaction hashes, grabbing each
// from the tx_pool and validating them. Each is then added // from the tx_pool and validating them. Each is then added
// to txs. Keys spent in each are added to <keys> by the double spend check. // to txs. Keys spent in each are added to <keys> by the double spend check.
txs.reserve(bl.tx_hashes.size());
for (const crypto::hash& tx_id : bl.tx_hashes) for (const crypto::hash& tx_id : bl.tx_hashes)
{ {
transaction tx; transaction tx;
@ -3873,7 +3896,7 @@ void Blockchain::output_scan_worker(const uint64_t amount, const std::vector<uin
} }
} }
uint64_t Blockchain::prevalidate_block_hashes(uint64_t height, const std::list<crypto::hash> &hashes) uint64_t Blockchain::prevalidate_block_hashes(uint64_t height, const std::vector<crypto::hash> &hashes)
{ {
// new: . . . . . X X X X X . . . . . . // new: . . . . . X X X X X . . . . . .
// pre: A A A A B B B B C C C C D D D D // pre: A A A A B B B B C C C C D D D D
@ -3976,7 +3999,7 @@ uint64_t Blockchain::prevalidate_block_hashes(uint64_t height, const std::list<c
// vs [k_image, output_keys] (m_scan_table). This is faster because it takes advantage of bulk queries // vs [k_image, output_keys] (m_scan_table). This is faster because it takes advantage of bulk queries
// and is threaded if possible. The table (m_scan_table) will be used later when querying output // and is threaded if possible. The table (m_scan_table) will be used later when querying output
// keys. // keys.
bool Blockchain::prepare_handle_incoming_blocks(const std::list<block_complete_entry> &blocks_entry) bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete_entry> &blocks_entry)
{ {
MTRACE("Blockchain::" << __func__); MTRACE("Blockchain::" << __func__);
TIME_MEASURE_START(prepare); TIME_MEASURE_START(prepare);
@ -4042,6 +4065,7 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::list<block_complete_e
for (uint64_t i = 0; i < threads; i++) for (uint64_t i = 0; i < threads; i++)
{ {
blocks[i].reserve(batches + 1);
for (int j = 0; j < batches; j++) for (int j = 0; j < batches; j++)
{ {
block block; block block;
@ -4505,7 +4529,7 @@ void Blockchain::load_compiled_in_block_hashes()
// for tx hashes will fail in handle_block_to_main_chain(..) // for tx hashes will fail in handle_block_to_main_chain(..)
CRITICAL_REGION_LOCAL(m_tx_pool); CRITICAL_REGION_LOCAL(m_tx_pool);
std::list<transaction> txs; std::vector<transaction> txs;
m_tx_pool.get_transactions(txs); m_tx_pool.get_transactions(txs);
size_t blob_size; size_t blob_size;
@ -4568,6 +4592,6 @@ bool Blockchain::for_all_outputs(uint64_t amount, std::function<bool(uint64_t he
} }
namespace cryptonote { namespace cryptonote {
template bool Blockchain::get_transactions(const std::vector<crypto::hash>&, std::list<transaction>&, std::list<crypto::hash>&) const; template bool Blockchain::get_transactions(const std::vector<crypto::hash>&, std::vector<transaction>&, std::vector<crypto::hash>&) const;
template bool Blockchain::get_transactions_blobs(const std::vector<crypto::hash>&, std::list<cryptonote::blobdata>&, std::list<crypto::hash>&, bool) const; template bool Blockchain::get_transactions_blobs(const std::vector<crypto::hash>&, std::vector<cryptonote::blobdata>&, std::vector<crypto::hash>&, bool) const;
} }

@ -157,7 +157,7 @@ namespace cryptonote
* *
* @return false if start_offset > blockchain height, else true * @return false if start_offset > blockchain height, else true
*/ */
bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata,block>>& blocks, std::list<cryptonote::blobdata>& txs) const; bool get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata,block>>& blocks, std::vector<cryptonote::blobdata>& txs) const;
/** /**
* @brief get blocks from blocks based on start height and count * @brief get blocks from blocks based on start height and count
@ -168,7 +168,7 @@ namespace cryptonote
* *
* @return false if start_offset > blockchain height, else true * @return false if start_offset > blockchain height, else true
*/ */
bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata,block>>& blocks) const; bool get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata,block>>& blocks) const;
/** /**
* @brief compiles a list of all blocks stored as alternative chains * @brief compiles a list of all blocks stored as alternative chains
@ -177,7 +177,7 @@ namespace cryptonote
* *
* @return true * @return true
*/ */
bool get_alternative_blocks(std::list<block>& blocks) const; bool get_alternative_blocks(std::vector<block>& blocks) const;
/** /**
* @brief returns the number of alternative blocks stored * @brief returns the number of alternative blocks stored
@ -213,7 +213,7 @@ namespace cryptonote
* *
* @return false on erroneous blocks, else true * @return false on erroneous blocks, else true
*/ */
bool prepare_handle_incoming_blocks(const std::list<block_complete_entry> &blocks); bool prepare_handle_incoming_blocks(const std::vector<block_complete_entry> &blocks);
/** /**
* @brief incoming blocks post-processing, cleanup, and disk sync * @brief incoming blocks post-processing, cleanup, and disk sync
@ -373,7 +373,7 @@ namespace cryptonote
* *
* @return true if a block found in common, else false * @return true if a block found in common, else false
*/ */
bool find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, std::list<crypto::hash>& hashes, uint64_t& start_height, uint64_t& current_height) const; bool find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, std::vector<crypto::hash>& hashes, uint64_t& start_height, uint64_t& current_height) const;
/** /**
* @brief get recent block hashes for a foreign chain * @brief get recent block hashes for a foreign chain
@ -420,7 +420,7 @@ namespace cryptonote
* *
* @return true if a block found in common or req_start_block specified, else false * @return true if a block found in common or req_start_block specified, else false
*/ */
bool find_blockchain_supplement(const uint64_t req_start_block, const std::list<crypto::hash>& qblock_ids, std::list<std::pair<cryptonote::blobdata, std::list<cryptonote::blobdata> > >& blocks, uint64_t& total_height, uint64_t& start_height, bool pruned, size_t max_count) const; bool find_blockchain_supplement(const uint64_t req_start_block, const std::list<crypto::hash>& qblock_ids, std::vector<std::pair<cryptonote::blobdata, std::vector<cryptonote::blobdata> > >& blocks, uint64_t& total_height, uint64_t& start_height, bool pruned, size_t max_count) const;
/** /**
* @brief retrieves a set of blocks and their transactions, and possibly other transactions * @brief retrieves a set of blocks and their transactions, and possibly other transactions
@ -829,7 +829,7 @@ namespace cryptonote
* *
* @return false if any removals fail, otherwise true * @return false if any removals fail, otherwise true
*/ */
bool flush_txes_from_pool(const std::list<crypto::hash> &txids); bool flush_txes_from_pool(const std::vector<crypto::hash> &txids);
/** /**
* @brief return a histogram of outputs on the blockchain * @brief return a histogram of outputs on the blockchain
@ -952,7 +952,7 @@ namespace cryptonote
bool is_within_compiled_block_hash_area(uint64_t height) const; bool is_within_compiled_block_hash_area(uint64_t height) const;
bool is_within_compiled_block_hash_area() const { return is_within_compiled_block_hash_area(m_db->height()); } bool is_within_compiled_block_hash_area() const { return is_within_compiled_block_hash_area(m_db->height()); }
uint64_t prevalidate_block_hashes(uint64_t height, const std::list<crypto::hash> &hashes); uint64_t prevalidate_block_hashes(uint64_t height, const std::vector<crypto::hash> &hashes);
void lock(); void lock();
void unlock(); void unlock();

@ -323,19 +323,19 @@ namespace cryptonote
top_id = m_blockchain_storage.get_tail_id(height); top_id = m_blockchain_storage.get_tail_id(height);
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata,block>>& blocks, std::list<cryptonote::blobdata>& txs) const bool core::get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata,block>>& blocks, std::vector<cryptonote::blobdata>& txs) const
{ {
return m_blockchain_storage.get_blocks(start_offset, count, blocks, txs); return m_blockchain_storage.get_blocks(start_offset, count, blocks, txs);
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata,block>>& blocks) const bool core::get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata,block>>& blocks) const
{ {
return m_blockchain_storage.get_blocks(start_offset, count, blocks); return m_blockchain_storage.get_blocks(start_offset, count, blocks);
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::get_blocks(uint64_t start_offset, size_t count, std::list<block>& blocks) const bool core::get_blocks(uint64_t start_offset, size_t count, std::vector<block>& blocks) const
{ {
std::list<std::pair<cryptonote::blobdata, cryptonote::block>> bs; std::vector<std::pair<cryptonote::blobdata, cryptonote::block>> bs;
if (!m_blockchain_storage.get_blocks(start_offset, count, bs)) if (!m_blockchain_storage.get_blocks(start_offset, count, bs))
return false; return false;
for (const auto &b: bs) for (const auto &b: bs)
@ -343,7 +343,7 @@ namespace cryptonote
return true; return true;
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::get_transactions(const std::vector<crypto::hash>& txs_ids, std::list<cryptonote::blobdata>& txs, std::list<crypto::hash>& missed_txs) const bool core::get_transactions(const std::vector<crypto::hash>& txs_ids, std::vector<cryptonote::blobdata>& txs, std::vector<crypto::hash>& missed_txs) const
{ {
return m_blockchain_storage.get_transactions_blobs(txs_ids, txs, missed_txs); return m_blockchain_storage.get_transactions_blobs(txs_ids, txs, missed_txs);
} }
@ -354,12 +354,12 @@ namespace cryptonote
return true; return true;
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::get_transactions(const std::vector<crypto::hash>& txs_ids, std::list<transaction>& txs, std::list<crypto::hash>& missed_txs) const bool core::get_transactions(const std::vector<crypto::hash>& txs_ids, std::vector<transaction>& txs, std::vector<crypto::hash>& missed_txs) const
{ {
return m_blockchain_storage.get_transactions(txs_ids, txs, missed_txs); return m_blockchain_storage.get_transactions(txs_ids, txs, missed_txs);
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::get_alternative_blocks(std::list<block>& blocks) const bool core::get_alternative_blocks(std::vector<block>& blocks) const
{ {
return m_blockchain_storage.get_alternative_blocks(blocks); return m_blockchain_storage.get_alternative_blocks(blocks);
} }
@ -672,7 +672,7 @@ namespace cryptonote
return true; return true;
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::handle_incoming_txs(const std::list<blobdata>& tx_blobs, std::vector<tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay) bool core::handle_incoming_txs(const std::vector<blobdata>& tx_blobs, std::vector<tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
{ {
TRY_ENTRY(); TRY_ENTRY();
CRITICAL_REGION_LOCAL(m_incoming_tx_lock); CRITICAL_REGION_LOCAL(m_incoming_tx_lock);
@ -683,7 +683,7 @@ namespace cryptonote
tvc.resize(tx_blobs.size()); tvc.resize(tx_blobs.size());
tools::threadpool& tpool = tools::threadpool::getInstance(); tools::threadpool& tpool = tools::threadpool::getInstance();
tools::threadpool::waiter waiter; tools::threadpool::waiter waiter;
std::list<blobdata>::const_iterator it = tx_blobs.begin(); std::vector<blobdata>::const_iterator it = tx_blobs.begin();
for (size_t i = 0; i < tx_blobs.size(); i++, ++it) { for (size_t i = 0; i < tx_blobs.size(); i++, ++it) {
tpool.submit(&waiter, [&, i, it] { tpool.submit(&waiter, [&, i, it] {
try try
@ -752,7 +752,7 @@ namespace cryptonote
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::handle_incoming_tx(const blobdata& tx_blob, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay) bool core::handle_incoming_tx(const blobdata& tx_blob, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
{ {
std::list<cryptonote::blobdata> tx_blobs; std::vector<cryptonote::blobdata> tx_blobs;
tx_blobs.push_back(tx_blob); tx_blobs.push_back(tx_blob);
std::vector<tx_verification_context> tvcv(1); std::vector<tx_verification_context> tvcv(1);
bool r = handle_incoming_txs(tx_blobs, tvcv, keeped_by_block, relayed, do_not_relay); bool r = handle_incoming_txs(tx_blobs, tvcv, keeped_by_block, relayed, do_not_relay);
@ -918,8 +918,8 @@ namespace cryptonote
const uint64_t end = start_offset + count - 1; const uint64_t end = start_offset + count - 1;
m_blockchain_storage.for_blocks_range(start_offset, end, m_blockchain_storage.for_blocks_range(start_offset, end,
[this, &emission_amount, &total_fee_amount](uint64_t, const crypto::hash& hash, const block& b){ [this, &emission_amount, &total_fee_amount](uint64_t, const crypto::hash& hash, const block& b){
std::list<transaction> txs; std::vector<transaction> txs;
std::list<crypto::hash> missed_txs; std::vector<crypto::hash> missed_txs;
uint64_t coinbase_amount = get_outs_money_amount(b.miner_tx); uint64_t coinbase_amount = get_outs_money_amount(b.miner_tx);
this->get_transactions(b.tx_hashes, txs, missed_txs); this->get_transactions(b.tx_hashes, txs, missed_txs);
uint64_t tx_fee_amount = 0; uint64_t tx_fee_amount = 0;
@ -1015,7 +1015,7 @@ namespace cryptonote
bool core::relay_txpool_transactions() bool core::relay_txpool_transactions()
{ {
// we attempt to relay txes that should be relayed, but were not // we attempt to relay txes that should be relayed, but were not
std::list<std::pair<crypto::hash, cryptonote::blobdata>> txs; std::vector<std::pair<crypto::hash, cryptonote::blobdata>> txs;
if (m_mempool.get_relayable_transactions(txs) && !txs.empty()) if (m_mempool.get_relayable_transactions(txs) && !txs.empty())
{ {
cryptonote_connection_context fake_context = AUTO_VAL_INIT(fake_context); cryptonote_connection_context fake_context = AUTO_VAL_INIT(fake_context);
@ -1033,7 +1033,7 @@ namespace cryptonote
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
void core::on_transaction_relayed(const cryptonote::blobdata& tx_blob) void core::on_transaction_relayed(const cryptonote::blobdata& tx_blob)
{ {
std::list<std::pair<crypto::hash, cryptonote::blobdata>> txs; std::vector<std::pair<crypto::hash, cryptonote::blobdata>> txs;
cryptonote::transaction tx; cryptonote::transaction tx;
crypto::hash tx_hash, tx_prefix_hash; crypto::hash tx_hash, tx_prefix_hash;
if (!parse_and_validate_tx_from_blob(tx_blob, tx, tx_hash, tx_prefix_hash)) if (!parse_and_validate_tx_from_blob(tx_blob, tx, tx_hash, tx_prefix_hash))
@ -1055,7 +1055,7 @@ namespace cryptonote
return m_blockchain_storage.find_blockchain_supplement(qblock_ids, resp); return m_blockchain_storage.find_blockchain_supplement(qblock_ids, resp);
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::find_blockchain_supplement(const uint64_t req_start_block, const std::list<crypto::hash>& qblock_ids, std::list<std::pair<cryptonote::blobdata, std::list<cryptonote::blobdata> > >& blocks, uint64_t& total_height, uint64_t& start_height, bool pruned, size_t max_count) const bool core::find_blockchain_supplement(const uint64_t req_start_block, const std::list<crypto::hash>& qblock_ids, std::vector<std::pair<cryptonote::blobdata, std::vector<cryptonote::blobdata> > >& blocks, uint64_t& total_height, uint64_t& start_height, bool pruned, size_t max_count) const
{ {
return m_blockchain_storage.find_blockchain_supplement(req_start_block, qblock_ids, blocks, total_height, start_height, pruned, max_count); return m_blockchain_storage.find_blockchain_supplement(req_start_block, qblock_ids, blocks, total_height, start_height, pruned, max_count);
} }
@ -1112,7 +1112,7 @@ namespace cryptonote
{ {
block_verification_context bvc = boost::value_initialized<block_verification_context>(); block_verification_context bvc = boost::value_initialized<block_verification_context>();
m_miner.pause(); m_miner.pause();
std::list<block_complete_entry> blocks; std::vector<block_complete_entry> blocks;
try try
{ {
blocks.push_back(get_block_complete_entry(b, m_mempool)); blocks.push_back(get_block_complete_entry(b, m_mempool));
@ -1136,8 +1136,8 @@ namespace cryptonote
cryptonote_connection_context exclude_context = boost::value_initialized<cryptonote_connection_context>(); cryptonote_connection_context exclude_context = boost::value_initialized<cryptonote_connection_context>();
NOTIFY_NEW_BLOCK::request arg = AUTO_VAL_INIT(arg); NOTIFY_NEW_BLOCK::request arg = AUTO_VAL_INIT(arg);
arg.current_blockchain_height = m_blockchain_storage.get_current_blockchain_height(); arg.current_blockchain_height = m_blockchain_storage.get_current_blockchain_height();
std::list<crypto::hash> missed_txs; std::vector<crypto::hash> missed_txs;
std::list<cryptonote::blobdata> txs; std::vector<cryptonote::blobdata> txs;
m_blockchain_storage.get_transactions_blobs(b.tx_hashes, txs, missed_txs); m_blockchain_storage.get_transactions_blobs(b.tx_hashes, txs, missed_txs);
if(missed_txs.size() && m_blockchain_storage.get_block_id_by_height(get_block_height(b)) != get_block_hash(b)) if(missed_txs.size() && m_blockchain_storage.get_block_id_by_height(get_block_height(b)) != get_block_hash(b))
{ {
@ -1173,7 +1173,7 @@ namespace cryptonote
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::prepare_handle_incoming_blocks(const std::list<block_complete_entry> &blocks) bool core::prepare_handle_incoming_blocks(const std::vector<block_complete_entry> &blocks)
{ {
m_incoming_tx_lock.lock(); m_incoming_tx_lock.lock();
m_blockchain_storage.prepare_handle_incoming_blocks(blocks); m_blockchain_storage.prepare_handle_incoming_blocks(blocks);
@ -1266,7 +1266,7 @@ namespace cryptonote
return true; return true;
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::get_pool_transactions(std::list<transaction>& txs, bool include_sensitive_data) const bool core::get_pool_transactions(std::vector<transaction>& txs, bool include_sensitive_data) const
{ {
m_mempool.get_transactions(txs, include_sensitive_data); m_mempool.get_transactions(txs, include_sensitive_data);
return true; return true;
@ -1554,7 +1554,7 @@ namespace cryptonote
return m_target_blockchain_height; return m_target_blockchain_height;
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
uint64_t core::prevalidate_block_hashes(uint64_t height, const std::list<crypto::hash> &hashes) uint64_t core::prevalidate_block_hashes(uint64_t height, const std::vector<crypto::hash> &hashes)
{ {
return get_blockchain_storage().prevalidate_block_hashes(height, hashes); return get_blockchain_storage().prevalidate_block_hashes(height, hashes);
} }

@ -133,7 +133,7 @@ namespace cryptonote
* *
* @return true if the transactions made it to the transaction pool, otherwise false * @return true if the transactions made it to the transaction pool, otherwise false
*/ */
bool handle_incoming_txs(const std::list<blobdata>& tx_blobs, std::vector<tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay); bool handle_incoming_txs(const std::vector<blobdata>& tx_blobs, std::vector<tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
/** /**
* @brief handles an incoming block * @brief handles an incoming block
@ -156,7 +156,7 @@ namespace cryptonote
* *
* @note see Blockchain::prepare_handle_incoming_blocks * @note see Blockchain::prepare_handle_incoming_blocks
*/ */
bool prepare_handle_incoming_blocks(const std::list<block_complete_entry> &blocks); bool prepare_handle_incoming_blocks(const std::vector<block_complete_entry> &blocks);
/** /**
* @copydoc Blockchain::cleanup_handle_incoming_blocks * @copydoc Blockchain::cleanup_handle_incoming_blocks
@ -308,25 +308,25 @@ namespace cryptonote
void get_blockchain_top(uint64_t& height, crypto::hash& top_id) const; void get_blockchain_top(uint64_t& height, crypto::hash& top_id) const;
/** /**
* @copydoc Blockchain::get_blocks(uint64_t, size_t, std::list<std::pair<cryptonote::blobdata,block>>&, std::list<transaction>&) const * @copydoc Blockchain::get_blocks(uint64_t, size_t, std::vector<std::pair<cryptonote::blobdata,block>>&, std::vector<transaction>&) const
* *
* @note see Blockchain::get_blocks(uint64_t, size_t, std::list<std::pair<cryptonote::blobdata,block>>&, std::list<transaction>&) const * @note see Blockchain::get_blocks(uint64_t, size_t, std::vector<std::pair<cryptonote::blobdata,block>>&, std::vector<transaction>&) const
*/ */
bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata,block>>& blocks, std::list<cryptonote::blobdata>& txs) const; bool get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata,block>>& blocks, std::vector<cryptonote::blobdata>& txs) const;
/** /**
* @copydoc Blockchain::get_blocks(uint64_t, size_t, std::list<std::pair<cryptonote::blobdata,block>>&) const * @copydoc Blockchain::get_blocks(uint64_t, size_t, std::vector<std::pair<cryptonote::blobdata,block>>&) const
* *
* @note see Blockchain::get_blocks(uint64_t, size_t, std::list<std::pair<cryptonote::blobdata,block>>&) const * @note see Blockchain::get_blocks(uint64_t, size_t, std::vector<std::pair<cryptonote::blobdata,block>>&) const
*/ */
bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata,block>>& blocks) const; bool get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata,block>>& blocks) const;
/** /**
* @copydoc Blockchain::get_blocks(uint64_t, size_t, std::list<std::pair<cryptonote::blobdata,block>>&) const * @copydoc Blockchain::get_blocks(uint64_t, size_t, std::vector<std::pair<cryptonote::blobdata,block>>&) const
* *
* @note see Blockchain::get_blocks(uint64_t, size_t, std::list<std::pair<cryptonote::blobdata,block>>&) const * @note see Blockchain::get_blocks(uint64_t, size_t, std::vector<std::pair<cryptonote::blobdata,block>>&) const
*/ */
bool get_blocks(uint64_t start_offset, size_t count, std::list<block>& blocks) const; bool get_blocks(uint64_t start_offset, size_t count, std::vector<block>& blocks) const;
/** /**
* @copydoc Blockchain::get_blocks(const t_ids_container&, t_blocks_container&, t_missed_container&) const * @copydoc Blockchain::get_blocks(const t_ids_container&, t_blocks_container&, t_missed_container&) const
@ -351,14 +351,14 @@ namespace cryptonote
* *
* @note see Blockchain::get_transactions * @note see Blockchain::get_transactions
*/ */
bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::list<cryptonote::blobdata>& txs, std::list<crypto::hash>& missed_txs) const; bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::vector<cryptonote::blobdata>& txs, std::vector<crypto::hash>& missed_txs) const;
/** /**
* @copydoc Blockchain::get_transactions * @copydoc Blockchain::get_transactions
* *
* @note see Blockchain::get_transactions * @note see Blockchain::get_transactions
*/ */
bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::list<transaction>& txs, std::list<crypto::hash>& missed_txs) const; bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::vector<transaction>& txs, std::vector<crypto::hash>& missed_txs) const;
/** /**
* @copydoc Blockchain::get_block_by_hash * @copydoc Blockchain::get_block_by_hash
@ -370,9 +370,9 @@ namespace cryptonote
/** /**
* @copydoc Blockchain::get_alternative_blocks * @copydoc Blockchain::get_alternative_blocks
* *
* @note see Blockchain::get_alternative_blocks(std::list<block>&) const * @note see Blockchain::get_alternative_blocks(std::vector<block>&) const
*/ */
bool get_alternative_blocks(std::list<block>& blocks) const; bool get_alternative_blocks(std::vector<block>& blocks) const;
/** /**
* @copydoc Blockchain::get_alternative_blocks_count * @copydoc Blockchain::get_alternative_blocks_count
@ -429,7 +429,7 @@ namespace cryptonote
* *
* @note see tx_memory_pool::get_transactions * @note see tx_memory_pool::get_transactions
*/ */
bool get_pool_transactions(std::list<transaction>& txs, bool include_unrelayed_txes = true) const; bool get_pool_transactions(std::vector<transaction>& txs, bool include_unrelayed_txes = true) const;
/** /**
* @copydoc tx_memory_pool::get_txpool_backlog * @copydoc tx_memory_pool::get_txpool_backlog
@ -512,11 +512,11 @@ namespace cryptonote
bool find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, NOTIFY_RESPONSE_CHAIN_ENTRY::request& resp) const; bool find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, NOTIFY_RESPONSE_CHAIN_ENTRY::request& resp) const;
/** /**
* @copydoc Blockchain::find_blockchain_supplement(const uint64_t, const std::list<crypto::hash>&, std::list<std::pair<cryptonote::blobdata, std::list<cryptonote::blobdata> > >&, uint64_t&, uint64_t&, size_t) const * @copydoc Blockchain::find_blockchain_supplement(const uint64_t, const std::list<crypto::hash>&, std::vector<std::pair<cryptonote::blobdata, std::vector<cryptonote::blobdata> > >&, uint64_t&, uint64_t&, size_t) const
* *
* @note see Blockchain::find_blockchain_supplement(const uint64_t, const std::list<crypto::hash>&, std::list<std::pair<cryptonote::blobdata, std::list<transaction> > >&, uint64_t&, uint64_t&, size_t) const * @note see Blockchain::find_blockchain_supplement(const uint64_t, const std::list<crypto::hash>&, std::vector<std::pair<cryptonote::blobdata, std::vector<transaction> > >&, uint64_t&, uint64_t&, size_t) const
*/ */
bool find_blockchain_supplement(const uint64_t req_start_block, const std::list<crypto::hash>& qblock_ids, std::list<std::pair<cryptonote::blobdata, std::list<cryptonote::blobdata> > >& blocks, uint64_t& total_height, uint64_t& start_height, bool pruned, size_t max_count) const; bool find_blockchain_supplement(const uint64_t req_start_block, const std::list<crypto::hash>& qblock_ids, std::vector<std::pair<cryptonote::blobdata, std::vector<cryptonote::blobdata> > >& blocks, uint64_t& total_height, uint64_t& start_height, bool pruned, size_t max_count) const;
/** /**
* @brief gets some stats about the daemon * @brief gets some stats about the daemon
@ -763,7 +763,7 @@ namespace cryptonote
* *
* @return number of usable blocks * @return number of usable blocks
*/ */
uint64_t prevalidate_block_hashes(uint64_t height, const std::list<crypto::hash> &hashes); uint64_t prevalidate_block_hashes(uint64_t height, const std::vector<crypto::hash> &hashes);
/** /**
* @brief get free disk space on the blockchain partition * @brief get free disk space on the blockchain partition

@ -556,11 +556,12 @@ namespace cryptonote
} }
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
//TODO: investigate whether boolean return is appropriate //TODO: investigate whether boolean return is appropriate
bool tx_memory_pool::get_relayable_transactions(std::list<std::pair<crypto::hash, cryptonote::blobdata>> &txs) const bool tx_memory_pool::get_relayable_transactions(std::vector<std::pair<crypto::hash, cryptonote::blobdata>> &txs) const
{ {
CRITICAL_REGION_LOCAL(m_transactions_lock); CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain); CRITICAL_REGION_LOCAL1(m_blockchain);
const uint64_t now = time(NULL); const uint64_t now = time(NULL);
txs.reserve(m_blockchain.get_txpool_tx_count());
m_blockchain.for_all_txpool_txes([this, now, &txs](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *){ m_blockchain.for_all_txpool_txes([this, now, &txs](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *){
// 0 fee transactions are never relayed // 0 fee transactions are never relayed
if(meta.fee > 0 && !meta.do_not_relay && now - meta.last_relayed_time > get_relay_delay(now, meta.receive_time)) if(meta.fee > 0 && !meta.do_not_relay && now - meta.last_relayed_time > get_relay_delay(now, meta.receive_time))
@ -588,7 +589,7 @@ namespace cryptonote
return true; return true;
} }
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
void tx_memory_pool::set_relayed(const std::list<std::pair<crypto::hash, cryptonote::blobdata>> &txs) void tx_memory_pool::set_relayed(const std::vector<std::pair<crypto::hash, cryptonote::blobdata>> &txs)
{ {
CRITICAL_REGION_LOCAL(m_transactions_lock); CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain); CRITICAL_REGION_LOCAL1(m_blockchain);
@ -621,10 +622,11 @@ namespace cryptonote
return m_blockchain.get_txpool_tx_count(include_unrelayed_txes); return m_blockchain.get_txpool_tx_count(include_unrelayed_txes);
} }
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
void tx_memory_pool::get_transactions(std::list<transaction>& txs, bool include_unrelayed_txes) const void tx_memory_pool::get_transactions(std::vector<transaction>& txs, bool include_unrelayed_txes) const
{ {
CRITICAL_REGION_LOCAL(m_transactions_lock); CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain); CRITICAL_REGION_LOCAL1(m_blockchain);
txs.reserve(m_blockchain.get_txpool_tx_count(include_unrelayed_txes));
m_blockchain.for_all_txpool_txes([&txs](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){ m_blockchain.for_all_txpool_txes([&txs](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){
transaction tx; transaction tx;
if (!parse_and_validate_tx_from_blob(*bd, tx)) if (!parse_and_validate_tx_from_blob(*bd, tx))
@ -642,6 +644,7 @@ namespace cryptonote
{ {
CRITICAL_REGION_LOCAL(m_transactions_lock); CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain); CRITICAL_REGION_LOCAL1(m_blockchain);
txs.reserve(m_blockchain.get_txpool_tx_count(include_unrelayed_txes));
m_blockchain.for_all_txpool_txes([&txs](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){ m_blockchain.for_all_txpool_txes([&txs](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){
txs.push_back(txid); txs.push_back(txid);
return true; return true;
@ -653,6 +656,7 @@ namespace cryptonote
CRITICAL_REGION_LOCAL(m_transactions_lock); CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain); CRITICAL_REGION_LOCAL1(m_blockchain);
const uint64_t now = time(NULL); const uint64_t now = time(NULL);
backlog.reserve(m_blockchain.get_txpool_tx_count(include_unrelayed_txes));
m_blockchain.for_all_txpool_txes([&backlog, now](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){ m_blockchain.for_all_txpool_txes([&backlog, now](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){
backlog.push_back({meta.blob_size, meta.fee, meta.receive_time - now}); backlog.push_back({meta.blob_size, meta.fee, meta.receive_time - now});
return true; return true;
@ -741,6 +745,8 @@ namespace cryptonote
{ {
CRITICAL_REGION_LOCAL(m_transactions_lock); CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain); CRITICAL_REGION_LOCAL1(m_blockchain);
tx_infos.reserve(m_blockchain.get_txpool_tx_count());
key_image_infos.reserve(m_blockchain.get_txpool_tx_count());
m_blockchain.for_all_txpool_txes([&tx_infos, key_image_infos, include_sensitive_data](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){ m_blockchain.for_all_txpool_txes([&tx_infos, key_image_infos, include_sensitive_data](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){
tx_info txi; tx_info txi;
txi.id_hash = epee::string_tools::pod_to_hex(txid); txi.id_hash = epee::string_tools::pod_to_hex(txid);
@ -811,6 +817,8 @@ namespace cryptonote
{ {
CRITICAL_REGION_LOCAL(m_transactions_lock); CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain); CRITICAL_REGION_LOCAL1(m_blockchain);
tx_infos.reserve(m_blockchain.get_txpool_tx_count());
key_image_infos.reserve(m_blockchain.get_txpool_tx_count());
m_blockchain.for_all_txpool_txes([&tx_infos, key_image_infos](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){ m_blockchain.for_all_txpool_txes([&tx_infos, key_image_infos](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){
cryptonote::rpc::tx_in_pool txi; cryptonote::rpc::tx_in_pool txi;
txi.tx_hash = txid; txi.tx_hash = txid;

@ -237,7 +237,7 @@ namespace cryptonote
* @param include_unrelayed_txes include unrelayed txes in the result * @param include_unrelayed_txes include unrelayed txes in the result
* *
*/ */
void get_transactions(std::list<transaction>& txs, bool include_unrelayed_txes = true) const; void get_transactions(std::vector<transaction>& txs, bool include_unrelayed_txes = true) const;
/** /**
* @brief get a list of all transaction hashes in the pool * @brief get a list of all transaction hashes in the pool
@ -324,14 +324,14 @@ namespace cryptonote
* *
* @return true * @return true
*/ */
bool get_relayable_transactions(std::list<std::pair<crypto::hash, cryptonote::blobdata>>& txs) const; bool get_relayable_transactions(std::vector<std::pair<crypto::hash, cryptonote::blobdata>>& txs) const;
/** /**
* @brief tell the pool that certain transactions were just relayed * @brief tell the pool that certain transactions were just relayed
* *
* @param txs the list of transactions (and their hashes) * @param txs the list of transactions (and their hashes)
*/ */
void set_relayed(const std::list<std::pair<crypto::hash, cryptonote::blobdata>>& txs); void set_relayed(const std::vector<std::pair<crypto::hash, cryptonote::blobdata>>& txs);
/** /**
* @brief get the total number of transactions in the pool * @brief get the total number of transactions in the pool

@ -50,10 +50,10 @@ namespace std {
namespace cryptonote namespace cryptonote
{ {
void block_queue::add_blocks(uint64_t height, std::list<cryptonote::block_complete_entry> bcel, const boost::uuids::uuid &connection_id, float rate, size_t size) void block_queue::add_blocks(uint64_t height, std::vector<cryptonote::block_complete_entry> bcel, const boost::uuids::uuid &connection_id, float rate, size_t size)
{ {
boost::unique_lock<boost::recursive_mutex> lock(mutex); boost::unique_lock<boost::recursive_mutex> lock(mutex);
std::list<crypto::hash> hashes; std::vector<crypto::hash> hashes;
bool has_hashes = remove_span(height, &hashes); bool has_hashes = remove_span(height, &hashes);
blocks.insert(span(height, std::move(bcel), connection_id, rate, size)); blocks.insert(span(height, std::move(bcel), connection_id, rate, size));
if (has_hashes) if (has_hashes)
@ -97,7 +97,7 @@ void block_queue::flush_stale_spans(const std::set<boost::uuids::uuid> &live_con
} }
} }
bool block_queue::remove_span(uint64_t start_block_height, std::list<crypto::hash> *hashes) bool block_queue::remove_span(uint64_t start_block_height, std::vector<crypto::hash> *hashes)
{ {
boost::unique_lock<boost::recursive_mutex> lock(mutex); boost::unique_lock<boost::recursive_mutex> lock(mutex);
for (block_map::iterator i = blocks.begin(); i != blocks.end(); ++i) for (block_map::iterator i = blocks.begin(); i != blocks.end(); ++i)
@ -172,7 +172,7 @@ bool block_queue::requested(const crypto::hash &hash) const
return false; return false;
} }
std::pair<uint64_t, uint64_t> block_queue::reserve_span(uint64_t first_block_height, uint64_t last_block_height, uint64_t max_blocks, const boost::uuids::uuid &connection_id, const std::list<crypto::hash> &block_hashes, boost::posix_time::ptime time) std::pair<uint64_t, uint64_t> block_queue::reserve_span(uint64_t first_block_height, uint64_t last_block_height, uint64_t max_blocks, const boost::uuids::uuid &connection_id, const std::vector<crypto::hash> &block_hashes, boost::posix_time::ptime time)
{ {
boost::unique_lock<boost::recursive_mutex> lock(mutex); boost::unique_lock<boost::recursive_mutex> lock(mutex);
@ -183,14 +183,14 @@ std::pair<uint64_t, uint64_t> block_queue::reserve_span(uint64_t first_block_hei
} }
uint64_t span_start_height = last_block_height - block_hashes.size() + 1; uint64_t span_start_height = last_block_height - block_hashes.size() + 1;
std::list<crypto::hash>::const_iterator i = block_hashes.begin(); std::vector<crypto::hash>::const_iterator i = block_hashes.begin();
while (i != block_hashes.end() && requested(*i)) while (i != block_hashes.end() && requested(*i))
{ {
++i; ++i;
++span_start_height; ++span_start_height;
} }
uint64_t span_length = 0; uint64_t span_length = 0;
std::list<crypto::hash> hashes; std::vector<crypto::hash> hashes;
while (i != block_hashes.end() && span_length < max_blocks) while (i != block_hashes.end() && span_length < max_blocks)
{ {
hashes.push_back(*i); hashes.push_back(*i);
@ -230,7 +230,7 @@ std::pair<uint64_t, uint64_t> block_queue::get_start_gap_span() const
return std::make_pair(current_height + 1, first_span_height - current_height - 1); return std::make_pair(current_height + 1, first_span_height - current_height - 1);
} }
std::pair<uint64_t, uint64_t> block_queue::get_next_span_if_scheduled(std::list<crypto::hash> &hashes, boost::uuids::uuid &connection_id, boost::posix_time::ptime &time) const std::pair<uint64_t, uint64_t> block_queue::get_next_span_if_scheduled(std::vector<crypto::hash> &hashes, boost::uuids::uuid &connection_id, boost::posix_time::ptime &time) const
{ {
boost::unique_lock<boost::recursive_mutex> lock(mutex); boost::unique_lock<boost::recursive_mutex> lock(mutex);
if (blocks.empty()) if (blocks.empty())
@ -248,7 +248,7 @@ std::pair<uint64_t, uint64_t> block_queue::get_next_span_if_scheduled(std::list<
return std::make_pair(i->start_block_height, i->nblocks); return std::make_pair(i->start_block_height, i->nblocks);
} }
void block_queue::set_span_hashes(uint64_t start_height, const boost::uuids::uuid &connection_id, std::list<crypto::hash> hashes) void block_queue::set_span_hashes(uint64_t start_height, const boost::uuids::uuid &connection_id, std::vector<crypto::hash> hashes)
{ {
boost::unique_lock<boost::recursive_mutex> lock(mutex); boost::unique_lock<boost::recursive_mutex> lock(mutex);
for (block_map::iterator i = blocks.begin(); i != blocks.end(); ++i) for (block_map::iterator i = blocks.begin(); i != blocks.end(); ++i)
@ -264,7 +264,7 @@ void block_queue::set_span_hashes(uint64_t start_height, const boost::uuids::uui
} }
} }
bool block_queue::get_next_span(uint64_t &height, std::list<cryptonote::block_complete_entry> &bcel, boost::uuids::uuid &connection_id, bool filled) const bool block_queue::get_next_span(uint64_t &height, std::vector<cryptonote::block_complete_entry> &bcel, boost::uuids::uuid &connection_id, bool filled) const
{ {
boost::unique_lock<boost::recursive_mutex> lock(mutex); boost::unique_lock<boost::recursive_mutex> lock(mutex);
if (blocks.empty()) if (blocks.empty())

@ -31,7 +31,7 @@
#pragma once #pragma once
#include <string> #include <string>
#include <list> #include <vector>
#include <set> #include <set>
#include <boost/thread/recursive_mutex.hpp> #include <boost/thread/recursive_mutex.hpp>
#include <boost/uuid/uuid.hpp> #include <boost/uuid/uuid.hpp>
@ -49,15 +49,15 @@ namespace cryptonote
struct span struct span
{ {
uint64_t start_block_height; uint64_t start_block_height;
std::list<crypto::hash> hashes; std::vector<crypto::hash> hashes;
std::list<cryptonote::block_complete_entry> blocks; std::vector<cryptonote::block_complete_entry> blocks;
boost::uuids::uuid connection_id; boost::uuids::uuid connection_id;
uint64_t nblocks; uint64_t nblocks;
float rate; float rate;
size_t size; size_t size;
boost::posix_time::ptime time; boost::posix_time::ptime time;
span(uint64_t start_block_height, std::list<cryptonote::block_complete_entry> blocks, const boost::uuids::uuid &connection_id, float rate, size_t size): span(uint64_t start_block_height, std::vector<cryptonote::block_complete_entry> blocks, const boost::uuids::uuid &connection_id, float rate, size_t size):
start_block_height(start_block_height), blocks(std::move(blocks)), connection_id(connection_id), nblocks(this->blocks.size()), rate(rate), size(size), time() {} start_block_height(start_block_height), blocks(std::move(blocks)), connection_id(connection_id), nblocks(this->blocks.size()), rate(rate), size(size), time() {}
span(uint64_t start_block_height, uint64_t nblocks, const boost::uuids::uuid &connection_id, boost::posix_time::ptime time): span(uint64_t start_block_height, uint64_t nblocks, const boost::uuids::uuid &connection_id, boost::posix_time::ptime time):
start_block_height(start_block_height), connection_id(connection_id), nblocks(nblocks), rate(0.0f), size(0), time(time) {} start_block_height(start_block_height), connection_id(connection_id), nblocks(nblocks), rate(0.0f), size(0), time(time) {}
@ -67,21 +67,21 @@ namespace cryptonote
typedef std::set<span> block_map; typedef std::set<span> block_map;
public: public:
void add_blocks(uint64_t height, std::list<cryptonote::block_complete_entry> bcel, const boost::uuids::uuid &connection_id, float rate, size_t size); void add_blocks(uint64_t height, std::vector<cryptonote::block_complete_entry> bcel, const boost::uuids::uuid &connection_id, float rate, size_t size);
void add_blocks(uint64_t height, uint64_t nblocks, const boost::uuids::uuid &connection_id, boost::posix_time::ptime time = boost::date_time::min_date_time); void add_blocks(uint64_t height, uint64_t nblocks, const boost::uuids::uuid &connection_id, boost::posix_time::ptime time = boost::date_time::min_date_time);
void flush_spans(const boost::uuids::uuid &connection_id, bool all = false); void flush_spans(const boost::uuids::uuid &connection_id, bool all = false);
void flush_stale_spans(const std::set<boost::uuids::uuid> &live_connections); void flush_stale_spans(const std::set<boost::uuids::uuid> &live_connections);
bool remove_span(uint64_t start_block_height, std::list<crypto::hash> *hashes = NULL); bool remove_span(uint64_t start_block_height, std::vector<crypto::hash> *hashes = NULL);
void remove_spans(const boost::uuids::uuid &connection_id, uint64_t start_block_height); void remove_spans(const boost::uuids::uuid &connection_id, uint64_t start_block_height);
uint64_t get_max_block_height() const; uint64_t get_max_block_height() const;
void print() const; void print() const;
std::string get_overview() const; std::string get_overview() const;
std::pair<uint64_t, uint64_t> reserve_span(uint64_t first_block_height, uint64_t last_block_height, uint64_t max_blocks, const boost::uuids::uuid &connection_id, const std::list<crypto::hash> &block_hashes, boost::posix_time::ptime time = boost::posix_time::microsec_clock::universal_time()); std::pair<uint64_t, uint64_t> reserve_span(uint64_t first_block_height, uint64_t last_block_height, uint64_t max_blocks, const boost::uuids::uuid &connection_id, const std::vector<crypto::hash> &block_hashes, boost::posix_time::ptime time = boost::posix_time::microsec_clock::universal_time());
bool is_blockchain_placeholder(const span &span) const; bool is_blockchain_placeholder(const span &span) const;
std::pair<uint64_t, uint64_t> get_start_gap_span() const; std::pair<uint64_t, uint64_t> get_start_gap_span() const;
std::pair<uint64_t, uint64_t> get_next_span_if_scheduled(std::list<crypto::hash> &hashes, boost::uuids::uuid &connection_id, boost::posix_time::ptime &time) const; std::pair<uint64_t, uint64_t> get_next_span_if_scheduled(std::vector<crypto::hash> &hashes, boost::uuids::uuid &connection_id, boost::posix_time::ptime &time) const;
void set_span_hashes(uint64_t start_height, const boost::uuids::uuid &connection_id, std::list<crypto::hash> hashes); void set_span_hashes(uint64_t start_height, const boost::uuids::uuid &connection_id, std::vector<crypto::hash> hashes);
bool get_next_span(uint64_t &height, std::list<cryptonote::block_complete_entry> &bcel, boost::uuids::uuid &connection_id, bool filled = true) const; bool get_next_span(uint64_t &height, std::vector<cryptonote::block_complete_entry> &bcel, boost::uuids::uuid &connection_id, bool filled = true) const;
bool has_next_span(const boost::uuids::uuid &connection_id, bool &filled) const; bool has_next_span(const boost::uuids::uuid &connection_id, bool &filled) const;
size_t get_data_size() const; size_t get_data_size() const;
size_t get_num_filled_spans_prefix() const; size_t get_num_filled_spans_prefix() const;

@ -109,7 +109,7 @@ namespace cryptonote
struct block_complete_entry struct block_complete_entry
{ {
blobdata block; blobdata block;
std::list<blobdata> txs; std::vector<blobdata> txs;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(block) KV_SERIALIZE(block)
KV_SERIALIZE(txs) KV_SERIALIZE(txs)
@ -145,7 +145,7 @@ namespace cryptonote
struct request struct request
{ {
std::list<blobdata> txs; std::vector<blobdata> txs;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(txs) KV_SERIALIZE(txs)
@ -161,8 +161,8 @@ namespace cryptonote
struct request struct request
{ {
std::list<crypto::hash> txs; std::vector<crypto::hash> txs;
std::list<crypto::hash> blocks; std::vector<crypto::hash> blocks;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE_CONTAINER_POD_AS_BLOB(txs) KV_SERIALIZE_CONTAINER_POD_AS_BLOB(txs)
@ -177,9 +177,9 @@ namespace cryptonote
struct request struct request
{ {
std::list<blobdata> txs; std::vector<blobdata> txs;
std::list<block_complete_entry> blocks; std::vector<block_complete_entry> blocks;
std::list<crypto::hash> missed_ids; std::vector<crypto::hash> missed_ids;
uint64_t current_blockchain_height; uint64_t current_blockchain_height;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
@ -230,7 +230,7 @@ namespace cryptonote
uint64_t start_height; uint64_t start_height;
uint64_t total_height; uint64_t total_height;
uint64_t cumulative_difficulty; uint64_t cumulative_difficulty;
std::list<crypto::hash> m_block_ids; std::vector<crypto::hash> m_block_ids;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(start_height) KV_SERIALIZE(start_height)

@ -351,7 +351,7 @@ namespace cryptonote
return 1; return 1;
} }
m_core.pause_mine(); m_core.pause_mine();
std::list<block_complete_entry> blocks; std::vector<block_complete_entry> blocks;
blocks.push_back(arg.b); blocks.push_back(arg.b);
m_core.prepare_handle_incoming_blocks(blocks); m_core.prepare_handle_incoming_blocks(blocks);
for(auto tx_blob_it = arg.b.txs.begin(); tx_blob_it!=arg.b.txs.end();tx_blob_it++) for(auto tx_blob_it = arg.b.txs.begin(); tx_blob_it!=arg.b.txs.end();tx_blob_it++)
@ -438,7 +438,7 @@ namespace cryptonote
} }
} }
std::list<blobdata> have_tx; std::vector<blobdata> have_tx;
// Instead of requesting missing transactions by hash like BTC, // Instead of requesting missing transactions by hash like BTC,
// we do it by index (thanks to a suggestion from moneromooo) because // we do it by index (thanks to a suggestion from moneromooo) because
@ -578,8 +578,8 @@ namespace cryptonote
else else
{ {
std::vector<crypto::hash> tx_ids; std::vector<crypto::hash> tx_ids;
std::list<transaction> txes; std::vector<transaction> txes;
std::list<crypto::hash> missing; std::vector<crypto::hash> missing;
tx_ids.push_back(tx_hash); tx_ids.push_back(tx_hash);
if (m_core.get_transactions(tx_ids, txes, missing) && missing.empty()) if (m_core.get_transactions(tx_ids, txes, missing) && missing.empty())
{ {
@ -626,7 +626,7 @@ namespace cryptonote
b.block = arg.b.block; b.block = arg.b.block;
b.txs = have_tx; b.txs = have_tx;
std::list<block_complete_entry> blocks; std::vector<block_complete_entry> blocks;
blocks.push_back(b); blocks.push_back(b);
m_core.prepare_handle_incoming_blocks(blocks); m_core.prepare_handle_incoming_blocks(blocks);
@ -687,8 +687,8 @@ namespace cryptonote
{ {
MLOG_P2P_MESSAGE("Received NOTIFY_REQUEST_FLUFFY_MISSING_TX (" << arg.missing_tx_indices.size() << " txes), block hash " << arg.block_hash); MLOG_P2P_MESSAGE("Received NOTIFY_REQUEST_FLUFFY_MISSING_TX (" << arg.missing_tx_indices.size() << " txes), block hash " << arg.block_hash);
std::list<std::pair<cryptonote::blobdata, block>> local_blocks; std::vector<std::pair<cryptonote::blobdata, block>> local_blocks;
std::list<cryptonote::blobdata> local_txs; std::vector<cryptonote::blobdata> local_txs;
block b; block b;
if (!m_core.get_block_by_hash(arg.block_hash, b)) if (!m_core.get_block_by_hash(arg.block_hash, b))
@ -725,8 +725,8 @@ namespace cryptonote
} }
} }
std::list<cryptonote::transaction> txs; std::vector<cryptonote::transaction> txs;
std::list<crypto::hash> missed; std::vector<crypto::hash> missed;
if (!m_core.get_transactions(txids, txs, missed)) if (!m_core.get_transactions(txids, txs, missed))
{ {
LOG_ERROR_CCONTEXT("Failed to handle request NOTIFY_REQUEST_FLUFFY_MISSING_TX, " LOG_ERROR_CCONTEXT("Failed to handle request NOTIFY_REQUEST_FLUFFY_MISSING_TX, "
@ -774,10 +774,12 @@ namespace cryptonote
return 1; return 1;
} }
for(auto tx_blob_it = arg.txs.begin(); tx_blob_it!=arg.txs.end();) std::vector<cryptonote::blobdata> newtxs;
newtxs.reserve(arg.txs.size());
for (size_t i = 0; i < arg.txs.size(); ++i)
{ {
cryptonote::tx_verification_context tvc = AUTO_VAL_INIT(tvc); cryptonote::tx_verification_context tvc = AUTO_VAL_INIT(tvc);
m_core.handle_incoming_tx(*tx_blob_it, tvc, false, true, false); m_core.handle_incoming_tx(arg.txs[i], tvc, false, true, false);
if(tvc.m_verifivation_failed) if(tvc.m_verifivation_failed)
{ {
LOG_PRINT_CCONTEXT_L1("Tx verification failed, dropping connection"); LOG_PRINT_CCONTEXT_L1("Tx verification failed, dropping connection");
@ -785,10 +787,9 @@ namespace cryptonote
return 1; return 1;
} }
if(tvc.m_should_be_relayed) if(tvc.m_should_be_relayed)
++tx_blob_it; newtxs.push_back(std::move(arg.txs[i]));
else
arg.txs.erase(tx_blob_it++);
} }
arg.txs = std::move(newtxs);
if(arg.txs.size()) if(arg.txs.size())
{ {
@ -996,7 +997,7 @@ skip:
{ {
const uint64_t previous_height = m_core.get_current_blockchain_height(); const uint64_t previous_height = m_core.get_current_blockchain_height();
uint64_t start_height; uint64_t start_height;
std::list<cryptonote::block_complete_entry> blocks; std::vector<cryptonote::block_complete_entry> blocks;
boost::uuids::uuid span_connection_id; boost::uuids::uuid span_connection_id;
if (!m_block_queue.get_next_span(start_height, blocks, span_connection_id)) if (!m_block_queue.get_next_span(start_height, blocks, span_connection_id))
{ {
@ -1070,7 +1071,7 @@ skip:
LOG_ERROR_CCONTEXT("Internal error: tvc.size() != block_entry.txs.size()"); LOG_ERROR_CCONTEXT("Internal error: tvc.size() != block_entry.txs.size()");
return 1; return 1;
} }
std::list<blobdata>::const_iterator it = block_entry.txs.begin(); std::vector<blobdata>::const_iterator it = block_entry.txs.begin();
for (size_t i = 0; i < tvc.size(); ++i, ++it) for (size_t i = 0; i < tvc.size(); ++i, ++it)
{ {
if(tvc[i].m_verifivation_failed) if(tvc[i].m_verifivation_failed)
@ -1248,7 +1249,7 @@ skip:
template<class t_core> template<class t_core>
bool t_cryptonote_protocol_handler<t_core>::should_download_next_span(cryptonote_connection_context& context) const bool t_cryptonote_protocol_handler<t_core>::should_download_next_span(cryptonote_connection_context& context) const
{ {
std::list<crypto::hash> hashes; std::vector<crypto::hash> hashes;
boost::uuids::uuid span_connection_id; boost::uuids::uuid span_connection_id;
boost::posix_time::ptime request_time; boost::posix_time::ptime request_time;
std::pair<uint64_t, uint64_t> span; std::pair<uint64_t, uint64_t> span;
@ -1267,7 +1268,7 @@ skip:
// we might be in a weird case where there is a filled next span, // we might be in a weird case where there is a filled next span,
// but it starts higher than the current height // but it starts higher than the current height
uint64_t height; uint64_t height;
std::list<cryptonote::block_complete_entry> bcel; std::vector<cryptonote::block_complete_entry> bcel;
if (!m_block_queue.get_next_span(height, bcel, span_connection_id, true)) if (!m_block_queue.get_next_span(height, bcel, span_connection_id, true))
return false; return false;
if (height > m_core.get_current_blockchain_height()) if (height > m_core.get_current_blockchain_height())
@ -1415,7 +1416,7 @@ skip:
{ {
if (span.second == 0) if (span.second == 0)
{ {
std::list<crypto::hash> hashes; std::vector<crypto::hash> hashes;
boost::uuids::uuid span_connection_id; boost::uuids::uuid span_connection_id;
boost::posix_time::ptime time; boost::posix_time::ptime time;
span = m_block_queue.get_next_span_if_scheduled(hashes, span_connection_id, time); span = m_block_queue.get_next_span_if_scheduled(hashes, span_connection_id, time);
@ -1441,14 +1442,18 @@ skip:
goto skip; goto skip;
} }
// take out blocks we already have // take out blocks we already have
while (!context.m_needed_objects.empty() && m_core.have_block(context.m_needed_objects.front())) size_t skip = 0;
while (skip < context.m_needed_objects.size() && m_core.have_block(context.m_needed_objects[skip]))
{ {
// if we're popping the last hash, record it so we can ask again from that hash, // if we're popping the last hash, record it so we can ask again from that hash,
// this prevents never being able to progress on peers we get old hash lists from // this prevents never being able to progress on peers we get old hash lists from
if (context.m_needed_objects.size() == 1) if (skip + 1 == context.m_needed_objects.size())
context.m_last_known_hash = context.m_needed_objects.front(); context.m_last_known_hash = context.m_needed_objects[skip];
context.m_needed_objects.pop_front(); ++skip;
} }
if (skip > 0)
context.m_needed_objects = std::vector<crypto::hash>(context.m_needed_objects.begin() + skip, context.m_needed_objects.end());
const uint64_t first_block_height = context.m_last_response_height - context.m_needed_objects.size() + 1; const uint64_t first_block_height = context.m_last_response_height - context.m_needed_objects.size() + 1;
span = m_block_queue.reserve_span(first_block_height, context.m_last_response_height, count_limit, context.m_connection_id, context.m_needed_objects); span = m_block_queue.reserve_span(first_block_height, context.m_last_response_height, count_limit, context.m_connection_id, context.m_needed_objects);
MDEBUG(context << " span from " << first_block_height << ": " << span.first << "/" << span.second); MDEBUG(context << " span from " << first_block_height << ": " << span.first << "/" << span.second);
@ -1456,7 +1461,7 @@ skip:
if (span.second == 0 && !force_next_span) if (span.second == 0 && !force_next_span)
{ {
MDEBUG(context << " still no span reserved, we may be in the corner case of next span scheduled and everything else scheduled/filled"); MDEBUG(context << " still no span reserved, we may be in the corner case of next span scheduled and everything else scheduled/filled");
std::list<crypto::hash> hashes; std::vector<crypto::hash> hashes;
boost::uuids::uuid span_connection_id; boost::uuids::uuid span_connection_id;
boost::posix_time::ptime time; boost::posix_time::ptime time;
span = m_block_queue.get_next_span_if_scheduled(hashes, span_connection_id, time); span = m_block_queue.get_next_span_if_scheduled(hashes, span_connection_id, time);
@ -1487,23 +1492,21 @@ skip:
MERROR("ERROR: skip " << skip << ", m_needed_objects " << context.m_needed_objects.size() << ", first_context_block_height" << first_context_block_height); MERROR("ERROR: skip " << skip << ", m_needed_objects " << context.m_needed_objects.size() << ", first_context_block_height" << first_context_block_height);
return false; return false;
} }
while (skip--) if (skip > 0)
context.m_needed_objects.pop_front(); context.m_needed_objects = std::vector<crypto::hash>(context.m_needed_objects.begin() + skip, context.m_needed_objects.end());
if (context.m_needed_objects.size() < span.second) if (context.m_needed_objects.size() < span.second)
{ {
MERROR("ERROR: span " << span.first << "/" << span.second << ", m_needed_objects " << context.m_needed_objects.size()); MERROR("ERROR: span " << span.first << "/" << span.second << ", m_needed_objects " << context.m_needed_objects.size());
return false; return false;
} }
auto it = context.m_needed_objects.begin();
for (size_t n = 0; n < span.second; ++n) for (size_t n = 0; n < span.second; ++n)
{ {
req.blocks.push_back(*it); req.blocks.push_back(context.m_needed_objects[n]);
++count; ++count;
context.m_requested_objects.insert(*it); context.m_requested_objects.insert(context.m_needed_objects[n]);
auto j = it++;
context.m_needed_objects.erase(j);
} }
context.m_needed_objects = std::vector<crypto::hash>(context.m_needed_objects.begin() + span.second, context.m_needed_objects.end());
} }
context.m_last_request_time = boost::posix_time::microsec_clock::universal_time(); context.m_last_request_time = boost::posix_time::microsec_clock::universal_time();
@ -1664,7 +1667,7 @@ skip:
{ {
NOTIFY_NEW_FLUFFY_BLOCK::request fluffy_arg = AUTO_VAL_INIT(fluffy_arg); NOTIFY_NEW_FLUFFY_BLOCK::request fluffy_arg = AUTO_VAL_INIT(fluffy_arg);
fluffy_arg.current_blockchain_height = arg.current_blockchain_height; fluffy_arg.current_blockchain_height = arg.current_blockchain_height;
std::list<blobdata> fluffy_txs; std::vector<blobdata> fluffy_txs;
fluffy_arg.b = arg.b; fluffy_arg.b = arg.b;
fluffy_arg.b.txs = fluffy_txs; fluffy_arg.b.txs = fluffy_txs;

@ -226,7 +226,7 @@ namespace cryptonote
if (use_bootstrap_daemon_if_necessary<COMMAND_RPC_GET_BLOCKS_FAST>(invoke_http_mode::BIN, "/getblocks.bin", req, res, r)) if (use_bootstrap_daemon_if_necessary<COMMAND_RPC_GET_BLOCKS_FAST>(invoke_http_mode::BIN, "/getblocks.bin", req, res, r))
return r; return r;
std::list<std::pair<cryptonote::blobdata, std::list<cryptonote::blobdata> > > bs; std::vector<std::pair<cryptonote::blobdata, std::vector<cryptonote::blobdata> > > bs;
if(!m_core.find_blockchain_supplement(req.start_height, req.block_ids, bs, res.current_height, res.start_height, req.prune, COMMAND_RPC_GET_BLOCKS_FAST_MAX_COUNT)) if(!m_core.find_blockchain_supplement(req.start_height, req.block_ids, bs, res.current_height, res.start_height, req.prune, COMMAND_RPC_GET_BLOCKS_FAST_MAX_COUNT))
{ {
@ -235,6 +235,8 @@ namespace cryptonote
} }
size_t pruned_size = 0, unpruned_size = 0, ntxes = 0; size_t pruned_size = 0, unpruned_size = 0, ntxes = 0;
res.blocks.reserve(bs.size());
res.output_indices.reserve(bs.size());
for(auto& bd: bs) for(auto& bd: bs)
{ {
res.blocks.resize(res.blocks.size()+1); res.blocks.resize(res.blocks.size()+1);
@ -266,7 +268,9 @@ namespace cryptonote
} }
size_t txidx = 0; size_t txidx = 0;
ntxes += bd.second.size(); ntxes += bd.second.size();
for (std::list<cryptonote::blobdata>::iterator i = bd.second.begin(); i != bd.second.end(); ++i) res.blocks.back().txs.reserve(bd.second.size());
res.output_indices.back().indices.reserve(bd.second.size());
for (std::vector<cryptonote::blobdata>::iterator i = bd.second.begin(); i != bd.second.end(); ++i)
{ {
unpruned_size += i->size(); unpruned_size += i->size();
res.blocks.back().txs.push_back(std::move(*i)); res.blocks.back().txs.push_back(std::move(*i));
@ -295,7 +299,7 @@ namespace cryptonote
if (use_bootstrap_daemon_if_necessary<COMMAND_RPC_GET_ALT_BLOCKS_HASHES>(invoke_http_mode::JON, "/get_alt_blocks_hashes", req, res, r)) if (use_bootstrap_daemon_if_necessary<COMMAND_RPC_GET_ALT_BLOCKS_HASHES>(invoke_http_mode::JON, "/get_alt_blocks_hashes", req, res, r))
return r; return r;
std::list<block> blks; std::vector<block> blks;
if(!m_core.get_alternative_blocks(blks)) if(!m_core.get_alternative_blocks(blks))
{ {
@ -337,8 +341,8 @@ namespace cryptonote
res.status = "Error retrieving block at height " + std::to_string(height); res.status = "Error retrieving block at height " + std::to_string(height);
return true; return true;
} }
std::list<transaction> txs; std::vector<transaction> txs;
std::list<crypto::hash> missed_txs; std::vector<crypto::hash> missed_txs;
m_core.get_transactions(blk.tx_hashes, txs, missed_txs); m_core.get_transactions(blk.tx_hashes, txs, missed_txs);
res.blocks.resize(res.blocks.size() + 1); res.blocks.resize(res.blocks.size() + 1);
res.blocks.back().block = block_to_blob(blk); res.blocks.back().block = block_to_blob(blk);
@ -553,8 +557,8 @@ namespace cryptonote
} }
vh.push_back(*reinterpret_cast<const crypto::hash*>(b.data())); vh.push_back(*reinterpret_cast<const crypto::hash*>(b.data()));
} }
std::list<crypto::hash> missed_txs; std::vector<crypto::hash> missed_txs;
std::list<transaction> txs; std::vector<transaction> txs;
bool r = m_core.get_transactions(vh, txs, missed_txs); bool r = m_core.get_transactions(vh, txs, missed_txs);
if(!r) if(!r)
{ {
@ -575,25 +579,26 @@ namespace cryptonote
if(r) if(r)
{ {
// sort to match original request // sort to match original request
std::list<transaction> sorted_txs; std::vector<transaction> sorted_txs;
std::vector<tx_info>::const_iterator i; std::vector<tx_info>::const_iterator i;
unsigned txs_processed = 0;
for (const crypto::hash &h: vh) for (const crypto::hash &h: vh)
{ {
if (std::find(missed_txs.begin(), missed_txs.end(), h) == missed_txs.end()) if (std::find(missed_txs.begin(), missed_txs.end(), h) == missed_txs.end())
{ {
if (txs.empty()) if (txs.size() == txs_processed)
{ {
res.status = "Failed: internal error - txs is empty"; res.status = "Failed: internal error - txs is empty";
return true; return true;
} }
// core returns the ones it finds in the right order // core returns the ones it finds in the right order
if (get_transaction_hash(txs.front()) != h) if (get_transaction_hash(txs[txs_processed]) != h)
{ {
res.status = "Failed: tx hash mismatch"; res.status = "Failed: tx hash mismatch";
return true; return true;
} }
sorted_txs.push_back(std::move(txs.front())); sorted_txs.push_back(std::move(txs[txs_processed]));
txs.pop_front(); ++txs_processed;
} }
else if ((i = std::find_if(pool_tx_info.begin(), pool_tx_info.end(), [h](const tx_info &txi) { return epee::string_tools::pod_to_hex(h) == txi.id_hash; })) != pool_tx_info.end()) else if ((i = std::find_if(pool_tx_info.begin(), pool_tx_info.end(), [h](const tx_info &txi) { return epee::string_tools::pod_to_hex(h) == txi.id_hash; })) != pool_tx_info.end())
{ {
@ -604,7 +609,7 @@ namespace cryptonote
return true; return true;
} }
sorted_txs.push_back(tx); sorted_txs.push_back(tx);
missed_txs.remove(h); missed_txs.erase(std::find(missed_txs.begin(), missed_txs.end(), h));
pool_tx_hashes.insert(h); pool_tx_hashes.insert(h);
const std::string hash_string = epee::string_tools::pod_to_hex(h); const std::string hash_string = epee::string_tools::pod_to_hex(h);
for (const auto &ti: pool_tx_info) for (const auto &ti: pool_tx_info)
@ -623,7 +628,7 @@ namespace cryptonote
LOG_PRINT_L2("Found " << found_in_pool << "/" << vh.size() << " transactions in the pool"); LOG_PRINT_L2("Found " << found_in_pool << "/" << vh.size() << " transactions in the pool");
} }
std::list<std::string>::const_iterator txhi = req.txs_hashes.begin(); std::vector<std::string>::const_iterator txhi = req.txs_hashes.begin();
std::vector<crypto::hash>::const_iterator vhi = vh.begin(); std::vector<crypto::hash>::const_iterator vhi = vh.begin();
for(auto& tx: txs) for(auto& tx: txs)
{ {
@ -1664,10 +1669,10 @@ namespace cryptonote
PERF_TIMER(on_flush_txpool); PERF_TIMER(on_flush_txpool);
bool failed = false; bool failed = false;
std::list<crypto::hash> txids; std::vector<crypto::hash> txids;
if (req.txids.empty()) if (req.txids.empty())
{ {
std::list<transaction> pool_txs; std::vector<transaction> pool_txs;
bool r = m_core.get_pool_transactions(pool_txs); bool r = m_core.get_pool_transactions(pool_txs);
if (!r) if (!r)
{ {

@ -112,7 +112,7 @@ namespace cryptonote
struct response struct response
{ {
std::list<block_complete_entry> blocks; std::vector<block_complete_entry> blocks;
uint64_t start_height; uint64_t start_height;
uint64_t current_height; uint64_t current_height;
std::string status; std::string status;
@ -190,7 +190,7 @@ namespace cryptonote
struct response struct response
{ {
std::list<crypto::hash> m_block_ids; std::vector<crypto::hash> m_block_ids;
uint64_t start_height; uint64_t start_height;
uint64_t current_height; uint64_t current_height;
std::string status; std::string status;
@ -275,7 +275,7 @@ namespace cryptonote
uint64_t total_received; uint64_t total_received;
uint64_t total_received_unlocked = 0; // OpenMonero only uint64_t total_received_unlocked = 0; // OpenMonero only
uint64_t scanned_height; uint64_t scanned_height;
std::list<transaction> transactions; std::vector<transaction> transactions;
uint64_t blockchain_height; uint64_t blockchain_height;
uint64_t scanned_block_height; uint64_t scanned_block_height;
std::string status; std::string status;
@ -563,7 +563,7 @@ namespace cryptonote
{ {
struct request struct request
{ {
std::list<std::string> txs_hashes; std::vector<std::string> txs_hashes;
bool decode_as_json; bool decode_as_json;
bool prune; bool prune;
@ -600,11 +600,11 @@ namespace cryptonote
struct response struct response
{ {
// older compatibility stuff // older compatibility stuff
std::list<std::string> txs_as_hex; //transactions blobs as hex (old compat) std::vector<std::string> txs_as_hex; //transactions blobs as hex (old compat)
std::list<std::string> txs_as_json; //transactions decoded as json (old compat) std::vector<std::string> txs_as_json; //transactions decoded as json (old compat)
// in both old and new // in both old and new
std::list<std::string> missed_tx; //not found transactions std::vector<std::string> missed_tx; //not found transactions
// new style // new style
std::vector<entry> txs; std::vector<entry> txs;
@ -1933,7 +1933,7 @@ namespace cryptonote
{ {
struct request struct request
{ {
std::list<std::string> txids; std::vector<std::string> txids;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(txids) KV_SERIALIZE(txids)
@ -2150,7 +2150,7 @@ namespace cryptonote
{ {
struct request struct request
{ {
std::list<std::string> txids; std::vector<std::string> txids;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(txids) KV_SERIALIZE(txids)

@ -50,7 +50,7 @@ namespace rpc
void DaemonHandler::handle(const GetBlocksFast::Request& req, GetBlocksFast::Response& res) void DaemonHandler::handle(const GetBlocksFast::Request& req, GetBlocksFast::Response& res)
{ {
std::list<std::pair<blobdata, std::list<blobdata> > > blocks; std::vector<std::pair<blobdata, std::vector<blobdata> > > blocks;
if(!m_core.find_blockchain_supplement(req.start_height, req.block_ids, blocks, res.current_height, res.start_height, req.prune, COMMAND_RPC_GET_BLOCKS_FAST_MAX_COUNT)) if(!m_core.find_blockchain_supplement(req.start_height, req.block_ids, blocks, res.current_height, res.start_height, req.prune, COMMAND_RPC_GET_BLOCKS_FAST_MAX_COUNT))
{ {
@ -62,9 +62,6 @@ namespace rpc
res.blocks.resize(blocks.size()); res.blocks.resize(blocks.size());
res.output_indices.resize(blocks.size()); res.output_indices.resize(blocks.size());
//TODO: really need to switch uses of std::list to std::vector unless
// it's a huge performance concern
auto it = blocks.begin(); auto it = blocks.begin();
uint64_t block_count = 0; uint64_t block_count = 0;
@ -89,7 +86,7 @@ namespace rpc
res.error_details = "incorrect number of transactions retrieved for block"; res.error_details = "incorrect number of transactions retrieved for block";
return; return;
} }
std::list<transaction> txs; std::vector<transaction> txs;
for (const auto& blob : it->second) for (const auto& blob : it->second)
{ {
txs.resize(txs.size() + 1); txs.resize(txs.size() + 1);
@ -163,10 +160,10 @@ namespace rpc
void DaemonHandler::handle(const GetTransactions::Request& req, GetTransactions::Response& res) void DaemonHandler::handle(const GetTransactions::Request& req, GetTransactions::Response& res)
{ {
std::list<cryptonote::transaction> found_txs; std::vector<cryptonote::transaction> found_txs_vec;
std::list<crypto::hash> missed_hashes; std::vector<crypto::hash> missed_vec;
bool r = m_core.get_transactions(req.tx_hashes, found_txs, missed_hashes); bool r = m_core.get_transactions(req.tx_hashes, found_txs_vec, missed_vec);
// TODO: consider fixing core::get_transactions to not hide exceptions // TODO: consider fixing core::get_transactions to not hide exceptions
if (!r) if (!r)
@ -176,20 +173,7 @@ namespace rpc
return; return;
} }
size_t num_found = found_txs.size(); size_t num_found = found_txs_vec.size();
// std::list is annoying
std::vector<cryptonote::transaction> found_txs_vec
{
std::make_move_iterator(std::begin(found_txs)),
std::make_move_iterator(std::end(found_txs))
};
std::vector<crypto::hash> missed_vec
{
std::make_move_iterator(std::begin(missed_hashes)),
std::make_move_iterator(std::end(missed_hashes))
};
std::vector<uint64_t> heights(num_found); std::vector<uint64_t> heights(num_found);
std::vector<bool> in_pool(num_found, false); std::vector<bool> in_pool(num_found, false);
@ -204,7 +188,7 @@ namespace rpc
// if any missing from blockchain, check in tx pool // if any missing from blockchain, check in tx pool
if (!missed_vec.empty()) if (!missed_vec.empty())
{ {
std::list<cryptonote::transaction> pool_txs; std::vector<cryptonote::transaction> pool_txs;
m_core.get_pool_transactions(pool_txs); m_core.get_pool_transactions(pool_txs);

@ -106,7 +106,7 @@ BEGIN_RPC_MESSAGE_CLASS(GetHashesFast);
RPC_MESSAGE_MEMBER(uint64_t, start_height); RPC_MESSAGE_MEMBER(uint64_t, start_height);
END_RPC_MESSAGE_REQUEST; END_RPC_MESSAGE_REQUEST;
BEGIN_RPC_MESSAGE_RESPONSE; BEGIN_RPC_MESSAGE_RESPONSE;
RPC_MESSAGE_MEMBER(std::list<crypto::hash>, hashes); RPC_MESSAGE_MEMBER(std::vector<crypto::hash>, hashes);
RPC_MESSAGE_MEMBER(uint64_t, start_height); RPC_MESSAGE_MEMBER(uint64_t, start_height);
RPC_MESSAGE_MEMBER(uint64_t, current_height); RPC_MESSAGE_MEMBER(uint64_t, current_height);
END_RPC_MESSAGE_RESPONSE; END_RPC_MESSAGE_RESPONSE;

@ -1649,7 +1649,7 @@ void wallet2::parse_block_round(const cryptonote::blobdata &blob, cryptonote::bl
bl_id = get_block_hash(bl); bl_id = get_block_hash(bl);
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
void wallet2::pull_blocks(uint64_t start_height, uint64_t &blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::list<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices) void wallet2::pull_blocks(uint64_t start_height, uint64_t &blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices)
{ {
cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::request req = AUTO_VAL_INIT(req); cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::request req = AUTO_VAL_INIT(req);
cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::response res = AUTO_VAL_INIT(res); cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::response res = AUTO_VAL_INIT(res);
@ -1700,7 +1700,7 @@ void wallet2::pull_blocks(uint64_t start_height, uint64_t &blocks_start_height,
o_indices = std::move(res.output_indices); o_indices = std::move(res.output_indices);
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
void wallet2::pull_hashes(uint64_t start_height, uint64_t &blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::list<crypto::hash> &hashes) void wallet2::pull_hashes(uint64_t start_height, uint64_t &blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::vector<crypto::hash> &hashes)
{ {
cryptonote::COMMAND_RPC_GET_HASHES_FAST::request req = AUTO_VAL_INIT(req); cryptonote::COMMAND_RPC_GET_HASHES_FAST::request req = AUTO_VAL_INIT(req);
cryptonote::COMMAND_RPC_GET_HASHES_FAST::response res = AUTO_VAL_INIT(res); cryptonote::COMMAND_RPC_GET_HASHES_FAST::response res = AUTO_VAL_INIT(res);
@ -1718,7 +1718,7 @@ void wallet2::pull_hashes(uint64_t start_height, uint64_t &blocks_start_height,
hashes = std::move(res.m_block_ids); hashes = std::move(res.m_block_ids);
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
void wallet2::process_blocks(uint64_t start_height, const std::list<cryptonote::block_complete_entry> &blocks, const std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices, uint64_t& blocks_added) void wallet2::process_blocks(uint64_t start_height, const std::vector<cryptonote::block_complete_entry> &blocks, const std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices, uint64_t& blocks_added)
{ {
size_t current_index = start_height; size_t current_index = start_height;
blocks_added = 0; blocks_added = 0;
@ -1735,13 +1735,13 @@ void wallet2::process_blocks(uint64_t start_height, const std::list<cryptonote::
std::vector<cryptonote::block> round_blocks(threads); std::vector<cryptonote::block> round_blocks(threads);
std::deque<bool> error(threads); std::deque<bool> error(threads);
size_t blocks_size = blocks.size(); size_t blocks_size = blocks.size();
std::list<block_complete_entry>::const_iterator blocki = blocks.begin(); std::vector<block_complete_entry>::const_iterator blocki = blocks.begin();
for (size_t b = 0; b < blocks_size; b += threads) for (size_t b = 0; b < blocks_size; b += threads)
{ {
size_t round_size = std::min((size_t)threads, blocks_size - b); size_t round_size = std::min((size_t)threads, blocks_size - b);
tools::threadpool::waiter waiter; tools::threadpool::waiter waiter;
std::list<block_complete_entry>::const_iterator tmpblocki = blocki; std::vector<block_complete_entry>::const_iterator tmpblocki = blocki;
for (size_t i = 0; i < round_size; ++i) for (size_t i = 0; i < round_size; ++i)
{ {
tpool.submit(&waiter, boost::bind(&wallet2::parse_block_round, this, std::cref(tmpblocki->block), tpool.submit(&waiter, boost::bind(&wallet2::parse_block_round, this, std::cref(tmpblocki->block),
@ -1833,7 +1833,7 @@ void wallet2::refresh(uint64_t start_height, uint64_t & blocks_fetched)
refresh(start_height, blocks_fetched, received_money); refresh(start_height, blocks_fetched, received_money);
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
void wallet2::pull_next_blocks(uint64_t start_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, const std::list<cryptonote::block_complete_entry> &prev_blocks, std::list<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices, bool &error) void wallet2::pull_next_blocks(uint64_t start_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, const std::vector<cryptonote::block_complete_entry> &prev_blocks, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices, bool &error)
{ {
error = false; error = false;
@ -1843,7 +1843,7 @@ void wallet2::pull_next_blocks(uint64_t start_height, uint64_t &blocks_start_hei
// prepend the last 3 blocks, should be enough to guard against a block or two's reorg // prepend the last 3 blocks, should be enough to guard against a block or two's reorg
cryptonote::block bl; cryptonote::block bl;
std::list<cryptonote::block_complete_entry>::const_reverse_iterator i = prev_blocks.rbegin(); std::vector<cryptonote::block_complete_entry>::const_reverse_iterator i = prev_blocks.rbegin();
for (size_t n = 0; n < std::min((size_t)3, prev_blocks.size()); ++n) for (size_t n = 0; n < std::min((size_t)3, prev_blocks.size()); ++n)
{ {
bool ok = cryptonote::parse_and_validate_block_from_blob(i->block, bl); bool ok = cryptonote::parse_and_validate_block_from_blob(i->block, bl);
@ -2110,7 +2110,7 @@ void wallet2::update_pool_state(bool refreshed)
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
void wallet2::fast_refresh(uint64_t stop_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history) void wallet2::fast_refresh(uint64_t stop_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history)
{ {
std::list<crypto::hash> hashes; std::vector<crypto::hash> hashes;
const uint64_t checkpoint_height = m_checkpoints.get_max_height(); const uint64_t checkpoint_height = m_checkpoints.get_max_height();
if (stop_height > checkpoint_height && m_blockchain.size()-1 < checkpoint_height) if (stop_height > checkpoint_height && m_blockchain.size()-1 < checkpoint_height)
@ -2138,7 +2138,7 @@ void wallet2::fast_refresh(uint64_t stop_height, uint64_t &blocks_start_height,
} }
if (hashes.size() + current_index < stop_height) { if (hashes.size() + current_index < stop_height) {
drop_from_short_history(short_chain_history, 3); drop_from_short_history(short_chain_history, 3);
std::list<crypto::hash>::iterator right = hashes.end(); std::vector<crypto::hash>::iterator right = hashes.end();
// prepend 3 more // prepend 3 more
for (int i = 0; i<3; i++) { for (int i = 0; i<3; i++) {
right--; right--;
@ -2243,7 +2243,7 @@ void wallet2::refresh(uint64_t start_height, uint64_t & blocks_fetched, bool& re
tools::threadpool& tpool = tools::threadpool::getInstance(); tools::threadpool& tpool = tools::threadpool::getInstance();
tools::threadpool::waiter waiter; tools::threadpool::waiter waiter;
uint64_t blocks_start_height; uint64_t blocks_start_height;
std::list<cryptonote::block_complete_entry> blocks; std::vector<cryptonote::block_complete_entry> blocks;
std::vector<COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> o_indices; std::vector<COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> o_indices;
bool refreshed = false; bool refreshed = false;
@ -2276,7 +2276,7 @@ void wallet2::refresh(uint64_t start_height, uint64_t & blocks_fetched, bool& re
{ {
// pull the next set of blocks while we're processing the current one // pull the next set of blocks while we're processing the current one
uint64_t next_blocks_start_height; uint64_t next_blocks_start_height;
std::list<cryptonote::block_complete_entry> next_blocks; std::vector<cryptonote::block_complete_entry> next_blocks;
std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> next_o_indices; std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> next_o_indices;
bool error = false; bool error = false;
if (blocks.empty()) if (blocks.empty())

@ -1123,11 +1123,11 @@ namespace tools
void get_short_chain_history(std::list<crypto::hash>& ids) const; void get_short_chain_history(std::list<crypto::hash>& ids) const;
bool is_tx_spendtime_unlocked(uint64_t unlock_time, uint64_t block_height) const; bool is_tx_spendtime_unlocked(uint64_t unlock_time, uint64_t block_height) const;
bool clear(); bool clear();
void pull_blocks(uint64_t start_height, uint64_t& blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::list<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices); void pull_blocks(uint64_t start_height, uint64_t& blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices);
void pull_hashes(uint64_t start_height, uint64_t& blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::list<crypto::hash> &hashes); void pull_hashes(uint64_t start_height, uint64_t& blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::vector<crypto::hash> &hashes);
void fast_refresh(uint64_t stop_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history); void fast_refresh(uint64_t stop_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history);
void pull_next_blocks(uint64_t start_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, const std::list<cryptonote::block_complete_entry> &prev_blocks, std::list<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices, bool &error); void pull_next_blocks(uint64_t start_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, const std::vector<cryptonote::block_complete_entry> &prev_blocks, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices, bool &error);
void process_blocks(uint64_t start_height, const std::list<cryptonote::block_complete_entry> &blocks, const std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices, uint64_t& blocks_added); void process_blocks(uint64_t start_height, const std::vector<cryptonote::block_complete_entry> &blocks, const std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices, uint64_t& blocks_added);
uint64_t select_transfers(uint64_t needed_money, std::vector<size_t> unused_transfers_indices, std::vector<size_t>& selected_transfers, bool trusted_daemon) const; uint64_t select_transfers(uint64_t needed_money, std::vector<size_t> unused_transfers_indices, std::vector<size_t>& selected_transfers, bool trusted_daemon) const;
bool prepare_file_names(const std::string& file_path); bool prepare_file_names(const std::string& file_path);
void process_unconfirmed(const crypto::hash &txid, const cryptonote::transaction& tx, uint64_t height); void process_unconfirmed(const crypto::hash &txid, const cryptonote::transaction& tx, uint64_t height);

@ -184,7 +184,7 @@ bool tests::proxy_core::handle_incoming_tx(const cryptonote::blobdata& tx_blob,
return true; return true;
} }
bool tests::proxy_core::handle_incoming_txs(const std::list<blobdata>& tx_blobs, std::vector<tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay) bool tests::proxy_core::handle_incoming_txs(const std::vector<blobdata>& tx_blobs, std::vector<tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
{ {
tvc.resize(tx_blobs.size()); tvc.resize(tx_blobs.size());
size_t i = 0; size_t i = 0;

@ -76,7 +76,7 @@ namespace tests
bool have_block(const crypto::hash& id); bool have_block(const crypto::hash& id);
void get_blockchain_top(uint64_t& height, crypto::hash& top_id); void get_blockchain_top(uint64_t& height, crypto::hash& top_id);
bool handle_incoming_tx(const cryptonote::blobdata& tx_blob, cryptonote::tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay); bool handle_incoming_tx(const cryptonote::blobdata& tx_blob, cryptonote::tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
bool handle_incoming_txs(const std::list<cryptonote::blobdata>& tx_blobs, std::vector<cryptonote::tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay); bool handle_incoming_txs(const std::vector<cryptonote::blobdata>& tx_blobs, std::vector<cryptonote::tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
bool handle_incoming_block(const cryptonote::blobdata& block_blob, cryptonote::block_verification_context& bvc, bool update_miner_blocktemplate = true); bool handle_incoming_block(const cryptonote::blobdata& block_blob, cryptonote::block_verification_context& bvc, bool update_miner_blocktemplate = true);
void pause_mine(){} void pause_mine(){}
void resume_mine(){} void resume_mine(){}
@ -86,7 +86,7 @@ namespace tests
cryptonote::Blockchain &get_blockchain_storage() { throw std::runtime_error("Called invalid member function: please never call get_blockchain_storage on the TESTING class proxy_core."); } cryptonote::Blockchain &get_blockchain_storage() { throw std::runtime_error("Called invalid member function: please never call get_blockchain_storage on the TESTING class proxy_core."); }
bool get_test_drop_download() {return true;} bool get_test_drop_download() {return true;}
bool get_test_drop_download_height() {return true;} bool get_test_drop_download_height() {return true;}
bool prepare_handle_incoming_blocks(const std::list<cryptonote::block_complete_entry> &blocks) { return true; } bool prepare_handle_incoming_blocks(const std::vector<cryptonote::block_complete_entry> &blocks) { return true; }
bool cleanup_handle_incoming_blocks(bool force_sync = false) { return true; } bool cleanup_handle_incoming_blocks(bool force_sync = false) { return true; }
uint64_t get_target_blockchain_height() const { return 1; } uint64_t get_target_blockchain_height() const { return 1; }
size_t get_block_sync_size(uint64_t height) const { return BLOCKS_SYNCHRONIZING_DEFAULT_COUNT; } size_t get_block_sync_size(uint64_t height) const { return BLOCKS_SYNCHRONIZING_DEFAULT_COUNT; }
@ -94,8 +94,8 @@ namespace tests
cryptonote::network_type get_nettype() const { return cryptonote::MAINNET; } cryptonote::network_type get_nettype() const { return cryptonote::MAINNET; }
bool get_pool_transaction(const crypto::hash& id, cryptonote::blobdata& tx_blob) const { return false; } bool get_pool_transaction(const crypto::hash& id, cryptonote::blobdata& tx_blob) const { return false; }
bool pool_has_tx(const crypto::hash &txid) const { return false; } bool pool_has_tx(const crypto::hash &txid) const { return false; }
bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata, cryptonote::block>>& blocks, std::list<cryptonote::blobdata>& txs) const { return false; } bool get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata, cryptonote::block>>& blocks, std::vector<cryptonote::blobdata>& txs) const { return false; }
bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::list<cryptonote::transaction>& txs, std::list<crypto::hash>& missed_txs) const { return false; } bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::vector<cryptonote::transaction>& txs, std::vector<crypto::hash>& missed_txs) const { return false; }
bool get_block_by_hash(const crypto::hash &h, cryptonote::block &blk, bool *orphan = NULL) const { return false; } bool get_block_by_hash(const crypto::hash &h, cryptonote::block &blk, bool *orphan = NULL) const { return false; }
uint8_t get_ideal_hard_fork_version() const { return 0; } uint8_t get_ideal_hard_fork_version() const { return 0; }
uint8_t get_ideal_hard_fork_version(uint64_t height) const { return 0; } uint8_t get_ideal_hard_fork_version(uint64_t height) const { return 0; }
@ -103,6 +103,6 @@ namespace tests
uint64_t get_earliest_ideal_height_for_version(uint8_t version) const { return 0; } uint64_t get_earliest_ideal_height_for_version(uint8_t version) const { return 0; }
cryptonote::difficulty_type get_block_cumulative_difficulty(uint64_t height) const { return 0; } cryptonote::difficulty_type get_block_cumulative_difficulty(uint64_t height) const { return 0; }
bool fluffy_blocks_enabled() const { return false; } bool fluffy_blocks_enabled() const { return false; }
uint64_t prevalidate_block_hashes(uint64_t height, const std::list<crypto::hash> &hashes) { return 0; } uint64_t prevalidate_block_hashes(uint64_t height, const std::vector<crypto::hash> &hashes) { return 0; }
}; };
} }

@ -128,7 +128,7 @@ bool gen_chain_switch_1::check_split_not_switched(cryptonote::core& c, size_t ev
m_recipient_account_3 = boost::get<account_base>(events[3]); m_recipient_account_3 = boost::get<account_base>(events[3]);
m_recipient_account_4 = boost::get<account_base>(events[4]); m_recipient_account_4 = boost::get<account_base>(events[4]);
std::list<block> blocks; std::vector<block> blocks;
bool r = c.get_blocks(0, 10000, blocks); bool r = c.get_blocks(0, 10000, blocks);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);
CHECK_EQ(5 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks.size()); CHECK_EQ(5 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks.size());
@ -145,7 +145,7 @@ bool gen_chain_switch_1::check_split_not_switched(cryptonote::core& c, size_t ev
CHECK_EQ(MK_COINS(14), get_balance(m_recipient_account_3, chain, mtx)); CHECK_EQ(MK_COINS(14), get_balance(m_recipient_account_3, chain, mtx));
CHECK_EQ(MK_COINS(3), get_balance(m_recipient_account_4, chain, mtx)); CHECK_EQ(MK_COINS(3), get_balance(m_recipient_account_4, chain, mtx));
std::list<transaction> tx_pool; std::vector<transaction> tx_pool;
r = c.get_pool_transactions(tx_pool); r = c.get_pool_transactions(tx_pool);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);
CHECK_EQ(1, tx_pool.size()); CHECK_EQ(1, tx_pool.size());
@ -166,7 +166,7 @@ bool gen_chain_switch_1::check_split_switched(cryptonote::core& c, size_t ev_ind
{ {
DEFINE_TESTS_ERROR_CONTEXT("gen_chain_switch_1::check_split_switched"); DEFINE_TESTS_ERROR_CONTEXT("gen_chain_switch_1::check_split_switched");
std::list<block> blocks; std::vector<block> blocks;
bool r = c.get_blocks(0, 10000, blocks); bool r = c.get_blocks(0, 10000, blocks);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);
CHECK_EQ(6 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks.size()); CHECK_EQ(6 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks.size());
@ -175,7 +175,7 @@ bool gen_chain_switch_1::check_split_switched(cryptonote::core& c, size_t ev_ind
CHECK_TEST_CONDITION(std::equal(blocks.begin(), it, m_chain_1.begin())); CHECK_TEST_CONDITION(std::equal(blocks.begin(), it, m_chain_1.begin()));
CHECK_TEST_CONDITION(blocks.back() == boost::get<block>(events[24 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW])); // blk_7 CHECK_TEST_CONDITION(blocks.back() == boost::get<block>(events[24 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW])); // blk_7
std::list<block> alt_blocks; std::vector<block> alt_blocks;
r = c.get_alternative_blocks(alt_blocks); r = c.get_alternative_blocks(alt_blocks);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);
CHECK_EQ(2, c.get_alternative_blocks_count()); CHECK_EQ(2, c.get_alternative_blocks_count());
@ -195,7 +195,7 @@ bool gen_chain_switch_1::check_split_switched(cryptonote::core& c, size_t ev_ind
CHECK_EQ(MK_COINS(14), get_balance(m_recipient_account_3, chain, mtx)); CHECK_EQ(MK_COINS(14), get_balance(m_recipient_account_3, chain, mtx));
CHECK_EQ(MK_COINS(16), get_balance(m_recipient_account_4, chain, mtx)); CHECK_EQ(MK_COINS(16), get_balance(m_recipient_account_4, chain, mtx));
std::list<transaction> tx_pool; std::vector<transaction> tx_pool;
r = c.get_pool_transactions(tx_pool); r = c.get_pool_transactions(tx_pool);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);
CHECK_EQ(1, tx_pool.size()); CHECK_EQ(1, tx_pool.size());

@ -45,12 +45,12 @@ public:
bool check_split_switched(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events); bool check_split_switched(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
private: private:
std::list<cryptonote::block> m_chain_1; std::vector<cryptonote::block> m_chain_1;
cryptonote::account_base m_recipient_account_1; cryptonote::account_base m_recipient_account_1;
cryptonote::account_base m_recipient_account_2; cryptonote::account_base m_recipient_account_2;
cryptonote::account_base m_recipient_account_3; cryptonote::account_base m_recipient_account_3;
cryptonote::account_base m_recipient_account_4; cryptonote::account_base m_recipient_account_4;
std::list<cryptonote::transaction> m_tx_pool; std::vector<cryptonote::transaction> m_tx_pool;
}; };

@ -481,7 +481,7 @@ inline bool do_replay_events(std::vector<test_event_entry>& events)
MERROR("Failed to flush txpool"); MERROR("Failed to flush txpool");
return false; return false;
} }
c.get_blockchain_storage().flush_txes_from_pool(std::list<crypto::hash>(pool_txs.begin(), pool_txs.end())); c.get_blockchain_storage().flush_txes_from_pool(pool_txs);
t_test_class validator; t_test_class validator;
bool ret = replay_events_through_core<t_test_class>(c, events, validator); bool ret = replay_events_through_core<t_test_class>(c, events, validator);

@ -78,7 +78,7 @@ bool one_block::verify_1(cryptonote::core& c, size_t ev_index, const std::vector
//CHECK_TEST_CONDITION(get_block_reward(0) == get_balance(alice, events, chain, mtx)); //CHECK_TEST_CONDITION(get_block_reward(0) == get_balance(alice, events, chain, mtx));
// check height // check height
std::list<cryptonote::block> blocks; std::vector<cryptonote::block> blocks;
std::list<crypto::public_key> outs; std::list<crypto::public_key> outs;
bool r = c.get_blocks(0, 100, blocks); bool r = c.get_blocks(0, 100, blocks);
//c.get_outs(100, outs); //c.get_outs(100, outs);

@ -73,7 +73,7 @@ bool gen_double_spend_in_different_chains::check_double_spend(cryptonote::core&
{ {
DEFINE_TESTS_ERROR_CONTEXT("gen_double_spend_in_different_chains::check_double_spend"); DEFINE_TESTS_ERROR_CONTEXT("gen_double_spend_in_different_chains::check_double_spend");
std::list<block> block_list; std::vector<block> block_list;
bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, block_list); bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, block_list);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);

@ -64,7 +64,7 @@ bool gen_double_spend_base<concrete_test>::check_block_verification_context(cons
template<class concrete_test> template<class concrete_test>
bool gen_double_spend_base<concrete_test>::mark_last_valid_block(cryptonote::core& c, size_t /*ev_index*/, const std::vector<test_event_entry>& /*events*/) bool gen_double_spend_base<concrete_test>::mark_last_valid_block(cryptonote::core& c, size_t /*ev_index*/, const std::vector<test_event_entry>& /*events*/)
{ {
std::list<cryptonote::block> block_list; std::vector<cryptonote::block> block_list;
bool r = c.get_blocks(c.get_current_blockchain_height() - 1, 1, block_list); bool r = c.get_blocks(c.get_current_blockchain_height() - 1, 1, block_list);
CHECK_AND_ASSERT_MES(r, false, "core::get_blocks failed"); CHECK_AND_ASSERT_MES(r, false, "core::get_blocks failed");
m_last_valid_block = block_list.back(); m_last_valid_block = block_list.back();
@ -96,7 +96,7 @@ bool gen_double_spend_base<concrete_test>::check_double_spend(cryptonote::core&
} }
CHECK_NOT_EQ(invalid_index_value, m_invalid_block_index); CHECK_NOT_EQ(invalid_index_value, m_invalid_block_index);
std::list<cryptonote::block> block_list; std::vector<cryptonote::block> block_list;
bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, block_list); bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, block_list);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);
CHECK_TEST_CONDITION(m_last_valid_block == block_list.back()); CHECK_TEST_CONDITION(m_last_valid_block == block_list.back());

@ -101,7 +101,7 @@ bool gen_ring_signature_1::check_balances_1(cryptonote::core& c, size_t ev_index
m_bob_account = boost::get<account_base>(events[3]); m_bob_account = boost::get<account_base>(events[3]);
m_alice_account = boost::get<account_base>(events[4]); m_alice_account = boost::get<account_base>(events[4]);
std::list<block> blocks; std::vector<block> blocks;
bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks); bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);
@ -119,7 +119,7 @@ bool gen_ring_signature_1::check_balances_2(cryptonote::core& c, size_t ev_index
{ {
DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_1::check_balances_2"); DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_1::check_balances_2");
std::list<block> blocks; std::vector<block> blocks;
bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks); bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);
@ -182,7 +182,7 @@ bool gen_ring_signature_2::check_balances_1(cryptonote::core& c, size_t ev_index
m_bob_account = boost::get<account_base>(events[1]); m_bob_account = boost::get<account_base>(events[1]);
m_alice_account = boost::get<account_base>(events[2]); m_alice_account = boost::get<account_base>(events[2]);
std::list<block> blocks; std::vector<block> blocks;
bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks); bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);
@ -200,7 +200,7 @@ bool gen_ring_signature_2::check_balances_2(cryptonote::core& c, size_t ev_index
{ {
DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_2::check_balances_2"); DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_2::check_balances_2");
std::list<block> blocks; std::vector<block> blocks;
bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks); bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);
@ -292,7 +292,7 @@ bool gen_ring_signature_big::check_balances_1(cryptonote::core& c, size_t ev_ind
m_bob_account = boost::get<account_base>(events[1]); m_bob_account = boost::get<account_base>(events[1]);
m_alice_account = boost::get<account_base>(events[1 + m_test_size]); m_alice_account = boost::get<account_base>(events[1 + m_test_size]);
std::list<block> blocks; std::vector<block> blocks;
bool r = c.get_blocks(0, 2 * m_test_size + CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks); bool r = c.get_blocks(0, 2 * m_test_size + CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);
@ -317,7 +317,7 @@ bool gen_ring_signature_big::check_balances_2(cryptonote::core& c, size_t ev_ind
{ {
DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_big::check_balances_2"); DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_big::check_balances_2");
std::list<block> blocks; std::vector<block> blocks;
bool r = c.get_blocks(0, 2 * m_test_size + CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks); bool r = c.get_blocks(0, 2 * m_test_size + CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW, blocks);
CHECK_TEST_CONDITION(r); CHECK_TEST_CONDITION(r);

@ -55,7 +55,7 @@ public:
bool have_block(const crypto::hash& id) const {return true;} bool have_block(const crypto::hash& id) const {return true;}
void get_blockchain_top(uint64_t& height, crypto::hash& top_id)const{height=0;top_id=crypto::null_hash;} void get_blockchain_top(uint64_t& height, crypto::hash& top_id)const{height=0;top_id=crypto::null_hash;}
bool handle_incoming_tx(const cryptonote::blobdata& tx_blob, cryptonote::tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay) { return true; } bool handle_incoming_tx(const cryptonote::blobdata& tx_blob, cryptonote::tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay) { return true; }
bool handle_incoming_txs(const std::list<cryptonote::blobdata>& tx_blob, std::vector<cryptonote::tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay) { return true; } bool handle_incoming_txs(const std::vector<cryptonote::blobdata>& tx_blob, std::vector<cryptonote::tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay) { return true; }
bool handle_incoming_block(const cryptonote::blobdata& block_blob, cryptonote::block_verification_context& bvc, bool update_miner_blocktemplate = true) { return true; } bool handle_incoming_block(const cryptonote::blobdata& block_blob, cryptonote::block_verification_context& bvc, bool update_miner_blocktemplate = true) { return true; }
void pause_mine(){} void pause_mine(){}
void resume_mine(){} void resume_mine(){}
@ -65,7 +65,7 @@ public:
cryptonote::blockchain_storage &get_blockchain_storage() { throw std::runtime_error("Called invalid member function: please never call get_blockchain_storage on the TESTING class test_core."); } cryptonote::blockchain_storage &get_blockchain_storage() { throw std::runtime_error("Called invalid member function: please never call get_blockchain_storage on the TESTING class test_core."); }
bool get_test_drop_download() const {return true;} bool get_test_drop_download() const {return true;}
bool get_test_drop_download_height() const {return true;} bool get_test_drop_download_height() const {return true;}
bool prepare_handle_incoming_blocks(const std::list<cryptonote::block_complete_entry> &blocks) { return true; } bool prepare_handle_incoming_blocks(const std::vector<cryptonote::block_complete_entry> &blocks) { return true; }
bool cleanup_handle_incoming_blocks(bool force_sync = false) { return true; } bool cleanup_handle_incoming_blocks(bool force_sync = false) { return true; }
uint64_t get_target_blockchain_height() const { return 1; } uint64_t get_target_blockchain_height() const { return 1; }
size_t get_block_sync_size(uint64_t height) const { return BLOCKS_SYNCHRONIZING_DEFAULT_COUNT; } size_t get_block_sync_size(uint64_t height) const { return BLOCKS_SYNCHRONIZING_DEFAULT_COUNT; }
@ -73,8 +73,8 @@ public:
cryptonote::network_type get_nettype() const { return cryptonote::MAINNET; } cryptonote::network_type get_nettype() const { return cryptonote::MAINNET; }
bool get_pool_transaction(const crypto::hash& id, cryptonote::blobdata& tx_blob) const { return false; } bool get_pool_transaction(const crypto::hash& id, cryptonote::blobdata& tx_blob) const { return false; }
bool pool_has_tx(const crypto::hash &txid) const { return false; } bool pool_has_tx(const crypto::hash &txid) const { return false; }
bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata, cryptonote::block>>& blocks, std::list<cryptonote::blobdata>& txs) const { return false; } bool get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata, cryptonote::block>>& blocks, std::vector<cryptonote::blobdata>& txs) const { return false; }
bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::list<cryptonote::transaction>& txs, std::list<crypto::hash>& missed_txs) const { return false; } bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::vector<cryptonote::transaction>& txs, std::vector<crypto::hash>& missed_txs) const { return false; }
bool get_block_by_hash(const crypto::hash &h, cryptonote::block &blk, bool *orphan = NULL) const { return false; } bool get_block_by_hash(const crypto::hash &h, cryptonote::block &blk, bool *orphan = NULL) const { return false; }
uint8_t get_ideal_hard_fork_version() const { return 0; } uint8_t get_ideal_hard_fork_version() const { return 0; }
uint8_t get_ideal_hard_fork_version(uint64_t height) const { return 0; } uint8_t get_ideal_hard_fork_version(uint64_t height) const { return 0; }
@ -82,7 +82,7 @@ public:
uint64_t get_earliest_ideal_height_for_version(uint8_t version) const { return 0; } uint64_t get_earliest_ideal_height_for_version(uint8_t version) const { return 0; }
cryptonote::difficulty_type get_block_cumulative_difficulty(uint64_t height) const { return 0; } cryptonote::difficulty_type get_block_cumulative_difficulty(uint64_t height) const { return 0; }
bool fluffy_blocks_enabled() const { return false; } bool fluffy_blocks_enabled() const { return false; }
uint64_t prevalidate_block_hashes(uint64_t height, const std::list<crypto::hash> &hashes) { return 0; } uint64_t prevalidate_block_hashes(uint64_t height, const std::vector<crypto::hash> &hashes) { return 0; }
void stop() {} void stop() {}
}; };

Loading…
Cancel
Save