@@ -738,21 +738,30 @@ impl Node {
738
738
// - the age of the EB (older EBs take priority)
739
739
// - the TXs in the EB (more TXs take priority)
740
740
// - 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) ) ?;
756
765
757
766
let ( block, votes) = self . leios . votes_by_eb . remove_entry ( & block) ?;
758
767
let bytes = self . sim_config . sizes . cert ( votes. len ( ) ) ;
0 commit comments