mirror of
https://github.com/monero-project/monero.git
synced 2026-07-28 22:51:07 -07:00
blockchain: improve incoming block scan table handling
This commit is contained in:
@@ -5093,7 +5093,7 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete
|
|||||||
its = m_scan_table.find(tx_prefix_hash);
|
its = m_scan_table.find(tx_prefix_hash);
|
||||||
assert(its != m_scan_table.end());
|
assert(its != m_scan_table.end());
|
||||||
|
|
||||||
// get all amounts from tx.vin(s)
|
// initialize amount buckets for tx.vin(s)
|
||||||
for (const auto &txin : tx.vin)
|
for (const auto &txin : tx.vin)
|
||||||
{
|
{
|
||||||
const txin_to_key &in_to_key = boost::get < txin_to_key > (txin);
|
const txin_to_key &in_to_key = boost::get < txin_to_key > (txin);
|
||||||
@@ -5103,22 +5103,8 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete
|
|||||||
if (it != its->second.end())
|
if (it != its->second.end())
|
||||||
SCAN_TABLE_QUIT("Duplicate key_image found from incoming blocks.");
|
SCAN_TABLE_QUIT("Duplicate key_image found from incoming blocks.");
|
||||||
|
|
||||||
amounts.push_back(in_to_key.amount);
|
offset_map.emplace(in_to_key.amount, std::vector<uint64_t>());
|
||||||
}
|
tx_map.emplace(in_to_key.amount, std::vector<output_data_t>());
|
||||||
|
|
||||||
// sort and remove duplicate amounts from amounts list
|
|
||||||
std::sort(amounts.begin(), amounts.end());
|
|
||||||
auto last = std::unique(amounts.begin(), amounts.end());
|
|
||||||
amounts.erase(last, amounts.end());
|
|
||||||
|
|
||||||
// add amount to the offset_map and tx_map
|
|
||||||
for (const uint64_t &amount : amounts)
|
|
||||||
{
|
|
||||||
if (offset_map.find(amount) == offset_map.end())
|
|
||||||
offset_map.emplace(amount, std::vector<uint64_t>());
|
|
||||||
|
|
||||||
if (tx_map.find(amount) == tx_map.end())
|
|
||||||
tx_map.emplace(amount, std::vector<output_data_t>());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// add new absolute_offsets to offset_map
|
// add new absolute_offsets to offset_map
|
||||||
@@ -5134,6 +5120,10 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
amounts.reserve(offset_map.size());
|
||||||
|
for (const auto &offsets : offset_map)
|
||||||
|
amounts.push_back(offsets.first);
|
||||||
|
|
||||||
// sort and remove duplicate absolute_offsets in offset_map
|
// sort and remove duplicate absolute_offsets in offset_map
|
||||||
for (auto &offsets : offset_map)
|
for (auto &offsets : offset_map)
|
||||||
{
|
{
|
||||||
@@ -5192,25 +5182,24 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete
|
|||||||
const txin_to_key &in_to_key = boost::get < txin_to_key > (txin);
|
const txin_to_key &in_to_key = boost::get < txin_to_key > (txin);
|
||||||
auto needed_offsets = relative_output_offsets_to_absolute(in_to_key.key_offsets);
|
auto needed_offsets = relative_output_offsets_to_absolute(in_to_key.key_offsets);
|
||||||
|
|
||||||
|
const auto offset_it = offset_map.find(in_to_key.amount);
|
||||||
|
const auto tx_it = tx_map.find(in_to_key.amount);
|
||||||
|
if (offset_it == offset_map.end() || tx_it == tx_map.end())
|
||||||
|
SCAN_TABLE_QUIT("Amount not found on scan table from incoming blocks.");
|
||||||
|
|
||||||
|
const std::vector<uint64_t> &offsets_found = offset_it->second;
|
||||||
|
const std::vector<output_data_t> &outputs_found = tx_it->second;
|
||||||
|
|
||||||
std::vector<output_data_t> outputs;
|
std::vector<output_data_t> outputs;
|
||||||
for (const uint64_t & offset_needed : needed_offsets)
|
for (const uint64_t & offset_needed : needed_offsets)
|
||||||
{
|
{
|
||||||
size_t pos = 0;
|
// offsets_found is sorted above before output_scan_worker populates outputs_found.
|
||||||
bool found = false;
|
const auto found_it = std::lower_bound(offsets_found.begin(), offsets_found.end(), offset_needed);
|
||||||
|
const size_t pos = found_it - offsets_found.begin();
|
||||||
|
const bool found = found_it != offsets_found.end() && *found_it == offset_needed;
|
||||||
|
|
||||||
for (const uint64_t &offset_found : offset_map[in_to_key.amount])
|
if (found && pos < outputs_found.size())
|
||||||
{
|
outputs.push_back(outputs_found[pos]);
|
||||||
if (offset_needed == offset_found)
|
|
||||||
{
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
++pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found && pos < tx_map[in_to_key.amount].size())
|
|
||||||
outputs.push_back(tx_map[in_to_key.amount].at(pos));
|
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user