@@ -637,61 +637,35 @@ impl P2pNetworkPubsubState {
637637 Ok ( ( ) )
638638 }
639639 P2pNetworkPubsubAction :: BroadcastValidatedMessage { message_id } => {
640- let Some ( ( mcache_message_id, message ) ) =
640+ let Some ( ( mcache_message_id, _ ) ) =
641641 pubsub_state. mcache . get_message_id_and_message ( & message_id)
642642 else {
643643 bug_condition ! ( "Message with id: {:?} not found" , message_id) ;
644644 return Ok ( ( ) ) ;
645645 } ;
646646
647- if let BroadcastMessageId :: Transaction { tx } = & message_id {
648- if let P2pNetworkPubsubMessageCacheMessage :: PreValidatedTransactions {
649- tx_hashes,
650- ..
651- } = message
652- {
653- if let Some ( value) = tx_hashes. get_mut ( tx) {
654- * value = true ;
655- } else {
656- bug_condition ! ( "Transaction with hash: {} not found" , tx) ;
657- return Ok ( ( ) ) ;
658- }
647+ match message_id {
648+ BroadcastMessageId :: Transaction { tx } => {
649+ pubsub_state. mcache . update_transaction_messages ( & tx, true ) ;
650+ let transaction_message_ids =
651+ pubsub_state. mcache . get_validated_transaction_messages ( ) ;
659652
660- let all_vertified = tx_hashes. values ( ) . all ( |v| * v) ;
661- if !all_vertified {
662- return Ok ( ( ) ) ;
653+ let dispatcher = state_context. into_dispatcher ( ) ;
654+ for message_id in transaction_message_ids {
655+ dispatcher
656+ . push ( P2pNetworkPubsubAction :: BroadcastMessage { message_id } ) ;
663657 }
664- } else {
665- bug_condition ! ( "Invalid state for message id with type transaction" ) ;
666- return Ok ( ( ) ) ;
658+
659+ Ok ( ( ) )
660+ }
661+ _ => {
662+ let dispatcher = state_context. into_dispatcher ( ) ;
663+ dispatcher. push ( P2pNetworkPubsubAction :: BroadcastMessage {
664+ message_id : mcache_message_id,
665+ } ) ;
666+ Ok ( ( ) )
667667 }
668668 }
669-
670- let raw_message = message. message ( ) . clone ( ) ;
671- let peer_id = * message. peer_id ( ) ;
672-
673- pubsub_state. reduce_incoming_validated_message (
674- mcache_message_id,
675- peer_id,
676- & raw_message,
677- ) ;
678-
679- let Some ( ( _message_id, message) ) =
680- pubsub_state. mcache . get_message_id_and_message ( & message_id)
681- else {
682- bug_condition ! ( "Message with id: {:?} not found" , message_id) ;
683- return Ok ( ( ) ) ;
684- } ;
685-
686- * message = P2pNetworkPubsubMessageCacheMessage :: Validated {
687- message : raw_message,
688- peer_id,
689- time : * message. time ( ) ,
690- } ;
691-
692- let ( dispatcher, state) = state_context. into_dispatcher_and_state ( ) ;
693-
694- Self :: broadcast ( dispatcher, state)
695669 }
696670 P2pNetworkPubsubAction :: PruneMessages { } => {
697671 let messages = pubsub_state
@@ -717,25 +691,43 @@ impl P2pNetworkPubsubState {
717691 peer_id,
718692 ..
719693 } => {
720- let mut peer_id = peer_id;
694+ let mut involved_peers = peer_id. into_iter ( ) . collect :: < Vec < _ > > ( ) ;
695+ let mut add_peer = |peer : & PeerId | {
696+ if !involved_peers. contains ( peer) {
697+ involved_peers. push ( * peer) ;
698+ }
699+ } ;
700+
721701 if let Some ( message_id) = message_id {
722- let Some ( ( _message_id, message) ) =
723- pubsub_state. mcache . get_message_id_and_message ( & message_id)
724- else {
725- bug_condition ! ( "Message not found for id: {:?}" , message_id) ;
726- return Ok ( ( ) ) ;
727- } ;
702+ match message_id {
703+ BroadcastMessageId :: Transaction { tx } => {
704+ let invalid_messages =
705+ pubsub_state. mcache . get_messages_with_transaction ( & tx) ;
706+
707+ for id in invalid_messages {
708+ let message = pubsub_state. mcache . remove_message ( id) ;
709+ if let Some ( message) = message {
710+ add_peer ( message. peer_id ( ) ) ;
711+ }
712+ }
713+ }
714+ message_id => {
715+ let Some ( ( message_id, message) ) =
716+ pubsub_state. mcache . get_message_id_and_message ( & message_id)
717+ else {
718+ bug_condition ! ( "Message not found for id: {:?}" , message_id) ;
719+ return Ok ( ( ) ) ;
720+ } ;
728721
729- if peer_id. is_none ( ) {
730- peer_id = Some ( * message. peer_id ( ) ) ;
722+ add_peer ( message. peer_id ( ) ) ;
723+ pubsub_state. mcache . remove_message ( message_id) ;
724+ }
731725 }
732-
733- pubsub_state. mcache . remove_message ( _message_id) ;
734726 }
735727
736728 let dispatcher = state_context. into_dispatcher ( ) ;
737729
738- if let Some ( peer_id) = peer_id {
730+ for peer_id in involved_peers {
739731 dispatcher. push ( P2pDisconnectionAction :: Init {
740732 peer_id,
741733 reason : P2pDisconnectionReason :: InvalidMessage ,
@@ -745,6 +737,31 @@ impl P2pNetworkPubsubState {
745737 Ok ( ( ) )
746738 }
747739 P2pNetworkPubsubAction :: IgnoreMessage { .. } => Ok ( ( ) ) ,
740+ P2pNetworkPubsubAction :: BroadcastMessage { message_id } => {
741+ let Some ( message) = pubsub_state. mcache . map . get ( & message_id) else {
742+ bug_condition ! ( "Message with id: {:?} not found" , message_id) ;
743+ return Ok ( ( ) ) ;
744+ } ;
745+
746+ let raw_message = message. message ( ) . clone ( ) ;
747+ let peer_id = * message. peer_id ( ) ;
748+
749+ pubsub_state. reduce_incoming_validated_message ( message_id, peer_id, & raw_message) ;
750+
751+ let Some ( message) = pubsub_state. mcache . map . get_mut ( & message_id) else {
752+ bug_condition ! ( "Message with id: {:?} not found" , message_id) ;
753+ return Ok ( ( ) ) ;
754+ } ;
755+
756+ * message = P2pNetworkPubsubMessageCacheMessage :: Validated {
757+ message : raw_message,
758+ peer_id,
759+ time : * message. time ( ) ,
760+ } ;
761+
762+ let ( dispatcher, state) = state_context. into_dispatcher_and_state ( ) ;
763+ Self :: broadcast ( dispatcher, state)
764+ }
748765 }
749766 }
750767
0 commit comments