1- use std:: { collections:: btree_map:: Entry , time:: Duration } ;
1+ use std:: {
2+ collections:: { btree_map:: Entry , BTreeMap } ,
3+ time:: Duration ,
4+ } ;
25
36use binprot:: BinProtRead ;
47use mina_p2p_messages:: {
58 gossip:: { self , GossipNetMessageV2 } ,
69 v2:: NetworkPoolSnarkPoolDiffVersionedStableV2 ,
710} ;
8- use openmina_core:: { block:: BlockWithHash , bug_condition, fuzz_maybe, fuzzed_maybe, Substate } ;
11+ use openmina_core:: {
12+ block:: BlockWithHash , bug_condition, fuzz_maybe, fuzzed_maybe, snark:: Snark , Substate ,
13+ } ;
914use redux:: { Dispatcher , Timestamp } ;
1015
1116use crate :: {
@@ -21,8 +26,8 @@ use super::{
2126 P2pNetworkPubsubMessageCacheMessage ,
2227 } ,
2328 pb:: { self , Message } ,
24- P2pNetworkPubsubAction , P2pNetworkPubsubClientState , P2pNetworkPubsubEffectfulAction ,
25- P2pNetworkPubsubMessageCacheId , P2pNetworkPubsubState , TOPIC ,
29+ BroadcastMessageId , P2pNetworkPubsubAction , P2pNetworkPubsubClientState ,
30+ P2pNetworkPubsubEffectfulAction , P2pNetworkPubsubMessageCacheId , P2pNetworkPubsubState , TOPIC ,
2631} ;
2732
2833const MAX_MESSAGE_KEEP_DURATION : Duration = Duration :: from_secs ( 300 ) ;
@@ -555,6 +560,39 @@ impl P2pNetworkPubsubState {
555560 time,
556561 }
557562 }
563+ GossipNetMessageV2 :: SnarkPoolDiff {
564+ message : NetworkPoolSnarkPoolDiffVersionedStableV2 :: AddSolvedWork ( snark) ,
565+ ..
566+ } => {
567+ let snark: Snark = snark. 1 . clone ( ) . into ( ) ;
568+ let job_id = snark. job_id ( ) ;
569+ P2pNetworkPubsubMessageCacheMessage :: PreValidatedSnark {
570+ job_id,
571+ message,
572+ peer_id,
573+ time,
574+ }
575+ }
576+ GossipNetMessageV2 :: TransactionPoolDiff {
577+ message : tx_message,
578+ ..
579+ } => {
580+ let mut tx_hashes = BTreeMap :: new ( ) ;
581+
582+ for tx in & tx_message. 0 {
583+ let Ok ( hash) = tx. hash ( ) else {
584+ continue ;
585+ } ;
586+ tx_hashes. insert ( hash, false ) ;
587+ }
588+
589+ P2pNetworkPubsubMessageCacheMessage :: PreValidatedTransactions {
590+ tx_hashes,
591+ message,
592+ peer_id,
593+ time,
594+ }
595+ }
558596 _ => P2pNetworkPubsubMessageCacheMessage :: PreValidated {
559597 message,
560598 peer_id,
@@ -572,7 +610,6 @@ impl P2pNetworkPubsubState {
572610 GossipNetMessageV2 :: NewState ( block) => {
573611 let best_tip = BlockWithHash :: try_new ( block. clone ( ) ) ?;
574612 dispatcher. push ( P2pPeerAction :: BestTipUpdate { peer_id, best_tip } ) ;
575- return Ok ( ( ) ) ;
576613 }
577614 GossipNetMessageV2 :: TransactionPoolDiff { message, nonce } => {
578615 let nonce = nonce. as_u32 ( ) ;
@@ -588,18 +625,15 @@ impl P2pNetworkPubsubState {
588625 message : NetworkPoolSnarkPoolDiffVersionedStableV2 :: AddSolvedWork ( work) ,
589626 nonce,
590627 } => {
628+ let snark: Snark = work. 1 . into ( ) ;
591629 dispatcher. push ( P2pChannelsSnarkAction :: Libp2pReceived {
592630 peer_id,
593- snark : Box :: new ( work . 1 . into ( ) ) ,
631+ snark : Box :: new ( snark ) ,
594632 nonce : nonce. as_u32 ( ) ,
595633 } ) ;
596634 }
597635 _ => { }
598636 }
599-
600- dispatcher. push ( P2pNetworkPubsubAction :: BroadcastValidatedMessage {
601- message_id : super :: BroadcastMessageId :: MessageId { message_id } ,
602- } ) ;
603637 Ok ( ( ) )
604638 }
605639 P2pNetworkPubsubAction :: BroadcastValidatedMessage { message_id } => {
@@ -609,8 +643,32 @@ impl P2pNetworkPubsubState {
609643 bug_condition ! ( "Message with id: {:?} not found" , message_id) ;
610644 return Ok ( ( ) ) ;
611645 } ;
646+
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+ }
659+
660+ let all_vertified = tx_hashes. values ( ) . all ( |v| * v) ;
661+ if !all_vertified {
662+ return Ok ( ( ) ) ;
663+ }
664+ } else {
665+ bug_condition ! ( "Invalid state for message id with type transaction" ) ;
666+ return Ok ( ( ) ) ;
667+ }
668+ }
669+
612670 let raw_message = message. message ( ) . clone ( ) ;
613- let peer_id = message. peer_id ( ) ;
671+ let peer_id = * message. peer_id ( ) ;
614672
615673 pubsub_state. reduce_incoming_validated_message (
616674 mcache_message_id,
@@ -628,7 +686,7 @@ impl P2pNetworkPubsubState {
628686 * message = P2pNetworkPubsubMessageCacheMessage :: Validated {
629687 message : raw_message,
630688 peer_id,
631- time : message. time ( ) ,
689+ time : * message. time ( ) ,
632690 } ;
633691
634692 let ( dispatcher, state) = state_context. into_dispatcher_and_state ( ) ;
@@ -641,7 +699,7 @@ impl P2pNetworkPubsubState {
641699 . map
642700 . iter ( )
643701 . filter_map ( |( message_id, message) | {
644- if message. time ( ) + MAX_MESSAGE_KEEP_DURATION > time {
702+ if ( * message. time ( ) + MAX_MESSAGE_KEEP_DURATION ) <= time {
645703 Some ( message_id. to_owned ( ) )
646704 } else {
647705 None
@@ -669,7 +727,7 @@ impl P2pNetworkPubsubState {
669727 } ;
670728
671729 if peer_id. is_none ( ) {
672- peer_id = Some ( message. peer_id ( ) ) ;
730+ peer_id = Some ( * message. peer_id ( ) ) ;
673731 }
674732
675733 pubsub_state. mcache . remove_message ( _message_id) ;
0 commit comments