cryptonote_core: revert extra_tx_map

While the lookups are faster, the zeroCommit calls have to be
done again when storing the new outputs in the db, which ends
up making the whole thing slower after all, and the ways this
can be cached aren't very nice code wise, so let's forget it
since the gains aren't very large anyway.
This commit is contained in:
moneromooo-monero 2018-12-24 15:35:42 +00:00
parent ed54ac8fdf
commit 6f2081f867
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
2 changed files with 5 additions and 59 deletions

View file

@ -3841,33 +3841,11 @@ bool Blockchain::cleanup_handle_incoming_blocks(bool force_sync)
}
//------------------------------------------------------------------
void Blockchain::output_scan_worker(const uint64_t amount, const std::vector<uint64_t> &offsets, std::vector<output_data_t> &outputs, const std::vector<output_data_t> &extra_tx_map) const
void Blockchain::output_scan_worker(const uint64_t amount, const std::vector<uint64_t> &offsets, std::vector<output_data_t> &outputs) const
{
try
{
m_db->get_output_key(epee::span<const uint64_t>(&amount, 1), offsets, outputs, true);
if (outputs.size() < offsets.size())
{
const uint64_t n_outputs = m_db->get_num_outputs(amount);
for (size_t i = outputs.size(); i < offsets.size(); ++i)
{
uint64_t idx = offsets[i];
if (idx < n_outputs)
{
MWARNING("Index " << idx << " not found in db for amount " << amount << ", but it is less than the number of entries");
break;
}
else if (idx < n_outputs + extra_tx_map.size())
{
outputs.push_back(extra_tx_map[idx - n_outputs]);
}
else
{
MWARNING("missed " << amount << "/" << idx << " in " << extra_tx_map.size() << " (chain " << n_outputs << ")");
break;
}
}
}
}
catch (const std::exception& e)
{
@ -3982,34 +3960,6 @@ uint64_t Blockchain::prevalidate_block_hashes(uint64_t height, const std::vector
// 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
// keys.
static bool update_output_map(std::map<uint64_t, std::vector<output_data_t>> &extra_tx_map, const transaction &tx, uint64_t height, bool miner)
{
MTRACE("Blockchain::" << __func__);
for (size_t i = 0; i < tx.vout.size(); ++i)
{
const auto &out = tx.vout[i];
if (out.target.type() != typeid(txout_to_key))
continue;
const txout_to_key &out_to_key = boost::get<txout_to_key>(out.target);
rct::key commitment;
uint64_t amount = out.amount;
if (miner && tx.version == 2)
{
commitment = rct::zeroCommit(amount);
amount = 0;
}
else if (tx.version > 1)
{
CHECK_AND_ASSERT_MES(i < tx.rct_signatures.outPk.size(), false, "Invalid outPk size");
commitment = tx.rct_signatures.outPk[i].mask;
}
else
commitment = rct::zero();
extra_tx_map[amount].push_back(output_data_t{out_to_key.key, tx.unlock_time, height, commitment});
}
return true;
}
bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete_entry> &blocks_entry)
{
MTRACE("Blockchain::" << __func__);
@ -4178,7 +4128,7 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete
// [input] stores all absolute_offsets for each amount
std::map<uint64_t, std::vector<uint64_t>> offset_map;
// [output] stores all output_data_t for each absolute_offset
std::map<uint64_t, std::vector<output_data_t>> tx_map, extra_tx_map;
std::map<uint64_t, std::vector<output_data_t>> tx_map;
std::vector<std::pair<cryptonote::transaction, crypto::hash>> txes(total_txs);
#define SCAN_TABLE_QUIT(m) \
@ -4195,8 +4145,6 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete
if (m_cancel)
return false;
if (!update_output_map(extra_tx_map, blocks[block_index].miner_tx, height + block_index, true))
SCAN_TABLE_QUIT("Error building extra tx map.");
for (const auto &tx_blob : entry.txs)
{
if (tx_index >= txes.size())
@ -4255,8 +4203,6 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete
offset_map[in_to_key.amount].push_back(offset);
}
if (!update_output_map(extra_tx_map, tx, height + block_index, false))
SCAN_TABLE_QUIT("Error building extra tx map.");
}
++block_index;
}
@ -4281,7 +4227,7 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete
for (size_t i = 0; i < amounts.size(); i++)
{
uint64_t amount = amounts[i];
tpool.submit(&waiter, boost::bind(&Blockchain::output_scan_worker, this, amount, std::cref(offset_map[amount]), std::ref(tx_map[amount]), std::cref(extra_tx_map[amount])), true);
tpool.submit(&waiter, boost::bind(&Blockchain::output_scan_worker, this, amount, std::cref(offset_map[amount]), std::ref(tx_map[amount])), true);
}
waiter.wait(&tpool);
}
@ -4290,7 +4236,7 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete
for (size_t i = 0; i < amounts.size(); i++)
{
uint64_t amount = amounts[i];
output_scan_worker(amount, offset_map[amount], tx_map[amount], extra_tx_map[amount]);
output_scan_worker(amount, offset_map[amount], tx_map[amount]);
}
}

View file

@ -918,7 +918,7 @@ namespace cryptonote
* @param outputs return-by-reference the outputs collected
*/
void output_scan_worker(const uint64_t amount,const std::vector<uint64_t> &offsets,
std::vector<output_data_t> &outputs, const std::vector<output_data_t> &extra_tx_map) const;
std::vector<output_data_t> &outputs) const;
/**
* @brief computes the "short" and "long" hashes for a set of blocks