Skip to content

Commit 0ef2a7c

Browse files
committed
[fix]: module reputation to main
1 parent 9f7f5bb commit 0ef2a7c

File tree

10 files changed

+1647
-1205
lines changed

10 files changed

+1647
-1205
lines changed

nebula/addons/reputation/reputation.py

Lines changed: 1601 additions & 1196 deletions
Large diffs are not rendered by default.

nebula/controller/scenarios.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,7 @@ def __init__(self, scenario, user=None):
697697
participant_config["adversarial_args"]["attack_params"] = node_config["attack_params"]
698698
else:
699699
participant_config["adversarial_args"]["attack_params"] = {"attacks": "No Attack"}
700-
participant_config["defense_args"]["reputation"] = self.scenario.reputation
700+
participant_config["defense_args"]["reputation"] = self.scenario.reputation
701701

702702
participant_config["mobility_args"]["random_geo"] = self.scenario.random_geo
703703
participant_config["mobility_args"]["latitude"] = self.scenario.latitude

nebula/core/engine.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,22 @@ async def _federation_federation_models_included_callback(self, source, message)
380380
finally:
381381
await self.cm.get_connections_lock().release_async()
382382

383+
async def _reputation_share_callback(self, source, message):
384+
try:
385+
logging.info(f"handle_reputation_message | Trigger | Received reputation message from {source} | Node: {message.node_id} | Score: {message.score} | Round: {message.round}")
386+
387+
current_node = self.addr
388+
nei = message.node_id
389+
390+
if hasattr(self, '_reputation') and self._reputation is not None:
391+
if current_node != nei:
392+
key = (current_node, nei, message.round)
393+
if key not in self._reputation.reputation_with_all_feedback:
394+
self._reputation.reputation_with_all_feedback[key] = []
395+
self._reputation.reputation_with_all_feedback[key].append(message.score)
396+
except Exception as e:
397+
logging.exception(f"Error handling reputation message: {e}")
398+
383399
""" ##############################
384400
# REGISTERING CALLBACKS #
385401
##############################

nebula/core/nebulaevents.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,26 @@ async def get_event_data(self) -> tuple[str, tuple[float, float]]:
333333

334334
async def is_concurrent(self) -> bool:
335335
return True
336+
337+
class DuplicatedMessageEvent(NodeEvent):
338+
"""
339+
Event triggered when a message is received that has already been processed.
340+
341+
Attributes:
342+
source (str): The address of the node that sent the duplicated message.
343+
"""
344+
345+
def __init__(self, source: str, message_type: str):
346+
self.source = source
347+
348+
def __str__(self):
349+
return f"DuplicatedMessageEvent from {self.source}"
336350

351+
async def get_event_data(self) -> tuple[str]:
352+
return (self.source)
353+
354+
async def is_concurrent(self) -> bool:
355+
return True
337356

338357
""" ##############################
339358
# ADDON EVENTS #

nebula/core/network/communications.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import requests
77

88
from nebula.core.eventmanager import EventManager
9-
from nebula.core.nebulaevents import MessageEvent
9+
from nebula.core.nebulaevents import MessageEvent, DuplicatedMessageEvent
1010
from nebula.core.network.blacklist import BlackList
1111
from nebula.core.network.connection import Connection
1212
from nebula.core.network.discoverer import Discoverer
@@ -803,7 +803,7 @@ async def deploy_additional_services(self):
803803
await self._forwarder.start()
804804
self._propagator.start()
805805

806-
async def include_received_message_hash(self, hash_message):
806+
async def include_received_message_hash(self, hash_message, source):
807807
"""
808808
Adds a received message hash to the tracking list if it hasn't been seen before.
809809
@@ -819,6 +819,8 @@ async def include_received_message_hash(self, hash_message):
819819
await self.receive_messages_lock.acquire_async()
820820
if hash_message in self.received_messages_hashes:
821821
logging.info("❗️ handle_incoming_message | Ignoring message already received.")
822+
duplicated_event = DuplicatedMessageEvent(source, "Duplicated message received")
823+
asyncio.create_task(EventManager.get_instance().publish_node_event(duplicated_event))
822824
return False
823825
self.received_messages_hashes.append(hash_message)
824826
if len(self.received_messages_hashes) % 10000 == 0:

nebula/core/network/messages.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ async def process_message(self, data, addr_from):
151151

152152
# Message-specific forwarding and processing
153153
elif message_type in special_processing_messages:
154-
if await self.cm.include_received_message_hash(hashlib.md5(data).hexdigest()):
154+
if await self.cm.include_received_message_hash(hashlib.md5(data).hexdigest(), addr_from):
155155
# Forward the message if required
156156
if self._should_forward_message(message_type, message_wrapper):
157157
await self.cm.forward_message(data, addr_from)

nebula/frontend/config/participant.json.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
"reputation": {
9696
"enabled": false,
9797
"metrics": {},
98-
"initial_reputation": 0.6,
98+
"initial_reputation": 0.2,
9999
"weighting_factor": "dynamic"
100100
}
101101
},

nebula/frontend/static/js/deployment/reputation.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ const ReputationManager = (function() {
9595
document.getElementById("weighting-settings").style.display = config.enabled ? "block" : "none";
9696

9797
// Set initial reputation
98-
document.getElementById("initial-reputation").value = config.initialReputation || 0.6;
98+
document.getElementById("initial-reputation").value = config.initialReputation || 0.2;
9999

100100
// Set weighting factor
101101
document.getElementById("weighting-factor").value = config.weightingFactor || "dynamic";
@@ -133,7 +133,7 @@ const ReputationManager = (function() {
133133
document.getElementById("reputation-metrics").style.display = "none";
134134
document.getElementById("reputation-settings").style.display = "none";
135135
document.getElementById("weighting-settings").style.display = "none";
136-
document.getElementById("initial-reputation").value = "0.6";
136+
document.getElementById("initial-reputation").value = "0.2";
137137
document.getElementById("weighting-factor").value = "dynamic";
138138
document.getElementById("weight-warning").style.display = "none";
139139

nebula/frontend/static/js/deployment/scenario.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ const ScenarioManager = (function() {
7878
reputation: {
7979
enabled: window.ReputationManager.getReputationConfig().enabled || false,
8080
metrics: window.ReputationManager.getReputationConfig().metrics || {},
81-
initial_reputation: window.ReputationManager.getReputationConfig().initialReputation || 0.6,
81+
initial_reputation: window.ReputationManager.getReputationConfig().initialReputation || 0.2,
8282
weighting_factor: window.ReputationManager.getReputationConfig().weightingFactor || "dynamic"
8383
},
8484
mobility: window.MobilityManager.getMobilityConfig().enabled || false,

nebula/frontend/templates/deployment.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ <h5 class="step-title">Enable/Disable Reputation</h5>
637637
<div id="reputation-settings" style="margin-top: 10px; display:none;">
638638
<h5 class="step-title">Reputation Initialization</h5>
639639
<input class="form-control" type="number" id="initial-reputation" name="initialReputation"
640-
step="0.01" style="display: inline; width: 80%" value="0.6" min="0.1" max="1">
640+
step="0.01" style="display: inline; width: 80%" value="0.2" min="0.1" max="1">
641641
<small id="reputationInitializationHelp" class="form-text text-muted">
642642
<i id="reputationInitializationHelpIcon" class="fa fa-info-circle"
643643
style="cursor: pointer;"></i>

0 commit comments

Comments
 (0)