File tree Expand file tree Collapse file tree 1 file changed +28
-6
lines changed
beacon_node/operation_pool/src Expand file tree Collapse file tree 1 file changed +28
-6
lines changed Original file line number Diff line number Diff line change @@ -258,13 +258,35 @@ impl<T: EthSpec> OperationPool<T> {
258258 let cliques = bron_kerbosch ( & aggregates, is_compatible) ;
259259
260260 // aggregate each cliques corresponding attestaiions
261- let mut clique_aggregates = cliques. iter ( ) . map ( |clique| {
262- let mut res_att = aggregates[ clique[ 0 ] ] . clone ( ) ;
263- for ind in clique. iter ( ) . skip ( 1 ) {
264- res_att. aggregate ( & aggregates[ * ind] ) ;
261+ let mut clique_aggregates: Vec < CompactIndexedAttestation < _ > > = cliques
262+ . iter ( )
263+ . map ( |clique| {
264+ let mut res_att = aggregates[ clique[ 0 ] ] . clone ( ) ;
265+ for ind in clique. iter ( ) . skip ( 1 ) {
266+ res_att. aggregate ( & aggregates[ * ind] ) ;
267+ }
268+ res_att
269+ } )
270+ . collect ( ) ;
271+
272+ let mut indices_to_remove = Vec :: new ( ) ;
273+ clique_aggregates
274+ . sort_by ( |a, b| a. attesting_indices . len ( ) . cmp ( & b. attesting_indices . len ( ) ) ) ;
275+ for ( index, clique) in clique_aggregates. iter ( ) . enumerate ( ) {
276+ for bigger_clique in clique_aggregates. iter ( ) . skip ( index + 1 ) {
277+ if clique
278+ . aggregation_bits
279+ . is_subset ( & bigger_clique. aggregation_bits )
280+ {
281+ indices_to_remove. push ( index) ;
282+ break ;
283+ }
265284 }
266- res_att
267- } ) ;
285+ }
286+ for index in indices_to_remove. iter ( ) . rev ( ) {
287+ clique_aggregates. remove ( * index) ;
288+ }
289+ let mut clique_aggregates = clique_aggregates. into_iter ( ) ;
268290
269291 // aggregate unaggregate attestations into the clique aggregates
270292 // if compatible
You can’t perform that action at this time.
0 commit comments