2020-12-18 09:17:03 +00:00
|
|
|
use crate::beacon_node_fallback::{BeaconNodeFallback, RequireSynced};
|
2019-12-06 05:44:03 +00:00
|
|
|
use crate::{
|
2020-05-06 11:42:56 +00:00
|
|
|
duties_service::{DutiesService, DutyAndProof},
|
2020-11-26 01:10:51 +00:00
|
|
|
http_metrics::metrics,
|
2019-12-06 05:44:03 +00:00
|
|
|
validator_store::ValidatorStore,
|
|
|
|
};
|
2019-11-25 04:48:24 +00:00
|
|
|
use environment::RuntimeContext;
|
2020-11-28 05:30:57 +00:00
|
|
|
use futures::future::FutureExt;
|
2020-09-29 03:46:54 +00:00
|
|
|
use slog::{crit, error, info, trace};
|
2019-11-25 04:48:24 +00:00
|
|
|
use slot_clock::SlotClock;
|
|
|
|
use std::collections::HashMap;
|
|
|
|
use std::ops::Deref;
|
|
|
|
use std::sync::Arc;
|
2020-11-28 05:30:57 +00:00
|
|
|
use tokio::time::{interval_at, sleep_until, Duration, Instant};
|
2020-09-29 03:46:54 +00:00
|
|
|
use tree_hash::TreeHash;
|
|
|
|
use types::{
|
|
|
|
AggregateSignature, Attestation, AttestationData, BitList, ChainSpec, CommitteeIndex, EthSpec,
|
|
|
|
Slot,
|
|
|
|
};
|
2019-11-25 04:48:24 +00:00
|
|
|
|
|
|
|
/// Builds an `AttestationService`.
|
|
|
|
pub struct AttestationServiceBuilder<T, E: EthSpec> {
|
|
|
|
duties_service: Option<DutiesService<T, E>>,
|
|
|
|
validator_store: Option<ValidatorStore<T, E>>,
|
|
|
|
slot_clock: Option<T>,
|
2020-12-18 09:17:03 +00:00
|
|
|
beacon_nodes: Option<Arc<BeaconNodeFallback<T, E>>>,
|
2019-11-25 04:48:24 +00:00
|
|
|
context: Option<RuntimeContext<E>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T: SlotClock + 'static, E: EthSpec> AttestationServiceBuilder<T, E> {
|
|
|
|
pub fn new() -> Self {
|
|
|
|
Self {
|
|
|
|
duties_service: None,
|
|
|
|
validator_store: None,
|
|
|
|
slot_clock: None,
|
2020-12-18 09:17:03 +00:00
|
|
|
beacon_nodes: None,
|
2019-11-25 04:48:24 +00:00
|
|
|
context: None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn duties_service(mut self, service: DutiesService<T, E>) -> Self {
|
|
|
|
self.duties_service = Some(service);
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn validator_store(mut self, store: ValidatorStore<T, E>) -> Self {
|
|
|
|
self.validator_store = Some(store);
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn slot_clock(mut self, slot_clock: T) -> Self {
|
|
|
|
self.slot_clock = Some(slot_clock);
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2020-12-18 09:17:03 +00:00
|
|
|
pub fn beacon_nodes(mut self, beacon_nodes: Arc<BeaconNodeFallback<T, E>>) -> Self {
|
|
|
|
self.beacon_nodes = Some(beacon_nodes);
|
2019-11-25 04:48:24 +00:00
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn runtime_context(mut self, context: RuntimeContext<E>) -> Self {
|
|
|
|
self.context = Some(context);
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn build(self) -> Result<AttestationService<T, E>, String> {
|
|
|
|
Ok(AttestationService {
|
|
|
|
inner: Arc::new(Inner {
|
|
|
|
duties_service: self
|
|
|
|
.duties_service
|
2020-12-03 01:10:26 +00:00
|
|
|
.ok_or("Cannot build AttestationService without duties_service")?,
|
2019-11-25 04:48:24 +00:00
|
|
|
validator_store: self
|
|
|
|
.validator_store
|
2020-12-03 01:10:26 +00:00
|
|
|
.ok_or("Cannot build AttestationService without validator_store")?,
|
2019-11-25 04:48:24 +00:00
|
|
|
slot_clock: self
|
|
|
|
.slot_clock
|
2020-12-03 01:10:26 +00:00
|
|
|
.ok_or("Cannot build AttestationService without slot_clock")?,
|
2020-12-18 09:17:03 +00:00
|
|
|
beacon_nodes: self
|
|
|
|
.beacon_nodes
|
|
|
|
.ok_or("Cannot build AttestationService without beacon_nodes")?,
|
2019-11-25 04:48:24 +00:00
|
|
|
context: self
|
|
|
|
.context
|
2020-12-03 01:10:26 +00:00
|
|
|
.ok_or("Cannot build AttestationService without runtime_context")?,
|
2019-11-25 04:48:24 +00:00
|
|
|
}),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Helper to minimise `Arc` usage.
|
|
|
|
pub struct Inner<T, E: EthSpec> {
|
|
|
|
duties_service: DutiesService<T, E>,
|
|
|
|
validator_store: ValidatorStore<T, E>,
|
|
|
|
slot_clock: T,
|
2020-12-18 09:17:03 +00:00
|
|
|
beacon_nodes: Arc<BeaconNodeFallback<T, E>>,
|
2019-11-25 04:48:24 +00:00
|
|
|
context: RuntimeContext<E>,
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Attempts to produce attestations for all known validators 1/3rd of the way through each slot.
|
|
|
|
///
|
|
|
|
/// If any validators are on the same committee, a single attestation will be downloaded and
|
|
|
|
/// returned to the beacon node. This attestation will have a signature from each of the
|
|
|
|
/// validators.
|
|
|
|
pub struct AttestationService<T, E: EthSpec> {
|
|
|
|
inner: Arc<Inner<T, E>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T, E: EthSpec> Clone for AttestationService<T, E> {
|
|
|
|
fn clone(&self) -> Self {
|
|
|
|
Self {
|
|
|
|
inner: self.inner.clone(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T, E: EthSpec> Deref for AttestationService<T, E> {
|
|
|
|
type Target = Inner<T, E>;
|
|
|
|
|
|
|
|
fn deref(&self) -> &Self::Target {
|
|
|
|
self.inner.deref()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
|
|
|
|
/// Starts the service which periodically produces attestations.
|
2020-06-04 11:48:05 +00:00
|
|
|
pub fn start_update_service(self, spec: &ChainSpec) -> Result<(), String> {
|
|
|
|
let log = self.context.log().clone();
|
2019-11-25 04:48:24 +00:00
|
|
|
|
2021-01-19 09:39:51 +00:00
|
|
|
let slot_duration = Duration::from_secs(spec.seconds_per_slot);
|
2019-11-25 04:48:24 +00:00
|
|
|
let duration_to_next_slot = self
|
|
|
|
.slot_clock
|
|
|
|
.duration_to_next_slot()
|
2020-12-03 01:10:26 +00:00
|
|
|
.ok_or("Unable to determine duration to next slot")?;
|
2019-11-25 04:48:24 +00:00
|
|
|
|
2020-05-17 11:16:48 +00:00
|
|
|
info!(
|
|
|
|
log,
|
|
|
|
"Attestation production service started";
|
|
|
|
"next_update_millis" => duration_to_next_slot.as_millis()
|
|
|
|
);
|
|
|
|
|
|
|
|
let mut interval = {
|
|
|
|
// Note: `interval_at` panics if `slot_duration` is 0
|
|
|
|
interval_at(
|
2019-11-25 04:48:24 +00:00
|
|
|
Instant::now() + duration_to_next_slot + slot_duration / 3,
|
|
|
|
slot_duration,
|
|
|
|
)
|
|
|
|
};
|
|
|
|
|
2020-06-04 11:48:05 +00:00
|
|
|
let executor = self.context.executor.clone();
|
2020-05-17 11:16:48 +00:00
|
|
|
|
|
|
|
let interval_fut = async move {
|
2021-02-10 23:29:49 +00:00
|
|
|
loop {
|
|
|
|
interval.tick().await;
|
2020-06-04 11:48:05 +00:00
|
|
|
let log = self.context.log();
|
2020-05-17 11:16:48 +00:00
|
|
|
|
|
|
|
if let Err(e) = self.spawn_attestation_tasks(slot_duration) {
|
|
|
|
crit!(
|
|
|
|
log,
|
|
|
|
"Failed to spawn attestation tasks";
|
|
|
|
"error" => e
|
|
|
|
)
|
|
|
|
} else {
|
|
|
|
trace!(
|
|
|
|
log,
|
|
|
|
"Spawned attestation tasks";
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-06-04 11:48:05 +00:00
|
|
|
executor.spawn(interval_fut, "attestation_service");
|
|
|
|
Ok(())
|
2019-11-25 04:48:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// For each each required attestation, spawn a new task that downloads, signs and uploads the
|
|
|
|
/// attestation to the beacon node.
|
Initial work towards v0.2.0 (#924)
* 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>
2020-03-17 06:24:44 +00:00
|
|
|
fn spawn_attestation_tasks(&self, slot_duration: Duration) -> Result<(), String> {
|
2020-12-03 01:10:26 +00:00
|
|
|
let slot = self.slot_clock.now().ok_or("Failed to read slot clock")?;
|
2020-05-17 11:16:48 +00:00
|
|
|
let duration_to_next_slot = self
|
Initial work towards v0.2.0 (#924)
* 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>
2020-03-17 06:24:44 +00:00
|
|
|
.slot_clock
|
|
|
|
.duration_to_next_slot()
|
2020-12-03 01:10:26 +00:00
|
|
|
.ok_or("Unable to determine duration to next slot")?;
|
Initial work towards v0.2.0 (#924)
* 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>
2020-03-17 06:24:44 +00:00
|
|
|
|
|
|
|
// If a validator needs to publish an aggregate attestation, they must do so at 2/3
|
|
|
|
// through the slot. This delay triggers at this time
|
2020-03-25 10:14:05 +00:00
|
|
|
let aggregate_production_instant = Instant::now()
|
|
|
|
+ duration_to_next_slot
|
|
|
|
.checked_sub(slot_duration / 3)
|
|
|
|
.unwrap_or_else(|| Duration::from_secs(0));
|
Initial work towards v0.2.0 (#924)
* 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>
2020-03-17 06:24:44 +00:00
|
|
|
|
2020-05-17 11:16:48 +00:00
|
|
|
let duties_by_committee_index: HashMap<CommitteeIndex, Vec<DutyAndProof>> = self
|
2019-11-25 04:48:24 +00:00
|
|
|
.duties_service
|
|
|
|
.attesters(slot)
|
|
|
|
.into_iter()
|
2020-05-06 11:42:56 +00:00
|
|
|
.fold(HashMap::new(), |mut map, duty_and_proof| {
|
|
|
|
if let Some(committee_index) = duty_and_proof.duty.attestation_committee_index {
|
2020-07-23 14:18:00 +00:00
|
|
|
let validator_duties = map.entry(committee_index).or_insert_with(Vec::new);
|
2020-03-25 10:14:05 +00:00
|
|
|
|
2020-05-06 11:42:56 +00:00
|
|
|
validator_duties.push(duty_and_proof);
|
2019-11-25 04:48:24 +00:00
|
|
|
}
|
|
|
|
|
2020-03-25 10:14:05 +00:00
|
|
|
map
|
2019-11-25 04:48:24 +00:00
|
|
|
});
|
|
|
|
|
2020-03-25 10:14:05 +00:00
|
|
|
// For each committee index for this slot:
|
|
|
|
//
|
|
|
|
// - Create and publish an `Attestation` for all required validators.
|
|
|
|
// - Create and publish `SignedAggregateAndProof` for all aggregating validators.
|
|
|
|
duties_by_committee_index
|
Initial work towards v0.2.0 (#924)
* 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>
2020-03-17 06:24:44 +00:00
|
|
|
.into_iter()
|
|
|
|
.for_each(|(committee_index, validator_duties)| {
|
2020-03-25 10:14:05 +00:00
|
|
|
// Spawn a separate task for each attestation.
|
2020-11-28 05:30:57 +00:00
|
|
|
self.inner.context.executor.spawn(
|
|
|
|
self.clone()
|
|
|
|
.publish_attestations_and_aggregates(
|
|
|
|
slot,
|
|
|
|
committee_index,
|
|
|
|
validator_duties,
|
|
|
|
aggregate_production_instant,
|
|
|
|
)
|
|
|
|
.map(|_| ()),
|
|
|
|
"attestation publish",
|
2020-05-17 11:16:48 +00:00
|
|
|
);
|
Initial work towards v0.2.0 (#924)
* 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>
2020-03-17 06:24:44 +00:00
|
|
|
});
|
2020-03-25 10:14:05 +00:00
|
|
|
|
Prune slashing protection DB (#2194)
## Proposed Changes
Prune the slashing protection database so that it doesn't exhibit unbounded growth. Prune by dropping attestations and blocks from more than 512 epochs ago, relying on the guards that prevent signing messages with slots or epochs less than the minimum recorded in the DB.
The pruning process is potentially time consuming, so it's scheduled to run only every 512 epochs, in the last 2/3rds of a slot. This gives it at least 4 seconds to run without impacting other signing, which I think should be sufficient. I've seen it run for several minutes (yikes!) on our Pyrmont nodes, but I suspect that 1) this will only occur on the first run when the database is still huge 2) no other production users will be impacted because they don't have enough validators per node.
Pruning also happens at start-up, as I figured this is a fairly infrequent event, and if a user is experiencing problems with the VC related to pruning, it's nice to be able to trigger it with a quick restart. Users are also conditioned to not mind missing a few attestations during a restart.
We need to include a note in the release notes that users may see the message `timed out waiting for connection` the first time they prune a huge database, but that this is totally fine and to be expected (the VC will miss those attestations in the meantime).
I'm also open to making this opt-in for now, although the sooner we get users doing it, the less painful it will be: prune early, prune often!
2021-02-24 23:51:04 +00:00
|
|
|
// Schedule pruning of the slashing protection database once all unaggregated
|
|
|
|
// attestations have (hopefully) been signed, i.e. at the same time as aggregate
|
|
|
|
// production.
|
|
|
|
self.spawn_slashing_protection_pruning_task(slot, aggregate_production_instant);
|
|
|
|
|
2019-11-25 04:48:24 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2020-03-25 10:14:05 +00:00
|
|
|
/// Performs the first step of the attesting process: downloading `Attestation` objects,
|
|
|
|
/// signing them and returning them to the validator.
|
|
|
|
///
|
2020-06-19 01:18:27 +00:00
|
|
|
/// https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/validator.md#attesting
|
2020-03-25 10:14:05 +00:00
|
|
|
///
|
|
|
|
/// ## Detail
|
|
|
|
///
|
|
|
|
/// The given `validator_duties` should already be filtered to only contain those that match
|
|
|
|
/// `slot` and `committee_index`. Critical errors will be logged if this is not the case.
|
2020-05-17 11:16:48 +00:00
|
|
|
async fn publish_attestations_and_aggregates(
|
|
|
|
self,
|
2019-11-25 04:48:24 +00:00
|
|
|
slot: Slot,
|
|
|
|
committee_index: CommitteeIndex,
|
2020-05-06 11:42:56 +00:00
|
|
|
validator_duties: Vec<DutyAndProof>,
|
2020-03-25 10:14:05 +00:00
|
|
|
aggregate_production_instant: Instant,
|
2020-05-17 11:16:48 +00:00
|
|
|
) -> Result<(), ()> {
|
2020-06-04 11:48:05 +00:00
|
|
|
let log = self.context.log();
|
2020-11-26 01:10:51 +00:00
|
|
|
let attestations_timer = metrics::start_timer_vec(
|
|
|
|
&metrics::ATTESTATION_SERVICE_TIMES,
|
|
|
|
&[metrics::ATTESTATIONS],
|
|
|
|
);
|
2020-05-17 11:16:48 +00:00
|
|
|
|
2020-03-25 10:14:05 +00:00
|
|
|
// There's not need to produce `Attestation` or `SignedAggregateAndProof` if we do not have
|
|
|
|
// any validators for the given `slot` and `committee_index`.
|
|
|
|
if validator_duties.is_empty() {
|
2020-05-17 11:16:48 +00:00
|
|
|
return Ok(());
|
2020-03-25 10:14:05 +00:00
|
|
|
}
|
|
|
|
|
2020-05-17 11:16:48 +00:00
|
|
|
// Step 1.
|
|
|
|
//
|
|
|
|
// Download, sign and publish an `Attestation` for each validator.
|
|
|
|
let attestation_opt = self
|
|
|
|
.produce_and_publish_attestations(slot, committee_index, &validator_duties)
|
|
|
|
.await
|
|
|
|
.map_err(move |e| {
|
|
|
|
crit!(
|
|
|
|
log,
|
|
|
|
"Error during attestation routine";
|
|
|
|
"error" => format!("{:?}", e),
|
|
|
|
"committee_index" => committee_index,
|
|
|
|
"slot" => slot.as_u64(),
|
Initial work towards v0.2.0 (#924)
* 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>
2020-03-17 06:24:44 +00:00
|
|
|
)
|
2020-05-17 11:16:48 +00:00
|
|
|
})?;
|
|
|
|
|
2020-11-26 01:10:51 +00:00
|
|
|
drop(attestations_timer);
|
|
|
|
|
2020-05-17 11:16:48 +00:00
|
|
|
// Step 2.
|
|
|
|
//
|
|
|
|
// If an attestation was produced, make an aggregate.
|
2020-09-29 03:46:54 +00:00
|
|
|
if let Some(attestation_data) = attestation_opt {
|
2020-05-17 11:16:48 +00:00
|
|
|
// First, wait until the `aggregation_production_instant` (2/3rds
|
|
|
|
// of the way though the slot). As verified in the
|
|
|
|
// `delay_triggers_when_in_the_past` test, this code will still run
|
|
|
|
// even if the instant has already elapsed.
|
2020-11-28 05:30:57 +00:00
|
|
|
sleep_until(aggregate_production_instant).await;
|
2020-05-17 11:16:48 +00:00
|
|
|
|
2020-11-26 01:10:51 +00:00
|
|
|
// Start the metrics timer *after* we've done the delay.
|
|
|
|
let _aggregates_timer = metrics::start_timer_vec(
|
|
|
|
&metrics::ATTESTATION_SERVICE_TIMES,
|
|
|
|
&[metrics::AGGREGATES],
|
|
|
|
);
|
|
|
|
|
2020-05-17 11:16:48 +00:00
|
|
|
// Then download, sign and publish a `SignedAggregateAndProof` for each
|
|
|
|
// validator that is elected to aggregate for this `slot` and
|
|
|
|
// `committee_index`.
|
2020-09-29 03:46:54 +00:00
|
|
|
self.produce_and_publish_aggregates(attestation_data, &validator_duties)
|
2020-05-17 11:16:48 +00:00
|
|
|
.await
|
2020-03-25 10:14:05 +00:00
|
|
|
.map_err(move |e| {
|
|
|
|
crit!(
|
2020-05-17 11:16:48 +00:00
|
|
|
log,
|
2020-03-25 10:14:05 +00:00
|
|
|
"Error during attestation routine";
|
|
|
|
"error" => format!("{:?}", e),
|
|
|
|
"committee_index" => committee_index,
|
|
|
|
"slot" => slot.as_u64(),
|
|
|
|
)
|
2020-05-17 11:16:48 +00:00
|
|
|
})?;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
Initial work towards v0.2.0 (#924)
* 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>
2020-03-17 06:24:44 +00:00
|
|
|
}
|
|
|
|
|
2020-03-25 10:14:05 +00:00
|
|
|
/// Performs the first step of the attesting process: downloading `Attestation` objects,
|
|
|
|
/// signing them and returning them to the validator.
|
|
|
|
///
|
2020-06-19 01:18:27 +00:00
|
|
|
/// https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/validator.md#attesting
|
2020-03-25 10:14:05 +00:00
|
|
|
///
|
|
|
|
/// ## Detail
|
|
|
|
///
|
|
|
|
/// The given `validator_duties` should already be filtered to only contain those that match
|
|
|
|
/// `slot` and `committee_index`. Critical errors will be logged if this is not the case.
|
|
|
|
///
|
|
|
|
/// Only one `Attestation` is downloaded from the BN. It is then cloned and signed by each
|
|
|
|
/// validator and the list of individually-signed `Attestation` objects is returned to the BN.
|
2020-05-17 11:16:48 +00:00
|
|
|
async fn produce_and_publish_attestations(
|
Initial work towards v0.2.0 (#924)
* 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>
2020-03-17 06:24:44 +00:00
|
|
|
&self,
|
|
|
|
slot: Slot,
|
|
|
|
committee_index: CommitteeIndex,
|
2020-05-17 11:16:48 +00:00
|
|
|
validator_duties: &[DutyAndProof],
|
2020-09-29 03:46:54 +00:00
|
|
|
) -> Result<Option<AttestationData>, String> {
|
2020-06-04 11:48:05 +00:00
|
|
|
let log = self.context.log();
|
2020-05-17 11:16:48 +00:00
|
|
|
|
2020-03-25 10:14:05 +00:00
|
|
|
if validator_duties.is_empty() {
|
2020-05-17 11:16:48 +00:00
|
|
|
return Ok(None);
|
2020-03-25 10:14:05 +00:00
|
|
|
}
|
|
|
|
|
2020-05-18 06:25:16 +00:00
|
|
|
let current_epoch = self
|
|
|
|
.slot_clock
|
|
|
|
.now()
|
2020-12-03 01:10:26 +00:00
|
|
|
.ok_or("Unable to determine current slot from clock")?
|
2020-05-18 06:25:16 +00:00
|
|
|
.epoch(E::slots_per_epoch());
|
|
|
|
|
2020-09-29 03:46:54 +00:00
|
|
|
let attestation_data = self
|
2020-12-18 09:17:03 +00:00
|
|
|
.beacon_nodes
|
|
|
|
.first_success(RequireSynced::No, |beacon_node| async move {
|
|
|
|
beacon_node
|
|
|
|
.get_validator_attestation_data(slot, committee_index)
|
|
|
|
.await
|
|
|
|
.map_err(|e| format!("Failed to produce attestation data: {:?}", e))
|
|
|
|
.map(|result| result.data)
|
|
|
|
})
|
2020-05-17 11:16:48 +00:00
|
|
|
.await
|
2020-12-18 09:17:03 +00:00
|
|
|
.map_err(|e| e.to_string())?;
|
2020-09-29 03:46:54 +00:00
|
|
|
|
2020-11-18 23:31:39 +00:00
|
|
|
let mut attestations = Vec::with_capacity(validator_duties.len());
|
|
|
|
|
2020-09-29 03:46:54 +00:00
|
|
|
for duty in validator_duties {
|
|
|
|
// Ensure that all required fields are present in the validator duty.
|
|
|
|
let (
|
|
|
|
duty_slot,
|
|
|
|
duty_committee_index,
|
|
|
|
validator_committee_position,
|
|
|
|
_,
|
|
|
|
_,
|
|
|
|
committee_length,
|
|
|
|
) = if let Some(tuple) = duty.attestation_duties() {
|
|
|
|
tuple
|
|
|
|
} else {
|
|
|
|
crit!(
|
|
|
|
log,
|
|
|
|
"Missing validator duties when signing";
|
|
|
|
"duties" => format!("{:?}", duty)
|
|
|
|
);
|
|
|
|
continue;
|
|
|
|
};
|
2020-03-25 10:14:05 +00:00
|
|
|
|
2020-09-29 03:46:54 +00:00
|
|
|
// Ensure that the attestation matches the duties.
|
|
|
|
if duty_slot != attestation_data.slot || duty_committee_index != attestation_data.index
|
|
|
|
{
|
|
|
|
crit!(
|
|
|
|
log,
|
|
|
|
"Inconsistent validator duties during signing";
|
|
|
|
"validator" => format!("{:?}", duty.validator_pubkey()),
|
|
|
|
"duty_slot" => duty_slot,
|
|
|
|
"attestation_slot" => attestation_data.slot,
|
|
|
|
"duty_index" => duty_committee_index,
|
|
|
|
"attestation_index" => attestation_data.index,
|
|
|
|
);
|
|
|
|
continue;
|
|
|
|
}
|
2020-05-17 11:16:48 +00:00
|
|
|
|
2020-09-29 03:46:54 +00:00
|
|
|
let mut attestation = Attestation {
|
|
|
|
aggregation_bits: BitList::with_capacity(committee_length as usize).unwrap(),
|
|
|
|
data: attestation_data.clone(),
|
|
|
|
signature: AggregateSignature::infinity(),
|
|
|
|
};
|
2020-05-17 11:16:48 +00:00
|
|
|
|
2020-11-18 23:31:39 +00:00
|
|
|
if self
|
|
|
|
.validator_store
|
2020-09-29 03:46:54 +00:00
|
|
|
.sign_attestation(
|
|
|
|
duty.validator_pubkey(),
|
|
|
|
validator_committee_position,
|
|
|
|
&mut attestation,
|
|
|
|
current_epoch,
|
2020-06-18 09:11:03 +00:00
|
|
|
)
|
2020-11-18 23:31:39 +00:00
|
|
|
.is_some()
|
2020-09-29 03:46:54 +00:00
|
|
|
{
|
2020-11-18 23:31:39 +00:00
|
|
|
attestations.push(attestation);
|
|
|
|
} else {
|
|
|
|
crit!(
|
2020-09-29 03:46:54 +00:00
|
|
|
log,
|
2020-11-18 23:31:39 +00:00
|
|
|
"Failed to sign attestation";
|
|
|
|
"committee_index" => committee_index,
|
2020-09-29 03:46:54 +00:00
|
|
|
"slot" => slot.as_u64(),
|
2020-11-18 23:31:39 +00:00
|
|
|
);
|
|
|
|
continue;
|
2020-09-29 03:46:54 +00:00
|
|
|
}
|
2020-05-17 11:16:48 +00:00
|
|
|
}
|
2020-09-29 03:46:54 +00:00
|
|
|
|
2020-12-18 09:17:03 +00:00
|
|
|
let attestations_slice = attestations.as_slice();
|
2020-11-18 23:31:39 +00:00
|
|
|
match self
|
2020-12-18 09:17:03 +00:00
|
|
|
.beacon_nodes
|
|
|
|
.first_success(RequireSynced::No, |beacon_node| async move {
|
|
|
|
beacon_node
|
|
|
|
.post_beacon_pool_attestations(attestations_slice)
|
|
|
|
.await
|
|
|
|
})
|
2020-11-18 23:31:39 +00:00
|
|
|
.await
|
|
|
|
{
|
|
|
|
Ok(()) => info!(
|
|
|
|
log,
|
|
|
|
"Successfully published attestations";
|
|
|
|
"count" => attestations.len(),
|
|
|
|
"head_block" => ?attestation_data.beacon_block_root,
|
|
|
|
"committee_index" => attestation_data.index,
|
|
|
|
"slot" => attestation_data.slot.as_u64(),
|
|
|
|
"type" => "unaggregated",
|
|
|
|
),
|
|
|
|
Err(e) => error!(
|
|
|
|
log,
|
|
|
|
"Unable to publish attestations";
|
2020-12-18 09:17:03 +00:00
|
|
|
"error" => %e,
|
2020-11-18 23:31:39 +00:00
|
|
|
"committee_index" => attestation_data.index,
|
|
|
|
"slot" => slot.as_u64(),
|
|
|
|
"type" => "unaggregated",
|
|
|
|
),
|
|
|
|
}
|
|
|
|
|
2020-09-29 03:46:54 +00:00
|
|
|
Ok(Some(attestation_data))
|
2020-03-25 10:14:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Performs the second step of the attesting process: downloading an aggregated `Attestation`,
|
|
|
|
/// converting it into a `SignedAggregateAndProof` and returning it to the BN.
|
|
|
|
///
|
2020-06-19 01:18:27 +00:00
|
|
|
/// https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/validator.md#broadcast-aggregate
|
2020-03-25 10:14:05 +00:00
|
|
|
///
|
|
|
|
/// ## Detail
|
|
|
|
///
|
|
|
|
/// The given `validator_duties` should already be filtered to only contain those that match
|
|
|
|
/// `slot` and `committee_index`. Critical errors will be logged if this is not the case.
|
|
|
|
///
|
|
|
|
/// Only one aggregated `Attestation` is downloaded from the BN. It is then cloned and signed
|
|
|
|
/// by each validator and the list of individually-signed `SignedAggregateAndProof` objects is
|
|
|
|
/// returned to the BN.
|
2020-05-17 11:16:48 +00:00
|
|
|
async fn produce_and_publish_aggregates(
|
2020-03-25 10:14:05 +00:00
|
|
|
&self,
|
2020-09-29 03:46:54 +00:00
|
|
|
attestation_data: AttestationData,
|
2020-05-17 11:16:48 +00:00
|
|
|
validator_duties: &[DutyAndProof],
|
|
|
|
) -> Result<(), String> {
|
2020-06-04 11:48:05 +00:00
|
|
|
let log = self.context.log();
|
Initial work towards v0.2.0 (#924)
* 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>
2020-03-17 06:24:44 +00:00
|
|
|
|
2020-12-18 09:17:03 +00:00
|
|
|
let attestation_data_ref = &attestation_data;
|
2020-05-17 11:16:48 +00:00
|
|
|
let aggregated_attestation = self
|
2020-12-18 09:17:03 +00:00
|
|
|
.beacon_nodes
|
|
|
|
.first_success(RequireSynced::No, |beacon_node| async move {
|
|
|
|
beacon_node
|
|
|
|
.get_validator_aggregate_attestation(
|
|
|
|
attestation_data_ref.slot,
|
|
|
|
attestation_data_ref.tree_hash_root(),
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.map_err(|e| format!("Failed to produce an aggregate attestation: {:?}", e))?
|
|
|
|
.ok_or_else(|| format!("No aggregate available for {:?}", attestation_data_ref))
|
|
|
|
.map(|result| result.data)
|
|
|
|
})
|
2020-05-17 11:16:48 +00:00
|
|
|
.await
|
2020-12-18 09:17:03 +00:00
|
|
|
.map_err(|e| e.to_string())?;
|
2020-09-29 03:46:54 +00:00
|
|
|
|
2020-11-09 23:13:56 +00:00
|
|
|
let mut signed_aggregate_and_proofs = Vec::new();
|
|
|
|
|
2020-09-29 03:46:54 +00:00
|
|
|
for duty_and_proof in validator_duties {
|
|
|
|
let selection_proof = if let Some(proof) = duty_and_proof.selection_proof.as_ref() {
|
|
|
|
proof
|
|
|
|
} else {
|
|
|
|
// Do not produce a signed aggregate for validators that are not
|
2020-05-17 11:16:48 +00:00
|
|
|
// subscribed aggregators.
|
2020-09-29 03:46:54 +00:00
|
|
|
continue;
|
|
|
|
};
|
|
|
|
let (duty_slot, duty_committee_index, _, validator_index, _, _) =
|
|
|
|
if let Some(tuple) = duty_and_proof.attestation_duties() {
|
|
|
|
tuple
|
|
|
|
} else {
|
|
|
|
crit!(log, "Missing duties when signing aggregate");
|
|
|
|
continue;
|
|
|
|
};
|
2020-05-17 11:16:48 +00:00
|
|
|
|
2020-09-29 03:46:54 +00:00
|
|
|
let pubkey = &duty_and_proof.duty.validator_pubkey;
|
|
|
|
let slot = attestation_data.slot;
|
|
|
|
let committee_index = attestation_data.index;
|
2020-05-17 11:16:48 +00:00
|
|
|
|
2020-09-29 03:46:54 +00:00
|
|
|
if duty_slot != slot || duty_committee_index != committee_index {
|
|
|
|
crit!(log, "Inconsistent validator duties during signing");
|
|
|
|
continue;
|
|
|
|
}
|
2020-05-17 11:16:48 +00:00
|
|
|
|
2020-11-09 23:13:56 +00:00
|
|
|
if let Some(aggregate) = self.validator_store.produce_signed_aggregate_and_proof(
|
|
|
|
pubkey,
|
|
|
|
validator_index,
|
|
|
|
aggregated_attestation.clone(),
|
|
|
|
selection_proof.clone(),
|
|
|
|
) {
|
|
|
|
signed_aggregate_and_proofs.push(aggregate);
|
2020-09-29 03:46:54 +00:00
|
|
|
} else {
|
|
|
|
crit!(log, "Failed to sign attestation");
|
|
|
|
continue;
|
|
|
|
};
|
2020-11-09 23:13:56 +00:00
|
|
|
}
|
2020-05-17 11:16:48 +00:00
|
|
|
|
2020-11-09 23:13:56 +00:00
|
|
|
if !signed_aggregate_and_proofs.is_empty() {
|
2020-12-18 09:17:03 +00:00
|
|
|
let signed_aggregate_and_proofs_slice = signed_aggregate_and_proofs.as_slice();
|
2020-09-29 03:46:54 +00:00
|
|
|
match self
|
2020-12-18 09:17:03 +00:00
|
|
|
.beacon_nodes
|
|
|
|
.first_success(RequireSynced::No, |beacon_node| async move {
|
|
|
|
beacon_node
|
|
|
|
.post_validator_aggregate_and_proof(signed_aggregate_and_proofs_slice)
|
|
|
|
.await
|
|
|
|
})
|
2020-05-17 11:16:48 +00:00
|
|
|
.await
|
2020-09-29 03:46:54 +00:00
|
|
|
{
|
2020-11-09 23:13:56 +00:00
|
|
|
Ok(()) => {
|
|
|
|
for signed_aggregate_and_proof in signed_aggregate_and_proofs {
|
|
|
|
let attestation = &signed_aggregate_and_proof.message.aggregate;
|
|
|
|
info!(
|
|
|
|
log,
|
|
|
|
"Successfully published attestations";
|
|
|
|
"aggregator" => signed_aggregate_and_proof.message.aggregator_index,
|
|
|
|
"signatures" => attestation.aggregation_bits.num_set_bits(),
|
|
|
|
"head_block" => format!("{:?}", attestation.data.beacon_block_root),
|
|
|
|
"committee_index" => attestation.data.index,
|
|
|
|
"slot" => attestation.data.slot.as_u64(),
|
|
|
|
"type" => "aggregated",
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Err(e) => {
|
|
|
|
for signed_aggregate_and_proof in signed_aggregate_and_proofs {
|
|
|
|
let attestation = &signed_aggregate_and_proof.message.aggregate;
|
|
|
|
crit!(
|
|
|
|
log,
|
|
|
|
"Failed to publish attestation";
|
2020-12-18 09:17:03 +00:00
|
|
|
"error" => %e,
|
2020-11-09 23:13:56 +00:00
|
|
|
"committee_index" => attestation.data.index,
|
|
|
|
"slot" => attestation.data.slot.as_u64(),
|
|
|
|
"type" => "aggregated",
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
2020-09-29 03:46:54 +00:00
|
|
|
}
|
2020-05-17 11:16:48 +00:00
|
|
|
}
|
2020-09-29 03:46:54 +00:00
|
|
|
|
|
|
|
Ok(())
|
2019-11-25 04:48:24 +00:00
|
|
|
}
|
Prune slashing protection DB (#2194)
## Proposed Changes
Prune the slashing protection database so that it doesn't exhibit unbounded growth. Prune by dropping attestations and blocks from more than 512 epochs ago, relying on the guards that prevent signing messages with slots or epochs less than the minimum recorded in the DB.
The pruning process is potentially time consuming, so it's scheduled to run only every 512 epochs, in the last 2/3rds of a slot. This gives it at least 4 seconds to run without impacting other signing, which I think should be sufficient. I've seen it run for several minutes (yikes!) on our Pyrmont nodes, but I suspect that 1) this will only occur on the first run when the database is still huge 2) no other production users will be impacted because they don't have enough validators per node.
Pruning also happens at start-up, as I figured this is a fairly infrequent event, and if a user is experiencing problems with the VC related to pruning, it's nice to be able to trigger it with a quick restart. Users are also conditioned to not mind missing a few attestations during a restart.
We need to include a note in the release notes that users may see the message `timed out waiting for connection` the first time they prune a huge database, but that this is totally fine and to be expected (the VC will miss those attestations in the meantime).
I'm also open to making this opt-in for now, although the sooner we get users doing it, the less painful it will be: prune early, prune often!
2021-02-24 23:51:04 +00:00
|
|
|
|
|
|
|
/// Spawn a blocking task to run the slashing protection pruning process.
|
|
|
|
///
|
|
|
|
/// Start the task at `pruning_instant` to avoid interference with other tasks.
|
|
|
|
fn spawn_slashing_protection_pruning_task(&self, slot: Slot, pruning_instant: Instant) {
|
|
|
|
let attestation_service = self.clone();
|
|
|
|
let executor = self.inner.context.executor.clone();
|
|
|
|
let current_epoch = slot.epoch(E::slots_per_epoch());
|
|
|
|
|
|
|
|
// Wait for `pruning_instant` in a regular task, and then switch to a blocking one.
|
|
|
|
self.inner.context.executor.spawn(
|
|
|
|
async move {
|
|
|
|
sleep_until(pruning_instant).await;
|
|
|
|
|
|
|
|
executor.spawn_blocking(
|
|
|
|
move || {
|
|
|
|
attestation_service
|
|
|
|
.validator_store
|
|
|
|
.prune_slashing_protection_db(current_epoch, false)
|
|
|
|
},
|
|
|
|
"slashing_protection_pruning",
|
|
|
|
)
|
|
|
|
},
|
|
|
|
"slashing_protection_pre_pruning",
|
|
|
|
);
|
|
|
|
}
|
2019-11-25 04:48:24 +00:00
|
|
|
}
|
|
|
|
|
2020-03-25 10:14:05 +00:00
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use super::*;
|
2020-06-04 11:48:05 +00:00
|
|
|
use futures::future::FutureExt;
|
2020-03-25 10:14:05 +00:00
|
|
|
use parking_lot::RwLock;
|
|
|
|
|
2020-11-28 05:30:57 +00:00
|
|
|
/// This test is to ensure that a `tokio_timer::Sleep` with an instant in the past will still
|
2020-03-25 10:14:05 +00:00
|
|
|
/// trigger.
|
2020-05-17 11:16:48 +00:00
|
|
|
#[tokio::test]
|
|
|
|
async fn delay_triggers_when_in_the_past() {
|
2020-03-25 10:14:05 +00:00
|
|
|
let in_the_past = Instant::now() - Duration::from_secs(2);
|
|
|
|
let state_1 = Arc::new(RwLock::new(in_the_past));
|
|
|
|
let state_2 = state_1.clone();
|
|
|
|
|
2020-11-28 05:30:57 +00:00
|
|
|
sleep_until(in_the_past)
|
2020-05-17 11:16:48 +00:00
|
|
|
.map(move |()| *state_1.write() = Instant::now())
|
|
|
|
.await;
|
2020-03-25 10:14:05 +00:00
|
|
|
|
|
|
|
assert!(
|
|
|
|
*state_2.read() > in_the_past,
|
|
|
|
"state should have been updated"
|
|
|
|
);
|
|
|
|
}
|
2019-11-25 04:48:24 +00:00
|
|
|
}
|