@@ -76,6 +76,7 @@ pub struct Extension {
7676 client : Arc < Client > ,
7777 api : Box < dyn Api > ,
7878 last_request : u64 ,
79+ nonce : u64 ,
7980}
8081
8182impl Extension {
@@ -126,6 +127,7 @@ impl Extension {
126127 client,
127128 api,
128129 last_request : Default :: default ( ) ,
130+ nonce : Default :: default ( ) ,
129131 }
130132 }
131133
@@ -243,14 +245,15 @@ impl NetworkExtension<Event> for Extension {
243245 id,
244246 Arc :: new (
245247 Message :: Status {
246- total_score : chain_info . best_proposal_score ,
248+ nonce : U256 :: from ( self . nonce ) ,
247249 best_hash : chain_info. best_proposal_block_hash ,
248250 genesis_hash : chain_info. genesis_hash ,
249251 }
250252 . rlp_bytes ( )
251253 . into_vec ( ) ,
252254 ) ,
253255 ) ;
256+ self . nonce += 1 ;
254257 let t = self . connected_nodes . insert ( * id) ;
255258 debug_assert ! ( t, "{} is already added to peer list" , id) ;
256259
@@ -299,10 +302,10 @@ impl NetworkExtension<Event> for Extension {
299302 if let Ok ( received_message) = UntrustedRlp :: new ( data) . as_val ( ) {
300303 match received_message {
301304 Message :: Status {
302- total_score ,
305+ nonce ,
303306 best_hash,
304307 genesis_hash,
305- } => self . on_peer_status ( id, total_score , best_hash, genesis_hash) ,
308+ } => self . on_peer_status ( id, nonce , best_hash, genesis_hash) ,
306309 Message :: Request ( request_id, request) => self . on_peer_request ( id, request_id, request) ,
307310 Message :: Response ( request_id, response) => self . on_peer_response ( id, request_id, response) ,
308311 }
@@ -328,7 +331,6 @@ impl NetworkExtension<Event> for Extension {
328331 }
329332 State :: SnapshotChunk ( ..) => unimplemented ! ( ) ,
330333 State :: Full => {
331- let best_proposal_score = self . client . chain_info ( ) . best_proposal_score ;
332334 for id in & peer_ids {
333335 let request =
334336 self . header_downloaders . get_mut ( id) . and_then ( HeaderDownloader :: create_request) ;
@@ -339,13 +341,7 @@ impl NetworkExtension<Event> for Extension {
339341 }
340342
341343 for id in peer_ids {
342- let peer_score = if let Some ( peer) = self . header_downloaders . get ( & id) {
343- peer. total_score ( )
344- } else {
345- U256 :: zero ( )
346- } ;
347-
348- if peer_score > best_proposal_score {
344+ if self . header_downloaders . get ( & id) . map_or ( false , |d| !d. is_lagging ( ) ) {
349345 self . send_body_request ( & id) ;
350346 }
351347 }
@@ -501,20 +497,21 @@ impl Extension {
501497 id,
502498 Arc :: new (
503499 Message :: Status {
504- total_score : chain_info . best_proposal_score ,
500+ nonce : U256 :: from ( self . nonce ) ,
505501 best_hash : chain_info. best_proposal_block_hash ,
506502 genesis_hash : chain_info. genesis_hash ,
507503 }
508504 . rlp_bytes ( )
509505 . into_vec ( ) ,
510506 ) ,
511507 ) ;
508+ self . nonce += 1 ;
512509 }
513510 }
514511}
515512
516513impl Extension {
517- fn on_peer_status ( & mut self , from : & NodeId , total_score : U256 , best_hash : BlockHash , genesis_hash : BlockHash ) {
514+ fn on_peer_status ( & mut self , from : & NodeId , nonce : U256 , best_hash : BlockHash , genesis_hash : BlockHash ) {
518515 // Validity check
519516 if genesis_hash != self . client . chain_info ( ) . genesis_hash {
520517 cinfo ! ( SYNC , "Genesis hash mismatch with peer {}" , from) ;
@@ -523,17 +520,17 @@ impl Extension {
523520
524521 match self . header_downloaders . entry ( * from) {
525522 Entry :: Occupied ( mut peer) => {
526- if !peer. get_mut ( ) . update ( total_score , best_hash) {
523+ if !peer. get_mut ( ) . update ( nonce , best_hash) {
527524 // FIXME: It should be an error level if the consensus is PoW.
528525 cdebug ! ( SYNC , "Peer #{} status updated but score is less than before" , from) ;
529526 return
530527 }
531528 }
532529 Entry :: Vacant ( e) => {
533- e. insert ( HeaderDownloader :: new ( self . client . clone ( ) , total_score , best_hash) ) ;
530+ e. insert ( HeaderDownloader :: new ( self . client . clone ( ) , nonce , best_hash) ) ;
534531 }
535532 }
536- cinfo ! ( SYNC , "Peer #{} status update: total_score : {}, best_hash: {}" , from, total_score , best_hash) ;
533+ cinfo ! ( SYNC , "Peer #{} status update: nonce : {}, best_hash: {}" , from, nonce , best_hash) ;
537534 }
538535
539536 fn on_peer_request ( & self , from : & NodeId , id : u64 , request : RequestMessage ) {
@@ -759,14 +756,12 @@ impl Extension {
759756 }
760757 State :: SnapshotChunk ( ..) => { }
761758 State :: Full => {
762- let ( mut completed, pivot_score_changed) = if let Some ( peer) = self . header_downloaders . get_mut ( from) {
763- let before_pivot_score = peer. pivot_score ( ) ;
759+ let ( mut completed, is_lagging) = if let Some ( peer) = self . header_downloaders . get_mut ( from) {
764760 let encoded: Vec < _ > = headers. iter ( ) . map ( |h| EncodedHeader :: new ( h. rlp_bytes ( ) . to_vec ( ) ) ) . collect ( ) ;
765761 peer. import_headers ( & encoded) ;
766- let after_pivot_score = peer. pivot_score ( ) ;
767- ( peer. downloaded ( ) , before_pivot_score != after_pivot_score)
762+ ( peer. downloaded ( ) , peer. is_lagging ( ) )
768763 } else {
769- ( Vec :: new ( ) , false )
764+ ( Vec :: new ( ) , true )
770765 } ;
771766 completed. sort_unstable_by_key ( EncodedHeader :: number) ;
772767
@@ -792,7 +787,7 @@ impl Extension {
792787 peer. mark_as_imported ( exists) ;
793788 peer. create_request ( )
794789 } ) ;
795- if pivot_score_changed {
790+ if !is_lagging {
796791 if let Some ( request) = request {
797792 self . send_header_request ( from, request) ;
798793 }
@@ -834,18 +829,11 @@ impl Extension {
834829 }
835830 }
836831
837- let total_score = self . client . chain_info ( ) . best_proposal_score ;
838832 let mut peer_ids: Vec < _ > = self . header_downloaders . keys ( ) . cloned ( ) . collect ( ) ;
839833 peer_ids. shuffle ( & mut thread_rng ( ) ) ;
840834
841835 for id in peer_ids {
842- let peer_score = if let Some ( peer) = self . header_downloaders . get ( & id) {
843- peer. total_score ( )
844- } else {
845- U256 :: zero ( )
846- } ;
847-
848- if peer_score > total_score {
836+ if self . header_downloaders . get ( & id) . map_or ( false , |d| !d. is_lagging ( ) ) {
849837 self . send_body_request ( & id) ;
850838 }
851839 }
0 commit comments