@@ -738,21 +738,30 @@ impl Node {
738738 // - the age of the EB (older EBs take priority)
739739 // - the TXs in the EB (more TXs take priority)
740740 // - the number of votes (more votes is better)
741- let ( & block, _) = self
742- . leios
743- . votes_by_eb
744- . iter ( )
745- . filter_map ( |( eb, votes) | {
746- if slot - eb. slot > max_eb_age || forbidden_slots. contains ( & eb. slot ) {
747- return None ;
748- }
749- let vote_count: usize = votes. values ( ) . sum ( ) ;
750- if ( vote_count as u64 ) < vote_threshold {
751- return None ;
752- }
753- Some ( ( eb, vote_count) )
754- } )
755- . max_by_key ( |( eb, votes) | ( slot - eb. slot , self . count_txs_in_eb ( eb) , * votes) ) ?;
741+ let ( & block, _) =
742+ self . leios
743+ . votes_by_eb
744+ . iter ( )
745+ . filter_map ( |( eb, votes) | {
746+ if slot - eb. slot > max_eb_age || forbidden_slots. contains ( & eb. slot ) {
747+ return None ;
748+ }
749+ let vote_count: usize = votes. values ( ) . sum ( ) ;
750+ if ( vote_count as u64 ) < vote_threshold {
751+ return None ;
752+ }
753+ // Only select the EB if we have seen all IBs which it references
754+ let Some ( EndorserBlockState :: Received ( eb_body) ) = self . leios . ebs . get ( eb) else {
755+ return None ;
756+ } ;
757+ if eb_body. ibs . iter ( ) . any ( |ib| {
758+ !matches ! ( self . leios. ibs. get( ib) , Some ( InputBlockState :: Received ( _) ) )
759+ } ) {
760+ return None ;
761+ }
762+ Some ( ( eb, vote_count) )
763+ } )
764+ . max_by_key ( |( eb, votes) | ( slot - eb. slot , self . count_txs_in_eb ( eb) , * votes) ) ?;
756765
757766 let ( block, votes) = self . leios . votes_by_eb . remove_entry ( & block) ?;
758767 let bytes = self . sim_config . sizes . cert ( votes. len ( ) ) ;
0 commit comments