diff --git a/validator/full-node-shard.cpp b/validator/full-node-shard.cpp index 53c086e3a..8e42716bf 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 faf495985..0525474e6 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_; };