Skip to content

Commit af26f34

Browse files
committed
remove subset attestations
1 parent 5c0d77c commit af26f34

File tree

1 file changed

+28
-6
lines changed
  • beacon_node/operation_pool/src

1 file changed

+28
-6
lines changed

beacon_node/operation_pool/src/lib.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff 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

0 commit comments

Comments
 (0)