* Remove ping protocol * Initial renaming of network services * Correct rebasing relative to latest master * Start updating types * Adds HashMapDelay struct to utils * Initial network restructure * Network restructure. Adds new types for v0.2.0 * Removes build artefacts * Shift validation to beacon chain * Temporarily remove gossip validation This is to be updated to match current optimisation efforts. * Adds AggregateAndProof * Begin rebuilding pubsub encoding/decoding * Signature hacking * Shift gossipsup decoding into eth2_libp2p * Existing EF tests passing with fake_crypto * Shifts block encoding/decoding into RPC * Delete outdated API spec * All release tests passing bar genesis state parsing * Update and test YamlConfig * Update to spec v0.10 compatible BLS * Updates to BLS EF tests * Add EF test for AggregateVerify And delete unused hash2curve tests for uncompressed points * Update EF tests to v0.10.1 * Use optional block root correctly in block proc * Use genesis fork in deposit domain. All tests pass * Fast aggregate verify test * Update REST API docs * Fix unused import * Bump spec tags to v0.10.1 * Add `seconds_per_eth1_block` to chainspec * Update to timestamp based eth1 voting scheme * Return None from `get_votes_to_consider` if block cache is empty * Handle overflows in `is_candidate_block` * Revert to failing tests * Fix eth1 data sets test * Choose default vote according to spec * Fix collect_valid_votes tests * Fix `get_votes_to_consider` to choose all eligible blocks * Uncomment winning_vote tests * Add comments; remove unused code * Reduce seconds_per_eth1_block for simulation * Addressed review comments * Add test for default vote case * Fix logs * Remove unused functions * Meter default eth1 votes * Fix comments * Progress on attestation service * Address review comments; remove unused dependency * Initial work on removing libp2p lock * Add LRU caches to store (rollup) * Update attestation validation for DB changes (WIP) * Initial version of should_forward_block * Scaffold * Progress on attestation validation Also, consolidate prod+testing slot clocks so that they share much of the same implementation and can both handle sub-slot time changes. * Removes lock from libp2p service * Completed network lock removal * Finish(?) attestation processing * Correct network termination future * Add slot check to block check * Correct fmt issues * Remove Drop implementation for network service * Add first attempt at attestation proc. re-write * Add version 2 of attestation processing * Minor fixes * Add validator pubkey cache * Make get_indexed_attestation take a committee * Link signature processing into new attn verification * First working version * Ensure pubkey cache is updated * Add more metrics, slight optimizations * Clone committee cache during attestation processing * Update shuffling cache during block processing * Remove old commented-out code * Fix shuffling cache insert bug * Used indexed attestation in fork choice * Restructure attn processing, add metrics * Add more detailed metrics * Tidy, fix failing tests * Fix failing tests, tidy * Address reviewers suggestions * Disable/delete two outdated tests * Modification of validator for subscriptions * Add slot signing to validator client * Further progress on validation subscription * Adds necessary validator subscription functionality * Add new Pubkeys struct to signature_sets * Refactor with functional approach * Update beacon chain * Clean up validator <-> beacon node http types * Add aggregator status to ValidatorDuty * Impl Clone for manual slot clock * Fix minor errors * Further progress validator client subscription * Initial subscription and aggregation handling * Remove decompressed member from pubkey bytes * Progress to modifying val client for attestation aggregation * First draft of validator client upgrade for aggregate attestations * Add hashmap for indices lookup * Add state cache, remove store cache * Only build the head committee cache * Removes lock on a network channel * Partially implement beacon node subscription http api * Correct compilation issues * Change `get_attesting_indices` to use Vec * Fix failing test * Partial implementation of timer * Adds timer, removes exit_future, http api to op pool * Partial multiple aggregate attestation handling * Permits bulk messages accross gossipsub network channel * Correct compile issues * Improve gosispsub messaging and correct rest api helpers * Added global gossipsub subscriptions * Update validator subscriptions data structs * Tidy * Re-structure validator subscriptions * Initial handling of subscriptions * Re-structure network service * Add pubkey cache persistence file * Add more comments * Integrate persistence file into builder * Add pubkey cache tests * Add HashSetDelay and introduce into attestation service * Handles validator subscriptions * Add data_dir to beacon chain builder * Remove Option in pubkey cache persistence file * Ensure consistency between datadir/data_dir * Fix failing network test * Peer subnet discovery gets queued for future subscriptions * Reorganise attestation service functions * Initial wiring of attestation service * First draft of attestation service timing logic * Correct minor typos * Tidy * Fix todos * Improve tests * Add PeerInfo to connected peers mapping * Fix compile error * Fix compile error from merge * Split up block processing metrics * Tidy * Refactor get_pubkey_from_state * Remove commented-out code * Rename state_cache -> checkpoint_cache * Rename Checkpoint -> Snapshot * Tidy, add comments * Tidy up find_head function * Change some checkpoint -> snapshot * Add tests * Expose max_len * Remove dead code * Tidy * Fix bug * Add sync-speed metric * Add first attempt at VerifiableBlock * Start integrating into beacon chain * Integrate VerifiableBlock * Rename VerifableBlock -> PartialBlockVerification * Add start of typed methods * Add progress * Add further progress * Rename structs * Add full block verification to block_processing.rs * Further beacon chain integration * Update checks for gossip * Add todo * Start adding segement verification * Add passing chain segement test * Initial integration with batch sync * Minor changes * Tidy, add more error checking * Start adding chain_segment tests * Finish invalid signature tests * Include single and gossip verified blocks in tests * Add gossip verification tests * Start adding docs * Finish adding comments to block_processing.rs * Rename block_processing.rs -> block_verification * Start removing old block processing code * Fixes beacon_chain compilation * Fix project-wide compile errors * Remove old code * Correct code to pass all tests * Fix bug with beacon proposer index * Fix shim for BlockProcessingError * Only process one epoch at a time * Fix loop in chain segment processing * Correct tests from master merge * Add caching for state.eth1_data_votes * Add BeaconChain::validator_pubkey * Revert "Add caching for state.eth1_data_votes" This reverts commit cd73dcd6434fb8d8e6bf30c5356355598ea7b78e. Co-authored-by: Grant Wuerker <gwuerker@gmail.com> Co-authored-by: Michael Sproul <michael@sigmaprime.io> Co-authored-by: Michael Sproul <micsproul@gmail.com> Co-authored-by: pawan <pawandhananjay@gmail.com> Co-authored-by: Paul Hauner <paul@paulhauner.com>
162 lines
5.0 KiB
Rust
162 lines
5.0 KiB
Rust
//! A simple hashmap object coupled with a `delay_queue` which has entries that expire after a
|
|
//! fixed time.
|
|
//!
|
|
//! A `HashMapDelay` implements `Stream` which removes expired items from the map.
|
|
|
|
/// The default delay for entries, in seconds. This is only used when `insert()` is used to add
|
|
/// entries.
|
|
const DEFAULT_DELAY: u64 = 30;
|
|
|
|
use futures::prelude::*;
|
|
use std::collections::HashMap;
|
|
use std::time::Duration;
|
|
use tokio_timer::delay_queue::{self, DelayQueue};
|
|
|
|
pub struct HashMapDelay<K, V>
|
|
where
|
|
K: std::cmp::Eq + std::hash::Hash + std::clone::Clone,
|
|
{
|
|
/// The given entries.
|
|
entries: HashMap<K, MapEntry<V>>,
|
|
/// A queue holding the timeouts of each entry.
|
|
expirations: DelayQueue<K>,
|
|
/// The default expiration timeout of an entry.
|
|
default_entry_timeout: Duration,
|
|
}
|
|
|
|
/// A wrapping around entries that adds the link to the entry's expiration, via a `delay_queue` key.
|
|
struct MapEntry<V> {
|
|
/// The expiration key for the entry.
|
|
key: delay_queue::Key,
|
|
/// The actual entry.
|
|
value: V,
|
|
}
|
|
|
|
impl<K, V> Default for HashMapDelay<K, V>
|
|
where
|
|
K: std::cmp::Eq + std::hash::Hash + std::clone::Clone,
|
|
{
|
|
fn default() -> Self {
|
|
HashMapDelay::new(Duration::from_secs(DEFAULT_DELAY))
|
|
}
|
|
}
|
|
|
|
impl<K, V> HashMapDelay<K, V>
|
|
where
|
|
K: std::cmp::Eq + std::hash::Hash + std::clone::Clone,
|
|
{
|
|
/// Creates a new instance of `HashMapDelay`.
|
|
pub fn new(default_entry_timeout: Duration) -> Self {
|
|
HashMapDelay {
|
|
entries: HashMap::new(),
|
|
expirations: DelayQueue::new(),
|
|
default_entry_timeout,
|
|
}
|
|
}
|
|
|
|
/// Insert an entry into the mapping. Entries will expire after the `default_entry_timeout`.
|
|
pub fn insert(&mut self, key: K, value: V) {
|
|
self.insert_at(key, value, self.default_entry_timeout);
|
|
}
|
|
|
|
/// Inserts an entry that will expire at a given instant.
|
|
pub fn insert_at(&mut self, key: K, value: V, entry_duration: Duration) {
|
|
let delay_key = self.expirations.insert(key.clone(), entry_duration);
|
|
let entry = MapEntry {
|
|
key: delay_key,
|
|
value,
|
|
};
|
|
self.entries.insert(key, entry);
|
|
}
|
|
|
|
/// Gets a reference to an entry if it exists.
|
|
///
|
|
/// Returns None if the entry does not exist.
|
|
pub fn get(&self, key: &K) -> Option<&V> {
|
|
self.entries.get(key).map(|entry| &entry.value)
|
|
}
|
|
|
|
/// Gets a mutable reference to an entry if it exists.
|
|
///
|
|
/// Returns None if the entry does not exist.
|
|
pub fn get_mut(&mut self, key: &K) -> Option<&mut V> {
|
|
self.entries.get_mut(key).map(|entry| &mut entry.value)
|
|
}
|
|
|
|
/// Returns true if the key exists, false otherwise.
|
|
pub fn contains_key(&self, key: &K) -> bool {
|
|
self.entries.contains_key(key)
|
|
}
|
|
|
|
/// Returns the length of the mapping.
|
|
pub fn len(&self) -> usize {
|
|
self.entries.len()
|
|
}
|
|
|
|
/// Updates the timeout for a given key. Returns true if the key existed, false otherwise.
|
|
///
|
|
/// Panics if the duration is too far in the future.
|
|
pub fn update_timeout(&mut self, key: &K, timeout: Duration) -> bool {
|
|
if let Some(entry) = self.entries.get(key) {
|
|
self.expirations.reset(&entry.key, timeout);
|
|
true
|
|
} else {
|
|
false
|
|
}
|
|
}
|
|
|
|
/// Removes a key from the map returning the value associated with the key that was in the map.
|
|
///
|
|
/// Return None if the key was not in the map.
|
|
pub fn remove(&mut self, key: &K) -> Option<V> {
|
|
if let Some(entry) = self.entries.remove(key) {
|
|
self.expirations.remove(&entry.key);
|
|
return Some(entry.value);
|
|
}
|
|
return None;
|
|
}
|
|
|
|
/// Retains only the elements specified by the predicate.
|
|
///
|
|
/// In other words, remove all pairs `(k, v)` such that `f(&k,&mut v)` returns false.
|
|
pub fn retain<F: FnMut(&K, &mut V) -> bool>(&mut self, mut f: F) {
|
|
let expiration = &mut self.expirations;
|
|
self.entries.retain(|key, entry| {
|
|
let result = f(key, &mut entry.value);
|
|
if !result {
|
|
expiration.remove(&entry.key);
|
|
}
|
|
result
|
|
})
|
|
}
|
|
|
|
/// Removes all entries from the map.
|
|
pub fn clear(&mut self) {
|
|
self.entries.clear();
|
|
self.expirations.clear();
|
|
}
|
|
}
|
|
|
|
impl<K, V> Stream for HashMapDelay<K, V>
|
|
where
|
|
K: std::cmp::Eq + std::hash::Hash + std::clone::Clone,
|
|
{
|
|
type Item = (K, V);
|
|
type Error = &'static str;
|
|
|
|
fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> {
|
|
match self.expirations.poll() {
|
|
Ok(Async::Ready(Some(key))) => {
|
|
let key = key.into_inner();
|
|
match self.entries.remove(&key) {
|
|
Some(entry) => Ok(Async::Ready(Some((key, entry.value)))),
|
|
None => Err("Value no longer exists in expirations"),
|
|
}
|
|
}
|
|
Ok(Async::Ready(None)) => Ok(Async::Ready(None)),
|
|
Ok(Async::NotReady) => Ok(Async::NotReady),
|
|
Err(_) => Err("Error polling HashMapDelay"),
|
|
}
|
|
}
|
|
}
|