mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-10 11:41:21 +00:00
5aac06f04e
* begin move * use same import path * imports * regen protos * regen * no rename * generate ssz * gaz * fmt * edit build file * imports * modify * remove generated files * remove protos * edit imports in prysm * beacon chain all builds * edit script * add generated pbs * add replace rules * license for ethereumapis protos * change visibility * fmt * update build files to gaz ignore * use proper form * edit imports * wrap block * revert scripts * revert go mod
56 lines
1.5 KiB
Go
56 lines
1.5 KiB
Go
package attestations
|
|
|
|
import ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
|
|
|
|
// NaiveAttestationAggregation aggregates naively, without any complex algorithms or optimizations.
|
|
// Note: this is currently a naive implementation to the order of O(mn^2).
|
|
func NaiveAttestationAggregation(atts []*ethpb.Attestation) ([]*ethpb.Attestation, error) {
|
|
if len(atts) <= 1 {
|
|
return atts, nil
|
|
}
|
|
|
|
// Naive aggregation. O(n^2) time.
|
|
for i, a := range atts {
|
|
if i >= len(atts) {
|
|
break
|
|
}
|
|
for j := i + 1; j < len(atts); j++ {
|
|
b := atts[j]
|
|
if a.AggregationBits.Len() == b.AggregationBits.Len() && !a.AggregationBits.Overlaps(b.AggregationBits) {
|
|
var err error
|
|
a, err = AggregatePair(a, b)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
// Delete b
|
|
atts = append(atts[:j], atts[j+1:]...)
|
|
j--
|
|
atts[i] = a
|
|
}
|
|
}
|
|
}
|
|
|
|
// Naive deduplication of identical aggregations. O(n^2) time.
|
|
for i, a := range atts {
|
|
for j := i + 1; j < len(atts); j++ {
|
|
b := atts[j]
|
|
|
|
if a.AggregationBits.Len() != b.AggregationBits.Len() {
|
|
continue
|
|
}
|
|
|
|
if a.AggregationBits.Contains(b.AggregationBits) {
|
|
// If b is fully contained in a, then b can be removed.
|
|
atts = append(atts[:j], atts[j+1:]...)
|
|
j--
|
|
} else if b.AggregationBits.Contains(a.AggregationBits) {
|
|
// if a is fully contained in b, then a can be removed.
|
|
atts = append(atts[:i], atts[i+1:]...)
|
|
break // Stop the inner loop, advance a.
|
|
}
|
|
}
|
|
}
|
|
|
|
return atts, nil
|
|
}
|