diff options
| author | SChernykh <15806605+SChernykh@users.noreply.github.com> | 2026-06-29 08:06:31 +0200 |
|---|---|---|
| committer | SChernykh <15806605+SChernykh@users.noreply.github.com> | 2026-06-29 08:10:36 +0200 |
| commit | fc6e4af01c5fde4d232d16e61ae4b26d51f82987 (patch) | |
| tree | 202a3fc2362a8715251855ae0be349c793b400ce /src | |
| parent | b69123a17912f556dfd0cc34b2fa111f4983551b (diff) | |
| download | monzero-core-fc6e4af01c5fde4d232d16e61ae4b26d51f82987.tar.gz monzero-core-fc6e4af01c5fde4d232d16e61ae4b26d51f82987.tar.xz monzero-core-fc6e4af01c5fde4d232d16e61ae4b26d51f82987.zip | |
Optimized handle_notify_new_transactions's duplicate tx check
- Check sha256 digests instead of full blobs (much less memory used)
- Replace `find->insert` sequence with a single `insert` - 2x fewer hashset accesses
- Preallocate the required size for the hashset (no full-table rehashes)
Diffstat (limited to 'src')
| -rw-r--r-- | src/cryptonote_protocol/cryptonote_protocol_handler.inl | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/cryptonote_protocol/cryptonote_protocol_handler.inl b/src/cryptonote_protocol/cryptonote_protocol_handler.inl index 6c36a3b5b..6bbb13601 100644 --- a/src/cryptonote_protocol/cryptonote_protocol_handler.inl +++ b/src/cryptonote_protocol/cryptonote_protocol_handler.inl @@ -878,17 +878,23 @@ namespace cryptonote int t_cryptonote_protocol_handler<t_core>::handle_notify_new_transactions(int command, NOTIFY_NEW_TRANSACTIONS::request& arg, cryptonote_connection_context& context) { MLOG_P2P_MESSAGE("Received NOTIFY_NEW_TRANSACTIONS (" << arg.txs.size() << " txes)"); - std::unordered_set<blobdata> seen; + std::unordered_set<crypto::hash> seen; + seen.reserve(arg.txs.size()); + for (const auto &blob: arg.txs) { MLOGIF_P2P_MESSAGE(cryptonote::transaction tx; crypto::hash hash; bool ret = cryptonote::parse_and_validate_tx_from_blob(blob, tx, hash);, ret, "Including transaction " << hash); - if (seen.find(blob) != seen.end()) + + crypto::hash digest{}; + if (!blob.empty()) + tools::sha256sum(reinterpret_cast<const uint8_t*>(blob.data()), blob.size(), digest); + + if (!seen.insert(digest).second) { LOG_PRINT_CCONTEXT_L1("Duplicate transaction in notification, dropping connection"); drop_connection(context, false, false); return 1; } - seen.insert(blob); } if(context.m_state != cryptonote_connection_context::state_normal) |
