Skip to content
Snippets Groups Projects
Unverified Commit 65eb8bff authored by Wei Tang's avatar Wei Tang Committed by GitHub
Browse files

Handle attestation duplicated aggregation (#157)

parent 48373e7a
Branches
No related merge requests found
Pipeline #40248 passed with stages
in 8 minutes and 58 seconds
......@@ -5,7 +5,7 @@ use ssz::Digestible;
use std::collections::HashMap;
pub struct AttestationPool<'config, C: Config> {
pool: HashMap<H256, Attestation>,
pool: HashMap<H256, Vec<Attestation>>,
_config: &'config C,
}
......@@ -24,23 +24,43 @@ impl<'config, C: Config> AttestationPool<'config, C> {
}).as_slice());
self.pool.entry(hash)
.and_modify(|existing| {
// TODO: Handle cases for duplicate signatures.
for i in 0..(existing.aggregation_bitfield.0.len() * 8) {
if attestation.aggregation_bitfield.get_bit(i) {
assert_eq!(existing.aggregation_bitfield.get_bit(i), false);
.and_modify(|existings| {
let attestation = attestation.clone();
let mut aggregated = false;
for existing in existings.iter_mut() {
let has_duplicate = {
let mut has_duplicate = false;
for i in 0..(existing.aggregation_bitfield.0.len() * 8) {
if attestation.aggregation_bitfield.get_bit(i) {
has_duplicate = true;
}
}
has_duplicate
};
if has_duplicate {
continue
}
existing.aggregation_bitfield |= attestation.aggregation_bitfield.clone();
for i in 0..attestation.custody_bitfield.0.len() {
assert_eq!(attestation.custody_bitfield.0[i], 0);
}
existing.custody_bitfield |= attestation.custody_bitfield.clone();
existing.signature = C::aggregate_signatures(&[
existing.signature, attestation.signature.clone()
]);
aggregated = true;
break;
}
existing.aggregation_bitfield |= attestation.aggregation_bitfield.clone();
for i in 0..attestation.custody_bitfield.0.len() {
assert_eq!(attestation.custody_bitfield.0[i], 0);
if !aggregated {
existings.push(attestation);
}
existing.custody_bitfield |= attestation.custody_bitfield.clone();
existing.signature = C::aggregate_signatures(&[
existing.signature, attestation.signature.clone()
]);
})
.or_insert(attestation);
.or_insert(vec![attestation]);
}
pub fn pop(&mut self, key: &H256) {
......@@ -48,6 +68,6 @@ impl<'config, C: Config> AttestationPool<'config, C> {
}
pub fn iter(&self) -> impl Iterator<Item=(&H256, &Attestation)> {
self.pool.iter()
self.pool.iter().flat_map(|(h, ats)| ats.iter().map(move |at| (h, at)))
}
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment