From c7302bc4a3e4def5aef3d3c33e41c3eca250012d Mon Sep 17 00:00:00 2001 From: EmelyanenkoK Date: Mon, 19 Feb 2024 19:01:50 +0300 Subject: [PATCH] Fix checking ext message broadcasts (#912) Co-authored-by: SpyCheese --- validator/full-node-shard.cpp | 13 +++++++++++-- validator/full-node-shard.hpp | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/validator/full-node-shard.cpp b/validator/full-node-shard.cpp index 53c086e3..8e42716b 100644 --- a/validator/full-node-shard.cpp +++ b/validator/full-node-shard.cpp @@ -109,7 +109,8 @@ void FullNodeShardImpl::check_broadcast(PublicKeyHash src, td::BufferSlice broad } auto q = B.move_as_ok(); - if (!processed_ext_msg_broadcasts_.insert(td::sha256_bits256(q->message_->data_)).second) { + auto hash = td::sha256_bits256(q->message_->data_); + if (!processed_ext_msg_broadcasts_.insert(hash).second) { return promise.set_error(td::Status::Error("duplicate external message broadcast")); } if (config_.ext_messages_broadcast_disabled_) { @@ -120,6 +121,11 @@ void FullNodeShardImpl::check_broadcast(PublicKeyHash src, td::BufferSlice broad } }; } + if (my_ext_msg_broadcasts_.count(hash)) { + // Don't re-check messages that were sent by us + promise.set_result(td::Unit()); + return; + } td::actor::send_closure(validator_manager_, &ValidatorManagerInterface::check_external_message, std::move(q->message_->data_), promise.wrap([](td::Ref) { return td::Unit(); })); @@ -706,9 +712,11 @@ void FullNodeShardImpl::send_external_message(td::BufferSlice data) { }); return; } - if (!processed_ext_msg_broadcasts_.insert(td::sha256_bits256(data)).second) { + td::Bits256 hash = td::sha256_bits256(data); + if (processed_ext_msg_broadcasts_.count(hash)) { return; } + my_ext_msg_broadcasts_.insert(hash); auto B = create_serialize_tl_object( create_tl_object(std::move(data))); if (B.size() <= overlay::Overlays::max_simple_broadcast_size()) { @@ -860,6 +868,7 @@ void FullNodeShardImpl::alarm() { } if (cleanup_processed_ext_msg_at_ && cleanup_processed_ext_msg_at_.is_in_past()) { processed_ext_msg_broadcasts_.clear(); + my_ext_msg_broadcasts_.clear(); cleanup_processed_ext_msg_at_ = td::Timestamp::in(60.0); } alarm_timestamp().relax(sync_completed_at_); diff --git a/validator/full-node-shard.hpp b/validator/full-node-shard.hpp index faf49598..0525474e 100644 --- a/validator/full-node-shard.hpp +++ b/validator/full-node-shard.hpp @@ -252,6 +252,7 @@ class FullNodeShardImpl : public FullNodeShard { FullNodeConfig config_; + std::set my_ext_msg_broadcasts_; std::set processed_ext_msg_broadcasts_; td::Timestamp cleanup_processed_ext_msg_at_; };