@@ -171,10 +171,10 @@ impl<'g, 'p, B: BlockT> ValidatorContext<B> for NetworkContext<'g, 'p, B> {
171171
172172 /// Send addressed message to a peer.
173173 fn send_message ( & mut self , who : & PeerId , message : Vec < u8 > ) {
174- self . protocol . send_consensus ( who. clone ( ) , ConsensusMessage {
174+ self . protocol . send_consensus ( who. clone ( ) , vec ! [ ConsensusMessage {
175175 engine_id: self . engine_id,
176176 data: message,
177- } ) ;
177+ } ] ) ;
178178 }
179179
180180 /// Send all messages with given topic to a peer.
@@ -190,7 +190,7 @@ fn propagate<'a, B: BlockT, I>(
190190 peers : & mut HashMap < PeerId , PeerConsensus < B :: Hash > > ,
191191 validators : & HashMap < ConsensusEngineId , Arc < dyn Validator < B > > > ,
192192)
193- where I : IntoIterator < Item =( & ' a B :: Hash , & ' a B :: Hash , & ' a ConsensusMessage ) > , // (msg_hash, topic, message)
193+ where I : Clone + IntoIterator < Item =( & ' a B :: Hash , & ' a B :: Hash , & ' a ConsensusMessage ) > , // (msg_hash, topic, message)
194194{
195195 let mut check_fns = HashMap :: new ( ) ;
196196 let mut message_allowed = move |who : & PeerId , intent : MessageIntent , topic : & B :: Hash , message : & ConsensusMessage | {
@@ -206,8 +206,9 @@ fn propagate<'a, B: BlockT, I>(
206206 ( check_fn) ( who, intent, topic, & message. data )
207207 } ;
208208
209- for ( message_hash, topic, message) in messages {
210- for ( id, ref mut peer) in peers. iter_mut ( ) {
209+ for ( id, ref mut peer) in peers. iter_mut ( ) {
210+ let mut batch = Vec :: new ( ) ;
211+ for ( message_hash, topic, message) in messages. clone ( ) {
211212 let previous_attempts = peer. filtered_messages
212213 . get ( & message_hash)
213214 . cloned ( )
@@ -245,8 +246,9 @@ fn propagate<'a, B: BlockT, I>(
245246 peer. known_messages . insert ( message_hash. clone ( ) ) ;
246247
247248 trace ! ( target: "gossip" , "Propagating to {}: {:?}" , id, message) ;
248- protocol . send_consensus ( id . clone ( ) , message. clone ( ) ) ;
249+ batch . push ( message. clone ( ) )
249250 }
251+ protocol. send_consensus ( id. clone ( ) , batch) ;
250252 }
251253}
252254
@@ -477,65 +479,68 @@ impl<B: BlockT> ConsensusGossip<B> {
477479 & mut self ,
478480 protocol : & mut dyn Context < B > ,
479481 who : PeerId ,
480- message : ConsensusMessage ,
482+ messages : Vec < ConsensusMessage > ,
481483 ) {
482- let message_hash = HashFor :: < B > :: hash ( & message. data [ ..] ) ;
484+ trace ! ( target: "gossip" , "Received {} messages from peer {}" , messages. len( ) , who) ;
485+ for message in messages {
486+ let message_hash = HashFor :: < B > :: hash ( & message. data [ ..] ) ;
483487
484- if self . known_messages . contains_key ( & message_hash) {
485- trace ! ( target: "gossip" , "Ignored already known message from {}" , who) ;
486- protocol. report_peer ( who. clone ( ) , DUPLICATE_GOSSIP_REPUTATION_CHANGE ) ;
487- return ;
488- }
488+ if self . known_messages . contains_key ( & message_hash) {
489+ trace ! ( target: "gossip" , "Ignored already known message from {}" , who) ;
490+ protocol. report_peer ( who. clone ( ) , DUPLICATE_GOSSIP_REPUTATION_CHANGE ) ;
491+ continue ;
492+ }
489493
490- let engine_id = message. engine_id ;
491- // validate the message
492- let validation = self . validators . get ( & engine_id)
493- . cloned ( )
494- . map ( |v| {
495- let mut context = NetworkContext { gossip : self , protocol, engine_id } ;
496- v. validate ( & mut context, & who, & message. data )
497- } ) ;
494+ let engine_id = message. engine_id ;
495+ // validate the message
496+ let validation = self . validators . get ( & engine_id)
497+ . cloned ( )
498+ . map ( |v| {
499+ let mut context = NetworkContext { gossip : self , protocol, engine_id } ;
500+ v. validate ( & mut context, & who, & message. data )
501+ } ) ;
498502
499- let validation_result = match validation {
500- Some ( ValidationResult :: ProcessAndKeep ( topic) ) => Some ( ( topic, true ) ) ,
501- Some ( ValidationResult :: ProcessAndDiscard ( topic) ) => Some ( ( topic, false ) ) ,
502- Some ( ValidationResult :: Discard ) => None ,
503- None => {
504- trace ! ( target: "gossip" , "Unknown message engine id {:?} from {}" , engine_id, who) ;
505- protocol. report_peer ( who. clone ( ) , UNKNOWN_GOSSIP_REPUTATION_CHANGE ) ;
506- protocol. disconnect_peer ( who) ;
507- return ;
508- }
509- } ;
503+ let validation_result = match validation {
504+ Some ( ValidationResult :: ProcessAndKeep ( topic) ) => Some ( ( topic, true ) ) ,
505+ Some ( ValidationResult :: ProcessAndDiscard ( topic) ) => Some ( ( topic, false ) ) ,
506+ Some ( ValidationResult :: Discard ) => None ,
507+ None => {
508+ trace ! ( target: "gossip" , "Unknown message engine id {:?} from {}" , engine_id, who) ;
509+ protocol. report_peer ( who. clone ( ) , UNKNOWN_GOSSIP_REPUTATION_CHANGE ) ;
510+ protocol. disconnect_peer ( who. clone ( ) ) ;
511+ continue ;
512+ }
513+ } ;
510514
511- if let Some ( ( topic, keep) ) = validation_result {
512- protocol. report_peer ( who. clone ( ) , GOSSIP_SUCCESS_REPUTATION_CHANGE ) ;
513- if let Some ( ref mut peer) = self . peers . get_mut ( & who) {
514- peer. known_messages . insert ( message_hash) ;
515- if let Entry :: Occupied ( mut entry) = self . live_message_sinks . entry ( ( engine_id, topic) ) {
516- debug ! ( target: "gossip" , "Pushing consensus message to sinks for {}." , topic) ;
517- entry. get_mut ( ) . retain ( |sink| {
518- if let Err ( e) = sink. unbounded_send ( TopicNotification {
519- message : message. data . clone ( ) ,
520- sender : Some ( who. clone ( ) )
521- } ) {
522- trace ! ( target: "gossip" , "Error broadcasting message notification: {:?}" , e) ;
515+ if let Some ( ( topic, keep) ) = validation_result {
516+ protocol. report_peer ( who. clone ( ) , GOSSIP_SUCCESS_REPUTATION_CHANGE ) ;
517+ if let Some ( ref mut peer) = self . peers . get_mut ( & who) {
518+ peer. known_messages . insert ( message_hash) ;
519+ if let Entry :: Occupied ( mut entry) = self . live_message_sinks . entry ( ( engine_id, topic) ) {
520+ debug ! ( target: "gossip" , "Pushing consensus message to sinks for {}." , topic) ;
521+ entry. get_mut ( ) . retain ( |sink| {
522+ if let Err ( e) = sink. unbounded_send ( TopicNotification {
523+ message : message. data . clone ( ) ,
524+ sender : Some ( who. clone ( ) )
525+ } ) {
526+ trace ! ( target: "gossip" , "Error broadcasting message notification: {:?}" , e) ;
527+ }
528+ !sink. is_closed ( )
529+ } ) ;
530+ if entry. get ( ) . is_empty ( ) {
531+ entry. remove_entry ( ) ;
523532 }
524- !sink. is_closed ( )
525- } ) ;
526- if entry. get ( ) . is_empty ( ) {
527- entry. remove_entry ( ) ;
528533 }
529- }
530- if keep {
531- self . register_message_hashed ( message_hash, topic, message, Some ( who. clone ( ) ) ) ;
534+ if keep {
535+ self . register_message_hashed ( message_hash, topic, message, Some ( who. clone ( ) ) ) ;
536+ }
537+ } else {
538+ trace ! ( target: "gossip" , "Ignored statement from unregistered peer {}" , who) ;
539+ protocol. report_peer ( who. clone ( ) , UNREGISTERED_TOPIC_REPUTATION_CHANGE ) ;
532540 }
533541 } else {
534- trace ! ( target: "gossip" , "Ignored statement from unregistered peer {}" , who) ;
535- protocol. report_peer ( who. clone ( ) , UNREGISTERED_TOPIC_REPUTATION_CHANGE ) ;
542+ trace ! ( target: "gossip" , "Handled valid one hop message from peer {}" , who) ;
536543 }
537- } else {
538- trace ! ( target: "gossip" , "Handled valid one hop message from peer {}" , who) ;
539544 }
540545 }
541546
@@ -555,6 +560,7 @@ impl<B: BlockT> ConsensusGossip<B> {
555560 } ;
556561
557562 if let Some ( ref mut peer) = self . peers . get_mut ( who) {
563+ let mut batch = Vec :: new ( ) ;
558564 for entry in self . messages . iter ( ) . filter ( |m| m. topic == topic && m. message . engine_id == engine_id) {
559565 let intent = if force {
560566 MessageIntent :: ForcedBroadcast
@@ -585,11 +591,12 @@ impl<B: BlockT> ConsensusGossip<B> {
585591 peer. known_messages . insert ( entry. message_hash . clone ( ) ) ;
586592
587593 trace ! ( target: "gossip" , "Sending topic message to {}: {:?}" , who, entry. message) ;
588- protocol . send_consensus ( who . clone ( ) , ConsensusMessage {
594+ batch . push ( ConsensusMessage {
589595 engine_id : engine_id. clone ( ) ,
590596 data : entry. message . data . clone ( ) ,
591597 } ) ;
592598 }
599+ protocol. send_consensus ( who. clone ( ) , batch) ;
593600 }
594601 }
595602
@@ -626,8 +633,7 @@ impl<B: BlockT> ConsensusGossip<B> {
626633
627634 peer. filtered_messages . remove ( & message_hash) ;
628635 peer. known_messages . insert ( message_hash) ;
629-
630- protocol. send_consensus ( who. clone ( ) , message. clone ( ) ) ;
636+ protocol. send_consensus ( who. clone ( ) , vec ! [ message. clone( ) ] ) ;
631637 }
632638}
633639
@@ -812,7 +818,7 @@ mod tests {
812818 impl < B : BlockT > Context < B > for DummyNetworkContext {
813819 fn report_peer ( & mut self , _who : PeerId , _reputation : i32 ) { }
814820 fn disconnect_peer ( & mut self , _who : PeerId ) { }
815- fn send_consensus ( & mut self , _who : PeerId , _consensus : ConsensusMessage ) { }
821+ fn send_consensus ( & mut self , _who : PeerId , _consensus : Vec < ConsensusMessage > ) { }
816822 fn send_chain_specific ( & mut self , _who : PeerId , _message : Vec < u8 > ) { }
817823 }
818824
0 commit comments