mirror of
https://github.com/monero-project/monero.git
synced 2025-08-13 22:05:36 -04:00
blockchain_db: speedup tx output gathering
We know all the data we'll want for getblocks.bin is contiguous
This commit is contained in:
parent
6bc0c7e685
commit
008647d7eb
9 changed files with 75 additions and 48 deletions
|
@ -2297,6 +2297,22 @@ bool Blockchain::check_for_double_spend(const transaction& tx, key_images_contai
|
|||
return true;
|
||||
}
|
||||
//------------------------------------------------------------------
|
||||
bool Blockchain::get_tx_outputs_gindexs(const crypto::hash& tx_id, size_t n_txes, std::vector<std::vector<uint64_t>>& indexs) const
|
||||
{
|
||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||
CRITICAL_REGION_LOCAL(m_blockchain_lock);
|
||||
uint64_t tx_index;
|
||||
if (!m_db->tx_exists(tx_id, tx_index))
|
||||
{
|
||||
MERROR_VER("get_tx_outputs_gindexs failed to find transaction with id = " << tx_id);
|
||||
return false;
|
||||
}
|
||||
indexs = m_db->get_tx_amount_output_indices(tx_index, n_txes);
|
||||
CHECK_AND_ASSERT_MES(n_txes == indexs.size(), false, "Wrong indexs size");
|
||||
|
||||
return true;
|
||||
}
|
||||
//------------------------------------------------------------------
|
||||
bool Blockchain::get_tx_outputs_gindexs(const crypto::hash& tx_id, std::vector<uint64_t>& indexs) const
|
||||
{
|
||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||
|
@ -2307,16 +2323,9 @@ bool Blockchain::get_tx_outputs_gindexs(const crypto::hash& tx_id, std::vector<u
|
|||
MERROR_VER("get_tx_outputs_gindexs failed to find transaction with id = " << tx_id);
|
||||
return false;
|
||||
}
|
||||
|
||||
// get amount output indexes, currently referred to in parts as "output global indices", but they are actually specific to amounts
|
||||
indexs = m_db->get_tx_amount_output_indices(tx_index);
|
||||
if (indexs.empty())
|
||||
{
|
||||
// empty indexs is only valid if the vout is empty, which is legal but rare
|
||||
cryptonote::transaction tx = m_db->get_tx(tx_id);
|
||||
CHECK_AND_ASSERT_MES(tx.vout.empty(), false, "internal error: global indexes for transaction " << tx_id << " is empty, and tx vout is not");
|
||||
}
|
||||
|
||||
std::vector<std::vector<uint64_t>> indices = m_db->get_tx_amount_output_indices(tx_index, 1);
|
||||
CHECK_AND_ASSERT_MES(indices.size() == 1, false, "Wrong indices size");
|
||||
indexs = indices.front();
|
||||
return true;
|
||||
}
|
||||
//------------------------------------------------------------------
|
||||
|
|
|
@ -516,10 +516,12 @@ namespace cryptonote
|
|||
*
|
||||
* @param tx_id the hash of the transaction to fetch indices for
|
||||
* @param indexs return-by-reference the global indices for the transaction's outputs
|
||||
* @param n_txes how many txes in a row to get results for
|
||||
*
|
||||
* @return false if the transaction does not exist, or if no indices are found, otherwise true
|
||||
*/
|
||||
bool get_tx_outputs_gindexs(const crypto::hash& tx_id, std::vector<uint64_t>& indexs) const;
|
||||
bool get_tx_outputs_gindexs(const crypto::hash& tx_id, size_t n_txes, std::vector<std::vector<uint64_t>>& indexs) const;
|
||||
|
||||
/**
|
||||
* @brief stores the blockchain
|
||||
|
|
|
@ -1220,6 +1220,11 @@ namespace cryptonote
|
|||
return m_blockchain_storage.get_tx_outputs_gindexs(tx_id, indexs);
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
bool core::get_tx_outputs_gindexs(const crypto::hash& tx_id, size_t n_txes, std::vector<std::vector<uint64_t>>& indexs) const
|
||||
{
|
||||
return m_blockchain_storage.get_tx_outputs_gindexs(tx_id, n_txes, indexs);
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
void core::pause_mine()
|
||||
{
|
||||
m_miner.pause();
|
||||
|
|
|
@ -534,6 +534,7 @@ namespace cryptonote
|
|||
* @note see Blockchain::get_tx_outputs_gindexs
|
||||
*/
|
||||
bool get_tx_outputs_gindexs(const crypto::hash& tx_id, std::vector<uint64_t>& indexs) const;
|
||||
bool get_tx_outputs_gindexs(const crypto::hash& tx_id, size_t n_txes, std::vector<std::vector<uint64_t>>& indexs) const;
|
||||
|
||||
/**
|
||||
* @copydoc Blockchain::get_tail_id
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue