@@ -189,12 +189,28 @@ impl PeerReputation {
189189 }
190190}
191191
192- #[ derive( Default ) ]
193192pub struct PeerReputationManager {
194193 reputations : HashMap < SocketAddr , PeerReputation > ,
195194}
196195
197196impl PeerReputationManager {
197+ pub async fn load_or_new ( storage : & PersistentPeerStorage ) -> Self {
198+ let mut reputations =
199+ storage. load_peers_reputation ( ) . await . unwrap_or_else ( |_| HashMap :: new ( ) ) ;
200+
201+ log:: info!( "Loaded reputation data for {} peers" , reputations. len( ) ) ;
202+
203+ for ( _, reputation) in reputations. iter_mut ( ) {
204+ if reputation. ban_count > 0 {
205+ reputation. score = reputation. score . max ( 50 ) ; // Start with higher score for previously banned peers
206+ }
207+ }
208+
209+ Self {
210+ reputations,
211+ }
212+ }
213+
198214 /// Update peer reputation
199215 pub async fn update_reputation (
200216 & mut self ,
@@ -320,28 +336,6 @@ impl PeerReputationManager {
320336 ) -> std:: io:: Result < ( ) > {
321337 storage. save_peers_reputation ( & self . reputations ) . await . map_err ( std:: io:: Error :: other)
322338 }
323-
324- /// Load reputation data from persistent storage
325- pub async fn load_from_storage (
326- & mut self ,
327- storage : & PersistentPeerStorage ,
328- ) -> std:: io:: Result < ( ) > {
329- let data = storage. load_peers_reputation ( ) . await . map_err ( std:: io:: Error :: other) ?;
330- log:: info!( "Loaded reputation data for {} peers" , data. len( ) ) ;
331-
332- let reputations = & mut self . reputations ;
333-
334- for ( addr, mut reputation) in data {
335- // Apply initial decay based on ban count
336- if reputation. ban_count > 0 {
337- reputation. score = reputation. score . max ( 50 ) ; // Start with higher score for previously banned peers
338- }
339-
340- reputations. insert ( addr, reputation) ;
341- }
342-
343- Ok ( ( ) )
344- }
345339}
346340
347341#[ cfg( test) ]
@@ -351,9 +345,17 @@ mod tests {
351345 use super :: * ;
352346 use std:: net:: SocketAddr ;
353347
348+ async fn build_peer_reputation_manager ( ) -> PeerReputationManager {
349+ let temp_dir = tempfile:: TempDir :: new ( ) . unwrap ( ) ;
350+ let peer_storage = PersistentPeerStorage :: open ( temp_dir. path ( ) )
351+ . await
352+ . expect ( "Failed to open PersistentPeerStorage" ) ;
353+ PeerReputationManager :: load_or_new ( & peer_storage) . await
354+ }
355+
354356 #[ tokio:: test]
355357 async fn test_basic_reputation_operations ( ) {
356- let mut manager = PeerReputationManager :: default ( ) ;
358+ let mut manager = build_peer_reputation_manager ( ) . await ;
357359 let peer: SocketAddr = "127.0.0.1:8333" . parse ( ) . unwrap ( ) ;
358360
359361 // Initial score should be 0
@@ -367,7 +369,7 @@ mod tests {
367369
368370 #[ tokio:: test]
369371 async fn test_banning_mechanism ( ) {
370- let mut manager = PeerReputationManager :: default ( ) ;
372+ let mut manager = build_peer_reputation_manager ( ) . await ;
371373 let peer: SocketAddr = "192.168.1.1:8333" . parse ( ) . unwrap ( ) ;
372374
373375 // Accumulate misbehavior
@@ -388,7 +390,7 @@ mod tests {
388390
389391 #[ tokio:: test]
390392 async fn test_reputation_persistence ( ) {
391- let mut manager = PeerReputationManager :: default ( ) ;
393+ let mut manager = build_peer_reputation_manager ( ) . await ;
392394 let peer1: SocketAddr = "10.0.0.1:8333" . parse ( ) . unwrap ( ) ;
393395 let peer2: SocketAddr = "10.0.0.2:8333" . parse ( ) . unwrap ( ) ;
394396
@@ -407,8 +409,7 @@ mod tests {
407409 . expect ( "Failed to open PersistentPeerStorage" ) ;
408410 manager. save_to_storage ( & peer_storage) . await . unwrap ( ) ;
409411
410- let mut new_manager = PeerReputationManager :: default ( ) ;
411- new_manager. load_from_storage ( & peer_storage) . await . unwrap ( ) ;
412+ let new_manager = PeerReputationManager :: load_or_new ( & peer_storage) . await ;
412413
413414 // Verify scores were preserved
414415 assert_eq ! ( new_manager. reputations. get( & peer1) . expect( "Peer not found" ) . score, -10 ) ;
@@ -417,7 +418,7 @@ mod tests {
417418
418419 #[ tokio:: test]
419420 async fn test_peer_selection ( ) {
420- let mut manager = PeerReputationManager :: default ( ) ;
421+ let mut manager = build_peer_reputation_manager ( ) . await ;
421422
422423 let good_peer: SocketAddr = "1.1.1.1:8333" . parse ( ) . unwrap ( ) ;
423424 let neutral_peer: SocketAddr = "2.2.2.2:8333" . parse ( ) . unwrap ( ) ;
0 commit comments