@@ -475,15 +475,43 @@ impl<S: ConsensusSpec, R: ConsensusRpc<S>> Inner<S, R> {
475475
476476 pub async fn send_blocks ( & self ) -> Result < ( ) > {
477477 let slot = self . store . optimistic_header . beacon ( ) . slot ;
478- let payload = self . get_execution_payload ( & Some ( slot) ) . await ?;
479- let finalized_slot = self . store . finalized_header . beacon ( ) . slot ;
480- let finalized_payload = self . get_execution_payload ( & Some ( finalized_slot) ) . await ?;
481-
482- let block = payload_to_block ( payload) ;
483- let finalized_block = payload_to_block ( finalized_payload) ;
484-
485- self . block_send . send ( block) . await ?;
486- self . finalized_block_send . send ( Some ( finalized_block) ) ?;
478+ let slot = Some ( slot) ;
479+
480+ let latest_fin_hash = self
481+ . store
482+ . finalized_header
483+ . execution ( )
484+ . ok ( )
485+ . map ( |h| * h. block_hash ( ) ) ;
486+ let last_sent_fin_hash = self
487+ . finalized_block_send
488+ . borrow ( )
489+ . as_ref ( )
490+ . map ( |b| b. header . hash ) ;
491+
492+ let should_fetch_finalized = latest_fin_hash
493+ . zip ( last_sent_fin_hash)
494+ . map_or ( true , |( latest, sent) | latest != sent) ;
495+
496+ if should_fetch_finalized {
497+ let finalized_slot = self . store . finalized_header . beacon ( ) . slot ;
498+ let finalized_slot = Some ( finalized_slot) ;
499+
500+ let ( payload, finalized_payload) = tokio:: try_join!(
501+ self . get_execution_payload( & slot) ,
502+ self . get_execution_payload( & finalized_slot) ,
503+ ) ?;
504+
505+ let block = payload_to_block ( payload) ;
506+ let finalized_block = payload_to_block ( finalized_payload) ;
507+
508+ self . block_send . send ( block) . await ?;
509+ self . finalized_block_send . send ( Some ( finalized_block) ) ?;
510+ } else {
511+ let payload = self . get_execution_payload ( & slot) . await ?;
512+ let block = payload_to_block ( payload) ;
513+ self . block_send . send ( block) . await ?;
514+ }
487515
488516 Ok ( ( ) )
489517 }
0 commit comments