|
|
|
@ -3171,7 +3171,7 @@ bool BlockchainLMDB::get_pruned_tx_blobs_from(const crypto::hash& h, size_t coun
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool BlockchainLMDB::get_blocks_from(uint64_t start_height, size_t min_count, size_t max_count, size_t max_size, std::vector<std::pair<std::pair<cryptonote::blobdata, crypto::hash>, std::vector<std::pair<crypto::hash, cryptonote::blobdata>>>>& blocks, bool pruned, bool skip_coinbase, bool get_miner_tx_hash) const
|
|
|
|
|
bool BlockchainLMDB::get_blocks_from(uint64_t start_height, size_t min_block_count, size_t max_block_count, size_t max_tx_count, size_t max_size, std::vector<std::pair<std::pair<cryptonote::blobdata, crypto::hash>, std::vector<std::pair<crypto::hash, cryptonote::blobdata>>>>& blocks, bool pruned, bool skip_coinbase, bool get_miner_tx_hash) const
|
|
|
|
|
{
|
|
|
|
|
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
|
|
|
|
check_open();
|
|
|
|
@ -3185,14 +3185,15 @@ bool BlockchainLMDB::get_blocks_from(uint64_t start_height, size_t min_count, si
|
|
|
|
|
RCURSOR(txs_prunable);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
blocks.reserve(std::min<size_t>(max_count, 10000)); // guard against very large max count if only checking bytes
|
|
|
|
|
blocks.reserve(std::min<size_t>(max_block_count, 10000)); // guard against very large max count if only checking bytes
|
|
|
|
|
const uint64_t blockchain_height = height();
|
|
|
|
|
uint64_t size = 0;
|
|
|
|
|
size_t num_txes = 0;
|
|
|
|
|
MDB_val_copy<uint64_t> key(start_height);
|
|
|
|
|
MDB_val k, v, val_tx_id;
|
|
|
|
|
uint64_t tx_id = ~0;
|
|
|
|
|
MDB_cursor_op op = MDB_SET;
|
|
|
|
|
for (uint64_t h = start_height; h < blockchain_height && blocks.size() < max_count && (size < max_size || blocks.size() < min_count); ++h)
|
|
|
|
|
for (uint64_t h = start_height; h < blockchain_height && blocks.size() < max_block_count && (size < max_size || blocks.size() < min_block_count); ++h)
|
|
|
|
|
{
|
|
|
|
|
MDB_cursor_op op = h == start_height ? MDB_SET : MDB_NEXT;
|
|
|
|
|
int result = mdb_cursor_get(m_cur_blocks, &key, &v, op);
|
|
|
|
@ -3243,6 +3244,7 @@ bool BlockchainLMDB::get_blocks_from(uint64_t start_height, size_t min_count, si
|
|
|
|
|
op = MDB_NEXT;
|
|
|
|
|
|
|
|
|
|
current_block.second.reserve(b.tx_hashes.size());
|
|
|
|
|
num_txes += b.tx_hashes.size() + (skip_coinbase ? 0 : 1);
|
|
|
|
|
for (const auto &tx_hash: b.tx_hashes)
|
|
|
|
|
{
|
|
|
|
|
// get pruned data
|
|
|
|
@ -3262,6 +3264,9 @@ bool BlockchainLMDB::get_blocks_from(uint64_t start_height, size_t min_count, si
|
|
|
|
|
current_block.second.push_back(std::make_pair(tx_hash, std::move(tx_blob)));
|
|
|
|
|
size += current_block.second.back().second.size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (blocks.size() >= min_block_count && num_txes >= max_tx_count)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TXN_POSTFIX_RDONLY();
|
|
|
|
|