2019-06-17 08:07:14 +00:00
|
|
|
mod attestation;
|
|
|
|
mod attestation_id;
|
|
|
|
mod max_cover;
|
2019-06-18 07:55:18 +00:00
|
|
|
mod persistence;
|
|
|
|
|
|
|
|
pub use persistence::PersistedOperationPool;
|
2019-06-17 08:07:14 +00:00
|
|
|
|
2020-01-19 23:33:28 +00:00
|
|
|
use attestation::AttMaxCover;
|
2019-06-17 08:07:14 +00:00
|
|
|
use attestation_id::AttestationId;
|
|
|
|
use max_cover::maximum_cover;
|
2019-03-30 01:26:25 +00:00
|
|
|
use parking_lot::RwLock;
|
2020-06-18 11:06:34 +00:00
|
|
|
use state_processing::per_block_processing::errors::AttestationValidationError;
|
2019-03-06 03:46:12 +00:00
|
|
|
use state_processing::per_block_processing::{
|
2020-06-18 11:06:34 +00:00
|
|
|
get_slashable_indices, get_slashable_indices_modular, verify_attestation_for_block_inclusion,
|
|
|
|
verify_exit, VerifySignatures,
|
2019-03-06 03:46:12 +00:00
|
|
|
};
|
2020-06-18 11:06:34 +00:00
|
|
|
use state_processing::SigVerifiedOp;
|
2019-12-16 23:37:12 +00:00
|
|
|
use std::collections::{hash_map, HashMap, HashSet};
|
2019-05-08 07:07:26 +00:00
|
|
|
use std::marker::PhantomData;
|
2020-06-08 21:08:54 +00:00
|
|
|
use std::ptr;
|
2019-03-06 03:46:12 +00:00
|
|
|
use types::{
|
2020-01-19 23:33:28 +00:00
|
|
|
typenum::Unsigned, Attestation, AttesterSlashing, BeaconState, BeaconStateError, ChainSpec,
|
2020-06-18 11:06:34 +00:00
|
|
|
EthSpec, Fork, ForkVersion, Hash256, ProposerSlashing, RelativeEpoch, SignedVoluntaryExit,
|
|
|
|
Validator,
|
2019-03-06 03:46:12 +00:00
|
|
|
};
|
|
|
|
|
2019-06-26 03:06:08 +00:00
|
|
|
#[derive(Default, Debug)]
|
2019-05-10 04:47:09 +00:00
|
|
|
pub struct OperationPool<T: EthSpec + Default> {
|
2019-03-19 08:15:33 +00:00
|
|
|
/// Map from attestation ID (see below) to vectors of attestations.
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
attestations: RwLock<HashMap<AttestationId, Vec<Attestation<T>>>>,
|
2020-06-18 11:06:34 +00:00
|
|
|
/// Set of attester slashings, and the fork version they were verified against.
|
|
|
|
attester_slashings: RwLock<HashSet<(AttesterSlashing<T>, ForkVersion)>>,
|
2019-03-06 03:46:12 +00:00
|
|
|
/// Map from proposer index to slashing.
|
2019-03-30 01:26:25 +00:00
|
|
|
proposer_slashings: RwLock<HashMap<u64, ProposerSlashing>>,
|
2019-03-06 03:46:12 +00:00
|
|
|
/// Map from exiting validator to their exit data.
|
2020-02-10 23:19:36 +00:00
|
|
|
voluntary_exits: RwLock<HashMap<u64, SignedVoluntaryExit>>,
|
2019-05-08 07:07:26 +00:00
|
|
|
_phantom: PhantomData<T>,
|
2019-03-06 03:46:12 +00:00
|
|
|
}
|
|
|
|
|
2020-01-19 23:33:28 +00:00
|
|
|
#[derive(Debug, PartialEq)]
|
|
|
|
pub enum OpPoolError {
|
|
|
|
GetAttestationsTotalBalanceError(BeaconStateError),
|
|
|
|
}
|
|
|
|
|
2019-05-10 04:47:09 +00:00
|
|
|
impl<T: EthSpec> OperationPool<T> {
|
2019-03-06 03:46:12 +00:00
|
|
|
/// Create a new operation pool.
|
|
|
|
pub fn new() -> Self {
|
|
|
|
Self::default()
|
|
|
|
}
|
|
|
|
|
2019-03-19 08:15:33 +00:00
|
|
|
/// Insert an attestation into the pool, aggregating it with existing attestations if possible.
|
2019-08-14 00:55:24 +00:00
|
|
|
///
|
|
|
|
/// ## Note
|
|
|
|
///
|
|
|
|
/// This function assumes the given `attestation` is valid.
|
2019-03-19 08:15:33 +00:00
|
|
|
pub fn insert_attestation(
|
2019-03-30 01:26:25 +00:00
|
|
|
&self,
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
attestation: Attestation<T>,
|
2020-03-05 06:19:35 +00:00
|
|
|
fork: &Fork,
|
2020-04-01 11:03:03 +00:00
|
|
|
genesis_validators_root: Hash256,
|
2019-03-19 08:15:33 +00:00
|
|
|
spec: &ChainSpec,
|
2019-03-20 05:28:04 +00:00
|
|
|
) -> Result<(), AttestationValidationError> {
|
2020-04-01 11:03:03 +00:00
|
|
|
let id = AttestationId::from_data(&attestation.data, fork, genesis_validators_root, spec);
|
2019-03-19 08:15:33 +00:00
|
|
|
|
2019-03-30 01:26:25 +00:00
|
|
|
// Take a write lock on the attestations map.
|
|
|
|
let mut attestations = self.attestations.write();
|
|
|
|
|
|
|
|
let existing_attestations = match attestations.entry(id) {
|
2019-03-19 08:15:33 +00:00
|
|
|
hash_map::Entry::Vacant(entry) => {
|
|
|
|
entry.insert(vec![attestation]);
|
|
|
|
return Ok(());
|
|
|
|
}
|
|
|
|
hash_map::Entry::Occupied(entry) => entry.into_mut(),
|
|
|
|
};
|
|
|
|
|
|
|
|
let mut aggregated = false;
|
|
|
|
for existing_attestation in existing_attestations.iter_mut() {
|
|
|
|
if existing_attestation.signers_disjoint_from(&attestation) {
|
|
|
|
existing_attestation.aggregate(&attestation);
|
|
|
|
aggregated = true;
|
|
|
|
} else if *existing_attestation == attestation {
|
|
|
|
aggregated = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if !aggregated {
|
|
|
|
existing_attestations.push(attestation);
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2019-03-26 07:29:02 +00:00
|
|
|
/// Total number of attestations in the pool, including attestations for the same data.
|
|
|
|
pub fn num_attestations(&self) -> usize {
|
2019-05-09 03:35:00 +00:00
|
|
|
self.attestations.read().values().map(Vec::len).sum()
|
2019-03-26 07:29:02 +00:00
|
|
|
}
|
|
|
|
|
2019-03-19 08:15:33 +00:00
|
|
|
/// Get a list of attestations for inclusion in a block.
|
2020-01-23 00:35:13 +00:00
|
|
|
///
|
2020-04-20 02:34:37 +00:00
|
|
|
/// The `validity_filter` is a closure that provides extra filtering of the attestations
|
|
|
|
/// before an approximately optimal bundle is constructed. We use it to provide access
|
|
|
|
/// to the fork choice data from the `BeaconChain` struct that doesn't logically belong
|
|
|
|
/// in the operation pool.
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
pub fn get_attestations(
|
|
|
|
&self,
|
|
|
|
state: &BeaconState<T>,
|
2020-04-20 02:34:37 +00:00
|
|
|
validity_filter: impl FnMut(&&Attestation<T>) -> bool,
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
spec: &ChainSpec,
|
2020-01-19 23:33:28 +00:00
|
|
|
) -> Result<Vec<Attestation<T>>, OpPoolError> {
|
2019-03-25 00:56:30 +00:00
|
|
|
// Attestations for the current fork, which may be from the current or previous epoch.
|
2019-05-22 04:41:35 +00:00
|
|
|
let prev_epoch = state.previous_epoch();
|
|
|
|
let current_epoch = state.current_epoch();
|
2020-04-01 11:03:03 +00:00
|
|
|
let prev_domain_bytes = AttestationId::compute_domain_bytes(
|
|
|
|
prev_epoch,
|
|
|
|
&state.fork,
|
|
|
|
state.genesis_validators_root,
|
|
|
|
spec,
|
|
|
|
);
|
|
|
|
let curr_domain_bytes = AttestationId::compute_domain_bytes(
|
|
|
|
current_epoch,
|
|
|
|
&state.fork,
|
|
|
|
state.genesis_validators_root,
|
|
|
|
spec,
|
|
|
|
);
|
2019-06-17 08:07:14 +00:00
|
|
|
let reader = self.attestations.read();
|
2020-01-19 23:33:28 +00:00
|
|
|
let active_indices = state
|
|
|
|
.get_cached_active_validator_indices(RelativeEpoch::Current)
|
|
|
|
.map_err(OpPoolError::GetAttestationsTotalBalanceError)?;
|
|
|
|
let total_active_balance = state
|
|
|
|
.get_total_balance(&active_indices, spec)
|
|
|
|
.map_err(OpPoolError::GetAttestationsTotalBalanceError)?;
|
2019-06-17 08:07:14 +00:00
|
|
|
let valid_attestations = reader
|
2019-03-19 08:15:33 +00:00
|
|
|
.iter()
|
2019-03-25 00:56:30 +00:00
|
|
|
.filter(|(key, _)| {
|
|
|
|
key.domain_bytes_match(&prev_domain_bytes)
|
|
|
|
|| key.domain_bytes_match(&curr_domain_bytes)
|
|
|
|
})
|
2019-03-19 08:15:33 +00:00
|
|
|
.flat_map(|(_, attestations)| attestations)
|
|
|
|
// That are valid...
|
2019-08-14 00:55:24 +00:00
|
|
|
.filter(|attestation| {
|
|
|
|
verify_attestation_for_block_inclusion(
|
|
|
|
state,
|
|
|
|
attestation,
|
2020-01-23 00:35:13 +00:00
|
|
|
VerifySignatures::False,
|
2019-08-29 01:34:25 +00:00
|
|
|
spec,
|
2019-08-14 00:55:24 +00:00
|
|
|
)
|
|
|
|
.is_ok()
|
|
|
|
})
|
2020-04-20 02:34:37 +00:00
|
|
|
.filter(validity_filter)
|
2020-01-19 23:33:28 +00:00
|
|
|
.flat_map(|att| AttMaxCover::new(att, state, total_active_balance, spec));
|
2019-06-17 08:07:14 +00:00
|
|
|
|
2020-01-19 23:33:28 +00:00
|
|
|
Ok(maximum_cover(
|
|
|
|
valid_attestations,
|
|
|
|
T::MaxAttestations::to_usize(),
|
|
|
|
))
|
2019-03-19 08:15:33 +00:00
|
|
|
}
|
|
|
|
|
2019-03-19 23:47:19 +00:00
|
|
|
/// Remove attestations which are too old to be included in a block.
|
2019-06-03 05:25:06 +00:00
|
|
|
pub fn prune_attestations(&self, finalized_state: &BeaconState<T>) {
|
|
|
|
// We know we can include an attestation if:
|
|
|
|
// state.slot <= attestation_slot + SLOTS_PER_EPOCH
|
|
|
|
// We approximate this check using the attestation's epoch, to avoid computing
|
|
|
|
// the slot or relying on the committee cache of the finalized state.
|
2019-03-30 01:26:25 +00:00
|
|
|
self.attestations.write().retain(|_, attestations| {
|
2019-03-19 23:47:19 +00:00
|
|
|
// All the attestations in this bucket have the same data, so we only need to
|
|
|
|
// check the first one.
|
|
|
|
attestations.first().map_or(false, |att| {
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
finalized_state.current_epoch() <= att.data.target.epoch + 1
|
2019-03-19 23:47:19 +00:00
|
|
|
})
|
|
|
|
});
|
2019-03-19 08:15:33 +00:00
|
|
|
}
|
|
|
|
|
2019-03-06 03:46:12 +00:00
|
|
|
/// Insert a proposer slashing into the pool.
|
|
|
|
pub fn insert_proposer_slashing(
|
2019-03-30 01:26:25 +00:00
|
|
|
&self,
|
2020-06-18 11:06:34 +00:00
|
|
|
verified_proposer_slashing: SigVerifiedOp<ProposerSlashing>,
|
|
|
|
) {
|
|
|
|
let slashing = verified_proposer_slashing.into_inner();
|
2019-03-06 03:46:12 +00:00
|
|
|
self.proposer_slashings
|
2019-03-30 01:26:25 +00:00
|
|
|
.write()
|
2020-04-01 11:03:03 +00:00
|
|
|
.insert(slashing.signed_header_1.message.proposer_index, slashing);
|
2019-03-25 05:58:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Insert an attester slashing into the pool.
|
|
|
|
pub fn insert_attester_slashing(
|
2019-03-30 01:26:25 +00:00
|
|
|
&self,
|
2020-06-18 11:06:34 +00:00
|
|
|
verified_slashing: SigVerifiedOp<AttesterSlashing<T>>,
|
|
|
|
fork: Fork,
|
|
|
|
) {
|
|
|
|
self.attester_slashings
|
|
|
|
.write()
|
|
|
|
.insert((verified_slashing.into_inner(), fork.current_version));
|
2019-03-25 05:58:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Get proposer and attester slashings for inclusion in a block.
|
|
|
|
///
|
|
|
|
/// This function computes both types of slashings together, because
|
|
|
|
/// attester slashings may be invalidated by proposer slashings included
|
|
|
|
/// earlier in the block.
|
|
|
|
pub fn get_slashings(
|
2019-03-06 03:46:12 +00:00
|
|
|
&self,
|
2019-05-08 07:07:26 +00:00
|
|
|
state: &BeaconState<T>,
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
) -> (Vec<ProposerSlashing>, Vec<AttesterSlashing<T>>) {
|
2019-03-25 05:58:20 +00:00
|
|
|
let proposer_slashings = filter_limit_operations(
|
2019-03-30 01:26:25 +00:00
|
|
|
self.proposer_slashings.read().values(),
|
2019-03-06 03:46:12 +00:00
|
|
|
|slashing| {
|
|
|
|
state
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
.validators
|
2020-04-01 11:03:03 +00:00
|
|
|
.get(slashing.signed_header_1.message.proposer_index as usize)
|
2019-03-06 03:46:12 +00:00
|
|
|
.map_or(false, |validator| !validator.slashed)
|
|
|
|
},
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
T::MaxProposerSlashings::to_usize(),
|
2019-03-25 05:58:20 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
// Set of validators to be slashed, so we don't attempt to construct invalid attester
|
|
|
|
// slashings.
|
|
|
|
let mut to_be_slashed = proposer_slashings
|
|
|
|
.iter()
|
2020-04-01 11:03:03 +00:00
|
|
|
.map(|s| s.signed_header_1.message.proposer_index)
|
2019-03-25 05:58:20 +00:00
|
|
|
.collect::<HashSet<_>>();
|
|
|
|
|
2020-01-15 01:41:12 +00:00
|
|
|
let epoch = state.current_epoch();
|
2019-03-25 05:58:20 +00:00
|
|
|
let attester_slashings = self
|
|
|
|
.attester_slashings
|
2019-03-30 01:26:25 +00:00
|
|
|
.read()
|
2019-03-25 05:58:20 +00:00
|
|
|
.iter()
|
2020-06-18 11:06:34 +00:00
|
|
|
.filter(|(slashing, fork)| {
|
|
|
|
if *fork != state.fork.previous_version && *fork != state.fork.current_version {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2019-03-25 05:58:20 +00:00
|
|
|
// Take all slashings that will slash 1 or more validators.
|
2019-06-03 05:25:06 +00:00
|
|
|
let slashed_validators =
|
|
|
|
get_slashable_indices_modular(state, slashing, |index, validator| {
|
2020-01-15 01:41:12 +00:00
|
|
|
validator.is_slashable_at(epoch) && !to_be_slashed.contains(&index)
|
2019-06-03 05:25:06 +00:00
|
|
|
});
|
2019-03-25 05:58:20 +00:00
|
|
|
|
|
|
|
// Extend the `to_be_slashed` set so subsequent iterations don't try to include
|
|
|
|
// useless slashings.
|
|
|
|
if let Ok(validators) = slashed_validators {
|
|
|
|
to_be_slashed.extend(validators);
|
|
|
|
true
|
|
|
|
} else {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
})
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
.take(T::MaxAttesterSlashings::to_usize())
|
2020-06-18 11:06:34 +00:00
|
|
|
.map(|(slashing, _)| slashing.clone())
|
2019-03-25 05:58:20 +00:00
|
|
|
.collect();
|
|
|
|
|
|
|
|
(proposer_slashings, attester_slashings)
|
2019-03-06 03:46:12 +00:00
|
|
|
}
|
|
|
|
|
2019-03-25 05:58:20 +00:00
|
|
|
/// Prune proposer slashings for all slashed or withdrawn validators.
|
2019-06-03 05:25:06 +00:00
|
|
|
pub fn prune_proposer_slashings(&self, finalized_state: &BeaconState<T>) {
|
2019-03-20 02:06:06 +00:00
|
|
|
prune_validator_hash_map(
|
2019-03-30 01:26:25 +00:00
|
|
|
&mut self.proposer_slashings.write(),
|
2019-03-20 02:06:06 +00:00
|
|
|
|validator| {
|
2019-05-22 04:41:35 +00:00
|
|
|
validator.slashed || validator.is_withdrawable_at(finalized_state.current_epoch())
|
2019-03-20 02:06:06 +00:00
|
|
|
},
|
|
|
|
finalized_state,
|
|
|
|
);
|
2019-03-06 03:46:12 +00:00
|
|
|
}
|
|
|
|
|
2019-03-25 05:58:20 +00:00
|
|
|
/// Prune attester slashings for all slashed or withdrawn validators, or attestations on another
|
|
|
|
/// fork.
|
2020-06-18 11:06:34 +00:00
|
|
|
pub fn prune_attester_slashings(&self, finalized_state: &BeaconState<T>, head_fork: Fork) {
|
|
|
|
self.attester_slashings
|
|
|
|
.write()
|
|
|
|
.retain(|(slashing, fork_version)| {
|
|
|
|
// Any slashings for forks older than the finalized state's previous fork can be
|
|
|
|
// discarded. We allow the head_fork's current version too in case a fork has
|
|
|
|
// occurred between the finalized state and the head.
|
|
|
|
let fork_ok = *fork_version == finalized_state.fork.previous_version
|
|
|
|
|| *fork_version == finalized_state.fork.current_version
|
|
|
|
|| *fork_version == head_fork.current_version;
|
|
|
|
// Slashings that don't slash any validators can also be dropped.
|
|
|
|
let slashing_ok = get_slashable_indices(finalized_state, slashing).is_ok();
|
|
|
|
fork_ok && slashing_ok
|
|
|
|
});
|
2019-03-25 05:58:20 +00:00
|
|
|
}
|
2019-03-06 03:46:12 +00:00
|
|
|
|
2020-02-04 01:43:04 +00:00
|
|
|
/// Total number of attester slashings in the pool.
|
|
|
|
pub fn num_attester_slashings(&self) -> usize {
|
|
|
|
self.attester_slashings.read().len()
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Total number of proposer slashings in the pool.
|
|
|
|
pub fn num_proposer_slashings(&self) -> usize {
|
|
|
|
self.proposer_slashings.read().len()
|
|
|
|
}
|
|
|
|
|
2020-06-18 11:06:34 +00:00
|
|
|
/// Insert a voluntary exit that has previously been checked elsewhere.
|
|
|
|
pub fn insert_voluntary_exit(&self, verified_exit: SigVerifiedOp<SignedVoluntaryExit>) {
|
|
|
|
let exit = verified_exit.into_inner();
|
2019-03-30 01:26:25 +00:00
|
|
|
self.voluntary_exits
|
|
|
|
.write()
|
2020-02-10 23:19:36 +00:00
|
|
|
.insert(exit.message.validator_index, exit);
|
2019-03-06 03:46:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Get a list of voluntary exits for inclusion in a block.
|
2019-05-08 07:07:26 +00:00
|
|
|
pub fn get_voluntary_exits(
|
|
|
|
&self,
|
|
|
|
state: &BeaconState<T>,
|
|
|
|
spec: &ChainSpec,
|
2020-02-10 23:19:36 +00:00
|
|
|
) -> Vec<SignedVoluntaryExit> {
|
2019-03-06 03:46:12 +00:00
|
|
|
filter_limit_operations(
|
2019-03-30 01:26:25 +00:00
|
|
|
self.voluntary_exits.read().values(),
|
2019-08-29 01:34:25 +00:00
|
|
|
|exit| verify_exit(state, exit, VerifySignatures::False, spec).is_ok(),
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
T::MaxVoluntaryExits::to_usize(),
|
2019-03-06 03:46:12 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Prune if validator has already exited at the last finalized state.
|
2019-06-03 05:25:06 +00:00
|
|
|
pub fn prune_voluntary_exits(&self, finalized_state: &BeaconState<T>) {
|
2019-03-20 02:06:06 +00:00
|
|
|
prune_validator_hash_map(
|
2019-03-30 01:26:25 +00:00
|
|
|
&mut self.voluntary_exits.write(),
|
2019-05-22 04:41:35 +00:00
|
|
|
|validator| validator.is_exited_at(finalized_state.current_epoch()),
|
2019-03-20 02:06:06 +00:00
|
|
|
finalized_state,
|
|
|
|
);
|
2019-03-06 03:46:12 +00:00
|
|
|
}
|
|
|
|
|
2020-06-18 11:06:34 +00:00
|
|
|
/// Prune all types of transactions given the latest finalized state and head fork.
|
|
|
|
pub fn prune_all(&self, finalized_state: &BeaconState<T>, head_fork: Fork) {
|
2019-06-03 05:25:06 +00:00
|
|
|
self.prune_attestations(finalized_state);
|
|
|
|
self.prune_proposer_slashings(finalized_state);
|
2020-06-18 11:06:34 +00:00
|
|
|
self.prune_attester_slashings(finalized_state, head_fork);
|
2019-06-03 05:25:06 +00:00
|
|
|
self.prune_voluntary_exits(finalized_state);
|
2019-03-19 23:14:31 +00:00
|
|
|
}
|
2020-02-04 01:43:04 +00:00
|
|
|
|
|
|
|
/// Total number of voluntary exits in the pool.
|
|
|
|
pub fn num_voluntary_exits(&self) -> usize {
|
|
|
|
self.voluntary_exits.read().len()
|
|
|
|
}
|
2020-09-29 03:46:54 +00:00
|
|
|
|
|
|
|
/// Returns all known `Attestation` objects.
|
|
|
|
///
|
|
|
|
/// This method may return objects that are invalid for block inclusion.
|
|
|
|
pub fn get_all_attestations(&self) -> Vec<Attestation<T>> {
|
|
|
|
self.attestations
|
|
|
|
.read()
|
|
|
|
.iter()
|
|
|
|
.map(|(_, attns)| attns.iter().cloned())
|
|
|
|
.flatten()
|
|
|
|
.collect()
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns all known `AttesterSlashing` objects.
|
|
|
|
///
|
|
|
|
/// This method may return objects that are invalid for block inclusion.
|
|
|
|
pub fn get_all_attester_slashings(&self) -> Vec<AttesterSlashing<T>> {
|
|
|
|
self.attester_slashings
|
|
|
|
.read()
|
|
|
|
.iter()
|
|
|
|
.map(|(slashing, _)| slashing.clone())
|
|
|
|
.collect()
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns all known `ProposerSlashing` objects.
|
|
|
|
///
|
|
|
|
/// This method may return objects that are invalid for block inclusion.
|
|
|
|
pub fn get_all_proposer_slashings(&self) -> Vec<ProposerSlashing> {
|
|
|
|
self.proposer_slashings
|
|
|
|
.read()
|
|
|
|
.iter()
|
|
|
|
.map(|(_, slashing)| slashing.clone())
|
|
|
|
.collect()
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns all known `SignedVoluntaryExit` objects.
|
|
|
|
///
|
|
|
|
/// This method may return objects that are invalid for block inclusion.
|
|
|
|
pub fn get_all_voluntary_exits(&self) -> Vec<SignedVoluntaryExit> {
|
|
|
|
self.voluntary_exits
|
|
|
|
.read()
|
|
|
|
.iter()
|
|
|
|
.map(|(_, exit)| exit.clone())
|
|
|
|
.collect()
|
|
|
|
}
|
2019-03-06 03:46:12 +00:00
|
|
|
}
|
|
|
|
|
2019-03-25 05:58:20 +00:00
|
|
|
/// Filter up to a maximum number of operations out of an iterator.
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
fn filter_limit_operations<'a, T: 'a, I, F>(operations: I, filter: F, limit: usize) -> Vec<T>
|
2019-03-06 03:46:12 +00:00
|
|
|
where
|
|
|
|
I: IntoIterator<Item = &'a T>,
|
|
|
|
F: Fn(&T) -> bool,
|
|
|
|
T: Clone,
|
|
|
|
{
|
|
|
|
operations
|
|
|
|
.into_iter()
|
|
|
|
.filter(|x| filter(*x))
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
.take(limit)
|
2019-03-06 03:46:12 +00:00
|
|
|
.cloned()
|
|
|
|
.collect()
|
|
|
|
}
|
|
|
|
|
2019-03-20 02:06:06 +00:00
|
|
|
/// Remove all entries from the given hash map for which `prune_if` returns true.
|
|
|
|
///
|
|
|
|
/// The keys in the map should be validator indices, which will be looked up
|
|
|
|
/// in the state's validator registry and then passed to `prune_if`.
|
|
|
|
/// Entries for unknown validators will be kept.
|
2019-05-13 04:44:43 +00:00
|
|
|
fn prune_validator_hash_map<T, F, E: EthSpec>(
|
2019-03-20 02:06:06 +00:00
|
|
|
map: &mut HashMap<u64, T>,
|
|
|
|
prune_if: F,
|
2019-05-13 04:44:43 +00:00
|
|
|
finalized_state: &BeaconState<E>,
|
2019-03-20 02:06:06 +00:00
|
|
|
) where
|
|
|
|
F: Fn(&Validator) -> bool,
|
|
|
|
{
|
|
|
|
map.retain(|&validator_index, _| {
|
|
|
|
finalized_state
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
.validators
|
2019-03-20 02:06:06 +00:00
|
|
|
.get(validator_index as usize)
|
|
|
|
.map_or(true, |validator| !prune_if(validator))
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-06-26 03:06:08 +00:00
|
|
|
/// Compare two operation pools.
|
|
|
|
impl<T: EthSpec + Default> PartialEq for OperationPool<T> {
|
|
|
|
fn eq(&self, other: &Self) -> bool {
|
2020-06-08 21:08:54 +00:00
|
|
|
if ptr::eq(self, other) {
|
|
|
|
return true;
|
|
|
|
}
|
2019-06-26 03:06:08 +00:00
|
|
|
*self.attestations.read() == *other.attestations.read()
|
|
|
|
&& *self.attester_slashings.read() == *other.attester_slashings.read()
|
|
|
|
&& *self.proposer_slashings.read() == *other.proposer_slashings.read()
|
|
|
|
&& *self.voluntary_exits.read() == *other.voluntary_exits.read()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
// TODO: more tests
|
|
|
|
#[cfg(all(test, not(debug_assertions)))]
|
|
|
|
mod release_tests {
|
2020-01-19 23:33:28 +00:00
|
|
|
use super::attestation::earliest_attestation_validators;
|
2019-03-06 03:46:12 +00:00
|
|
|
use super::*;
|
2020-06-18 11:06:34 +00:00
|
|
|
use state_processing::{
|
|
|
|
common::{get_attesting_indices, get_base_reward},
|
|
|
|
VerifyOperation,
|
|
|
|
};
|
2020-01-19 23:33:28 +00:00
|
|
|
use std::collections::BTreeSet;
|
2020-04-06 04:13:19 +00:00
|
|
|
use std::iter::FromIterator;
|
2019-03-26 07:29:02 +00:00
|
|
|
use types::test_utils::*;
|
2019-03-20 04:57:41 +00:00
|
|
|
use types::*;
|
2019-03-06 03:46:12 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
/// Create a signed attestation for use in tests.
|
|
|
|
/// Signed by all validators in `committee[signing_range]` and `committee[extra_signer]`.
|
|
|
|
fn signed_attestation<R: std::slice::SliceIndex<[usize], Output = [usize]>, E: EthSpec>(
|
|
|
|
committee: &[usize],
|
|
|
|
index: u64,
|
|
|
|
keypairs: &[Keypair],
|
|
|
|
signing_range: R,
|
|
|
|
slot: Slot,
|
|
|
|
state: &BeaconState<E>,
|
|
|
|
spec: &ChainSpec,
|
|
|
|
extra_signer: Option<usize>,
|
|
|
|
) -> Attestation<E> {
|
|
|
|
let mut builder = TestingAttestationBuilder::new(
|
|
|
|
AttestationTestTask::Valid,
|
|
|
|
state,
|
|
|
|
committee,
|
|
|
|
slot,
|
|
|
|
index,
|
|
|
|
spec,
|
Update to frozen spec ❄️ (v0.8.1) (#444)
* types: first updates for v0.8
* state_processing: epoch processing v0.8.0
* state_processing: block processing v0.8.0
* tree_hash_derive: support generics in SignedRoot
* types v0.8: update to use ssz_types
* state_processing v0.8: use ssz_types
* ssz_types: add bitwise methods and from_elem
* types: fix v0.8 FIXMEs
* ssz_types: add bitfield shift_up
* ssz_types: iterators and DerefMut for VariableList
* types,state_processing: use VariableList
* ssz_types: fix BitVector Decode impl
Fixed a typo in the implementation of ssz::Decode for BitVector, which caused it
to be considered variable length!
* types: fix test modules for v0.8 update
* types: remove slow type-level arithmetic
* state_processing: fix tests for v0.8
* op_pool: update for v0.8
* ssz_types: Bitfield difference length-independent
Allow computing the difference of two bitfields of different lengths.
* Implement compact committee support
* epoch_processing: committee & active index roots
* state_processing: genesis state builder v0.8
* state_processing: implement v0.8.1
* Further improve tree_hash
* Strip examples, tests from cached_tree_hash
* Update TreeHash, un-impl CachedTreeHash
* Update bitfield TreeHash, un-impl CachedTreeHash
* Update FixedLenVec TreeHash, unimpl CachedTreeHash
* Update update tree_hash_derive for new TreeHash
* Fix TreeHash, un-impl CachedTreeHash for ssz_types
* Remove fixed_len_vec, ssz benches
SSZ benches relied upon fixed_len_vec -- it is easier to just delete
them and rebuild them later (when necessary)
* Remove boolean_bitfield crate
* Fix fake_crypto BLS compile errors
* Update ef_tests for new v.8 type params
* Update ef_tests submodule to v0.8.1 tag
* Make fixes to support parsing ssz ef_tests
* `compact_committee...` to `compact_committees...`
* Derive more traits for `CompactCommittee`
* Flip bitfield byte-endianness
* Fix tree_hash for bitfields
* Modify CLI output for ef_tests
* Bump ssz crate version
* Update ssz_types doc comment
* Del cached tree hash tests from ssz_static tests
* Tidy SSZ dependencies
* Rename ssz_types crate to eth2_ssz_types
* validator_client: update for v0.8
* ssz_types: update union/difference for bit order swap
* beacon_node: update for v0.8, EthSpec
* types: disable cached tree hash, update min spec
* state_processing: fix slot bug in committee update
* tests: temporarily disable fork choice harness test
See #447
* committee cache: prevent out-of-bounds access
In the case where we tried to access the committee of a shard that didn't have a committee in the
current epoch, we were accessing elements beyond the end of the shuffling vector and panicking! This
commit adds a check to make the failure safe and explicit.
* fix bug in get_indexed_attestation and simplify
There was a bug in our implementation of get_indexed_attestation whereby
incorrect "committee indices" were used to index into the custody bitfield. The
bug was only observable in the case where some bits of the custody bitfield were
set to 1. The implementation has been simplified to remove the bug, and a test
added.
* state_proc: workaround for compact committees bug
https://github.com/ethereum/eth2.0-specs/issues/1315
* v0.8: updates to make the EF tests pass
* Remove redundant max operation checks.
* Always supply both messages when checking attestation signatures -- allowing
verification of an attestation with no signatures.
* Swap the order of the fork and domain constant in `get_domain`, to match
the spec.
* rustfmt
* ef_tests: add new epoch processing tests
* Integrate v0.8 into master (compiles)
* Remove unused crates, fix clippy lints
* Replace v0.6.3 tags w/ v0.8.1
* Remove old comment
* Ensure lmd ghost tests only run in release
* Update readme
2019-07-30 02:44:51 +00:00
|
|
|
);
|
2019-12-16 23:37:12 +00:00
|
|
|
let signers = &committee[signing_range];
|
|
|
|
let committee_keys = signers.iter().map(|&i| &keypairs[i].sk).collect::<Vec<_>>();
|
|
|
|
builder.sign(
|
|
|
|
AttestationTestTask::Valid,
|
|
|
|
signers,
|
|
|
|
&committee_keys,
|
|
|
|
&state.fork,
|
2020-04-01 11:03:03 +00:00
|
|
|
state.genesis_validators_root,
|
2019-12-16 23:37:12 +00:00
|
|
|
spec,
|
2019-03-20 01:44:37 +00:00
|
|
|
);
|
2019-12-16 23:37:12 +00:00
|
|
|
extra_signer.map(|c_idx| {
|
|
|
|
let validator_index = committee[c_idx];
|
|
|
|
builder.sign(
|
|
|
|
AttestationTestTask::Valid,
|
|
|
|
&[validator_index],
|
|
|
|
&[&keypairs[validator_index].sk],
|
|
|
|
&state.fork,
|
2020-04-01 11:03:03 +00:00
|
|
|
state.genesis_validators_root,
|
2019-12-16 23:37:12 +00:00
|
|
|
spec,
|
|
|
|
)
|
|
|
|
});
|
|
|
|
builder.build()
|
2019-03-06 03:46:12 +00:00
|
|
|
}
|
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
/// Test state for attestation-related tests.
|
|
|
|
fn attestation_test_state<E: EthSpec>(
|
|
|
|
num_committees: usize,
|
|
|
|
) -> (BeaconState<E>, Vec<Keypair>, ChainSpec) {
|
|
|
|
let spec = E::default_spec();
|
|
|
|
|
|
|
|
let num_validators =
|
|
|
|
num_committees * E::slots_per_epoch() as usize * spec.target_committee_size;
|
|
|
|
let mut state_builder =
|
2020-05-19 01:23:08 +00:00
|
|
|
TestingBeaconStateBuilder::from_deterministic_keypairs(num_validators, &spec);
|
2019-12-16 23:37:12 +00:00
|
|
|
let slot_offset = 1000 * E::slots_per_epoch() + E::slots_per_epoch() / 2;
|
|
|
|
let slot = spec.genesis_slot + slot_offset;
|
|
|
|
state_builder.teleport_to_slot(slot);
|
|
|
|
state_builder.build_caches(&spec).unwrap();
|
|
|
|
let (state, keypairs) = state_builder.build();
|
2020-04-30 05:21:43 +00:00
|
|
|
(state, keypairs, spec)
|
2019-03-06 03:46:12 +00:00
|
|
|
}
|
|
|
|
|
2019-03-20 01:44:37 +00:00
|
|
|
#[test]
|
2019-12-16 23:37:12 +00:00
|
|
|
fn test_earliest_attestation() {
|
|
|
|
let (ref mut state, ref keypairs, ref spec) = attestation_test_state::<MainnetEthSpec>(1);
|
|
|
|
let slot = state.slot - 1;
|
|
|
|
let committees = state
|
|
|
|
.get_beacon_committees_at_slot(slot)
|
|
|
|
.unwrap()
|
|
|
|
.into_iter()
|
|
|
|
.map(BeaconCommittee::into_owned)
|
|
|
|
.collect::<Vec<_>>();
|
2019-03-20 04:57:41 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
for bc in committees {
|
|
|
|
let att1 = signed_attestation(
|
|
|
|
&bc.committee,
|
|
|
|
bc.index,
|
|
|
|
keypairs,
|
|
|
|
..2,
|
2019-11-12 05:09:33 +00:00
|
|
|
slot,
|
2019-12-16 23:37:12 +00:00
|
|
|
state,
|
2019-11-12 05:09:33 +00:00
|
|
|
spec,
|
2019-12-16 23:37:12 +00:00
|
|
|
None,
|
2019-11-12 05:09:33 +00:00
|
|
|
);
|
2019-12-16 23:37:12 +00:00
|
|
|
let att2 = signed_attestation(
|
|
|
|
&bc.committee,
|
|
|
|
bc.index,
|
|
|
|
keypairs,
|
|
|
|
..,
|
|
|
|
slot,
|
|
|
|
state,
|
2019-11-12 05:09:33 +00:00
|
|
|
spec,
|
2019-12-16 23:37:12 +00:00
|
|
|
None,
|
2019-11-12 05:09:33 +00:00
|
|
|
);
|
2019-05-09 23:45:28 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
assert_eq!(
|
|
|
|
att1.aggregation_bits.num_set_bits(),
|
|
|
|
earliest_attestation_validators(&att1, state).num_set_bits()
|
|
|
|
);
|
|
|
|
state
|
|
|
|
.current_epoch_attestations
|
|
|
|
.push(PendingAttestation {
|
|
|
|
aggregation_bits: att1.aggregation_bits.clone(),
|
|
|
|
data: att1.data.clone(),
|
|
|
|
inclusion_delay: 0,
|
|
|
|
proposer_index: 0,
|
|
|
|
})
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
bc.committee.len() - 2,
|
|
|
|
earliest_attestation_validators(&att2, state).num_set_bits()
|
2019-03-26 07:29:02 +00:00
|
|
|
);
|
2019-05-09 08:56:41 +00:00
|
|
|
}
|
2019-12-16 23:37:12 +00:00
|
|
|
}
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
/// End-to-end test of basic attestation handling.
|
|
|
|
#[test]
|
|
|
|
fn attestation_aggregation_insert_get_prune() {
|
|
|
|
let (ref mut state, ref keypairs, ref spec) = attestation_test_state::<MainnetEthSpec>(1);
|
|
|
|
|
|
|
|
let op_pool = OperationPool::new();
|
|
|
|
|
|
|
|
let slot = state.slot - 1;
|
|
|
|
let committees = state
|
|
|
|
.get_beacon_committees_at_slot(slot)
|
|
|
|
.unwrap()
|
|
|
|
.into_iter()
|
|
|
|
.map(BeaconCommittee::into_owned)
|
|
|
|
.collect::<Vec<_>>();
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
committees.len(),
|
|
|
|
1,
|
|
|
|
"we expect just one committee with this many validators"
|
|
|
|
);
|
|
|
|
|
|
|
|
for bc in &committees {
|
|
|
|
let step_size = 2;
|
|
|
|
for i in (0..bc.committee.len()).step_by(step_size) {
|
|
|
|
let att = signed_attestation(
|
2019-11-21 00:47:30 +00:00
|
|
|
&bc.committee,
|
|
|
|
bc.index,
|
2019-06-03 05:25:06 +00:00
|
|
|
keypairs,
|
2019-12-16 23:37:12 +00:00
|
|
|
i..i + step_size,
|
2019-06-03 05:25:06 +00:00
|
|
|
slot,
|
|
|
|
state,
|
|
|
|
spec,
|
|
|
|
None,
|
|
|
|
);
|
2020-04-01 11:03:03 +00:00
|
|
|
op_pool
|
|
|
|
.insert_attestation(att, &state.fork, state.genesis_validators_root, spec)
|
|
|
|
.unwrap();
|
2019-03-26 07:29:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
assert_eq!(op_pool.attestations.read().len(), committees.len());
|
|
|
|
assert_eq!(op_pool.num_attestations(), committees.len());
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
// Before the min attestation inclusion delay, get_attestations shouldn't return anything.
|
|
|
|
state.slot -= 1;
|
2020-01-19 23:33:28 +00:00
|
|
|
assert_eq!(
|
|
|
|
op_pool
|
2020-04-20 02:34:37 +00:00
|
|
|
.get_attestations(state, |_| true, spec)
|
2020-01-19 23:33:28 +00:00
|
|
|
.expect("should have attestations")
|
|
|
|
.len(),
|
|
|
|
0
|
|
|
|
);
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
// Then once the delay has elapsed, we should get a single aggregated attestation.
|
|
|
|
state.slot += spec.min_attestation_inclusion_delay;
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2020-01-19 23:33:28 +00:00
|
|
|
let block_attestations = op_pool
|
2020-04-20 02:34:37 +00:00
|
|
|
.get_attestations(state, |_| true, spec)
|
2020-01-19 23:33:28 +00:00
|
|
|
.expect("Should have block attestations");
|
2019-12-16 23:37:12 +00:00
|
|
|
assert_eq!(block_attestations.len(), committees.len());
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
let agg_att = &block_attestations[0];
|
|
|
|
assert_eq!(
|
|
|
|
agg_att.aggregation_bits.num_set_bits(),
|
|
|
|
spec.target_committee_size as usize
|
|
|
|
);
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
// Prune attestations shouldn't do anything at this point.
|
|
|
|
op_pool.prune_attestations(state);
|
|
|
|
assert_eq!(op_pool.num_attestations(), committees.len());
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
// But once we advance to more than an epoch after the attestation, it should prune it
|
|
|
|
// out of existence.
|
|
|
|
state.slot += 2 * MainnetEthSpec::slots_per_epoch();
|
|
|
|
op_pool.prune_attestations(state);
|
|
|
|
assert_eq!(op_pool.num_attestations(), 0);
|
|
|
|
}
|
2019-05-09 08:56:41 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
/// Adding an attestation already in the pool should not increase the size of the pool.
|
|
|
|
#[test]
|
|
|
|
fn attestation_duplicate() {
|
|
|
|
let (ref mut state, ref keypairs, ref spec) = attestation_test_state::<MainnetEthSpec>(1);
|
2019-05-09 08:56:41 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
let op_pool = OperationPool::new();
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
let slot = state.slot - 1;
|
|
|
|
let committees = state
|
|
|
|
.get_beacon_committees_at_slot(slot)
|
|
|
|
.unwrap()
|
|
|
|
.into_iter()
|
|
|
|
.map(BeaconCommittee::into_owned)
|
|
|
|
.collect::<Vec<_>>();
|
2019-05-09 08:56:41 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
for bc in &committees {
|
|
|
|
let att = signed_attestation(
|
|
|
|
&bc.committee,
|
|
|
|
bc.index,
|
|
|
|
keypairs,
|
|
|
|
..,
|
|
|
|
slot,
|
|
|
|
state,
|
|
|
|
spec,
|
|
|
|
None,
|
|
|
|
);
|
|
|
|
op_pool
|
2020-04-01 11:03:03 +00:00
|
|
|
.insert_attestation(
|
|
|
|
att.clone(),
|
|
|
|
&state.fork,
|
|
|
|
state.genesis_validators_root,
|
|
|
|
spec,
|
|
|
|
)
|
|
|
|
.unwrap();
|
|
|
|
op_pool
|
|
|
|
.insert_attestation(att, &state.fork, state.genesis_validators_root, spec)
|
2019-12-16 23:37:12 +00:00
|
|
|
.unwrap();
|
2019-03-26 07:29:02 +00:00
|
|
|
}
|
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
assert_eq!(op_pool.num_attestations(), committees.len());
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Adding lots of attestations that only intersect pairwise should lead to two aggregate
|
|
|
|
/// attestations.
|
|
|
|
#[test]
|
|
|
|
fn attestation_pairwise_overlapping() {
|
|
|
|
let (ref mut state, ref keypairs, ref spec) = attestation_test_state::<MainnetEthSpec>(1);
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
let op_pool = OperationPool::new();
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
let slot = state.slot - 1;
|
|
|
|
let committees = state
|
|
|
|
.get_beacon_committees_at_slot(slot)
|
|
|
|
.unwrap()
|
|
|
|
.into_iter()
|
|
|
|
.map(BeaconCommittee::into_owned)
|
|
|
|
.collect::<Vec<_>>();
|
2019-06-03 05:25:06 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
let step_size = 2;
|
|
|
|
for bc in &committees {
|
|
|
|
// Create attestations that overlap on `step_size` validators, like:
|
|
|
|
// {0,1,2,3}, {2,3,4,5}, {4,5,6,7}, ...
|
|
|
|
for i in (0..bc.committee.len() - step_size).step_by(step_size) {
|
2019-06-03 05:25:06 +00:00
|
|
|
let att = signed_attestation(
|
2019-11-21 00:47:30 +00:00
|
|
|
&bc.committee,
|
|
|
|
bc.index,
|
2019-06-03 05:25:06 +00:00
|
|
|
keypairs,
|
2019-12-16 23:37:12 +00:00
|
|
|
i..i + 2 * step_size,
|
2019-06-03 05:25:06 +00:00
|
|
|
slot,
|
|
|
|
state,
|
|
|
|
spec,
|
|
|
|
None,
|
|
|
|
);
|
2020-04-01 11:03:03 +00:00
|
|
|
op_pool
|
|
|
|
.insert_attestation(att, &state.fork, state.genesis_validators_root, spec)
|
|
|
|
.unwrap();
|
2019-03-26 07:29:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
// The attestations should get aggregated into two attestations that comprise all
|
|
|
|
// validators.
|
|
|
|
assert_eq!(op_pool.attestations.read().len(), committees.len());
|
|
|
|
assert_eq!(op_pool.num_attestations(), 2 * committees.len());
|
|
|
|
}
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
/// Create a bunch of attestations signed by a small number of validators, and another
|
|
|
|
/// bunch signed by a larger number, such that there are at least `max_attestations`
|
|
|
|
/// signed by the larger number. Then, check that `get_attestations` only returns the
|
|
|
|
/// high-quality attestations. To ensure that no aggregation occurs, ALL attestations
|
|
|
|
/// are also signed by the 0th member of the committee.
|
|
|
|
#[test]
|
|
|
|
fn attestation_get_max() {
|
|
|
|
let small_step_size = 2;
|
|
|
|
let big_step_size = 4;
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
let (ref mut state, ref keypairs, ref spec) =
|
|
|
|
attestation_test_state::<MainnetEthSpec>(big_step_size);
|
2019-05-09 08:56:41 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
let op_pool = OperationPool::new();
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
let slot = state.slot - 1;
|
|
|
|
let committees = state
|
|
|
|
.get_beacon_committees_at_slot(slot)
|
|
|
|
.unwrap()
|
|
|
|
.into_iter()
|
|
|
|
.map(BeaconCommittee::into_owned)
|
|
|
|
.collect::<Vec<_>>();
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
let max_attestations = <MainnetEthSpec as EthSpec>::MaxAttestations::to_usize();
|
|
|
|
let target_committee_size = spec.target_committee_size as usize;
|
|
|
|
|
|
|
|
let insert_attestations = |bc: &OwnedBeaconCommittee, step_size| {
|
|
|
|
for i in (0..target_committee_size).step_by(step_size) {
|
|
|
|
let att = signed_attestation(
|
|
|
|
&bc.committee,
|
|
|
|
bc.index,
|
|
|
|
keypairs,
|
|
|
|
i..i + step_size,
|
|
|
|
slot,
|
|
|
|
state,
|
|
|
|
spec,
|
|
|
|
if i == 0 { None } else { Some(0) },
|
|
|
|
);
|
2020-04-01 11:03:03 +00:00
|
|
|
op_pool
|
|
|
|
.insert_attestation(att, &state.fork, state.genesis_validators_root, spec)
|
|
|
|
.unwrap();
|
2019-05-09 08:56:41 +00:00
|
|
|
}
|
2019-12-16 23:37:12 +00:00
|
|
|
};
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
for committee in &committees {
|
|
|
|
assert_eq!(committee.committee.len(), target_committee_size);
|
|
|
|
// Attestations signed by only 2-3 validators
|
|
|
|
insert_attestations(committee, small_step_size);
|
|
|
|
// Attestations signed by 4+ validators
|
|
|
|
insert_attestations(committee, big_step_size);
|
|
|
|
}
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
let num_small = target_committee_size / small_step_size;
|
|
|
|
let num_big = target_committee_size / big_step_size;
|
2019-03-26 07:29:02 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
assert_eq!(op_pool.attestations.read().len(), committees.len());
|
|
|
|
assert_eq!(
|
|
|
|
op_pool.num_attestations(),
|
|
|
|
(num_small + num_big) * committees.len()
|
|
|
|
);
|
|
|
|
assert!(op_pool.num_attestations() > max_attestations);
|
2019-05-09 08:56:41 +00:00
|
|
|
|
2019-12-16 23:37:12 +00:00
|
|
|
state.slot += spec.min_attestation_inclusion_delay;
|
2020-01-19 23:33:28 +00:00
|
|
|
let best_attestations = op_pool
|
2020-04-20 02:34:37 +00:00
|
|
|
.get_attestations(state, |_| true, spec)
|
2020-01-19 23:33:28 +00:00
|
|
|
.expect("should have best attestations");
|
2019-12-16 23:37:12 +00:00
|
|
|
assert_eq!(best_attestations.len(), max_attestations);
|
|
|
|
|
|
|
|
// All the best attestations should be signed by at least `big_step_size` (4) validators.
|
|
|
|
for att in &best_attestations {
|
|
|
|
assert!(att.aggregation_bits.num_set_bits() >= big_step_size);
|
2019-03-26 07:29:02 +00:00
|
|
|
}
|
|
|
|
}
|
2020-01-19 23:33:28 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn attestation_rewards() {
|
|
|
|
let small_step_size = 2;
|
|
|
|
let big_step_size = 4;
|
|
|
|
|
|
|
|
let (ref mut state, ref keypairs, ref spec) =
|
|
|
|
attestation_test_state::<MainnetEthSpec>(big_step_size);
|
|
|
|
|
|
|
|
let op_pool = OperationPool::new();
|
|
|
|
|
|
|
|
let slot = state.slot - 1;
|
|
|
|
let committees = state
|
|
|
|
.get_beacon_committees_at_slot(slot)
|
|
|
|
.unwrap()
|
|
|
|
.into_iter()
|
|
|
|
.map(BeaconCommittee::into_owned)
|
|
|
|
.collect::<Vec<_>>();
|
|
|
|
|
|
|
|
let max_attestations = <MainnetEthSpec as EthSpec>::MaxAttestations::to_usize();
|
|
|
|
let target_committee_size = spec.target_committee_size as usize;
|
|
|
|
|
|
|
|
// Each validator will have a multiple of 1_000_000_000 wei.
|
|
|
|
// Safe from overflow unless there are about 18B validators (2^64 / 1_000_000_000).
|
|
|
|
for i in 0..state.validators.len() {
|
|
|
|
state.validators[i].effective_balance = 1_000_000_000 * i as u64;
|
|
|
|
}
|
|
|
|
|
|
|
|
let insert_attestations = |bc: &OwnedBeaconCommittee, step_size| {
|
|
|
|
for i in (0..target_committee_size).step_by(step_size) {
|
|
|
|
let att = signed_attestation(
|
|
|
|
&bc.committee,
|
|
|
|
bc.index,
|
|
|
|
keypairs,
|
|
|
|
i..i + step_size,
|
|
|
|
slot,
|
|
|
|
state,
|
|
|
|
spec,
|
|
|
|
if i == 0 { None } else { Some(0) },
|
|
|
|
);
|
2020-04-01 11:03:03 +00:00
|
|
|
op_pool
|
|
|
|
.insert_attestation(att, &state.fork, state.genesis_validators_root, spec)
|
|
|
|
.unwrap();
|
2020-01-19 23:33:28 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
for committee in &committees {
|
|
|
|
assert_eq!(committee.committee.len(), target_committee_size);
|
|
|
|
// Attestations signed by only 2-3 validators
|
|
|
|
insert_attestations(committee, small_step_size);
|
|
|
|
// Attestations signed by 4+ validators
|
|
|
|
insert_attestations(committee, big_step_size);
|
|
|
|
}
|
|
|
|
|
|
|
|
let num_small = target_committee_size / small_step_size;
|
|
|
|
let num_big = target_committee_size / big_step_size;
|
|
|
|
|
|
|
|
assert_eq!(op_pool.attestations.read().len(), committees.len());
|
|
|
|
assert_eq!(
|
|
|
|
op_pool.num_attestations(),
|
|
|
|
(num_small + num_big) * committees.len()
|
|
|
|
);
|
|
|
|
assert!(op_pool.num_attestations() > max_attestations);
|
|
|
|
|
|
|
|
state.slot += spec.min_attestation_inclusion_delay;
|
|
|
|
let best_attestations = op_pool
|
2020-04-20 02:34:37 +00:00
|
|
|
.get_attestations(state, |_| true, spec)
|
2020-01-19 23:33:28 +00:00
|
|
|
.expect("should have valid best attestations");
|
|
|
|
assert_eq!(best_attestations.len(), max_attestations);
|
|
|
|
|
|
|
|
let active_indices = state
|
|
|
|
.get_cached_active_validator_indices(RelativeEpoch::Current)
|
|
|
|
.unwrap();
|
|
|
|
let total_active_balance = state.get_total_balance(&active_indices, spec).unwrap();
|
|
|
|
|
|
|
|
// Set of indices covered by previous attestations in `best_attestations`.
|
|
|
|
let mut seen_indices = BTreeSet::new();
|
|
|
|
// Used for asserting that rewards are in decreasing order.
|
|
|
|
let mut prev_reward = u64::max_value();
|
|
|
|
|
|
|
|
for att in &best_attestations {
|
|
|
|
let fresh_validators_bitlist = earliest_attestation_validators(att, state);
|
2020-03-05 06:19:35 +00:00
|
|
|
let committee = state
|
|
|
|
.get_beacon_committee(att.data.slot, att.data.index)
|
|
|
|
.expect("should get beacon committee");
|
2020-04-06 04:13:19 +00:00
|
|
|
|
|
|
|
let att_indices = BTreeSet::from_iter(
|
|
|
|
get_attesting_indices::<MainnetEthSpec>(
|
|
|
|
committee.committee,
|
|
|
|
&fresh_validators_bitlist,
|
|
|
|
)
|
|
|
|
.unwrap(),
|
|
|
|
);
|
|
|
|
|
2020-01-19 23:33:28 +00:00
|
|
|
let fresh_indices = &att_indices - &seen_indices;
|
|
|
|
|
|
|
|
let rewards = fresh_indices
|
|
|
|
.iter()
|
|
|
|
.map(|validator_index| {
|
|
|
|
get_base_reward(state, *validator_index as usize, total_active_balance, spec)
|
|
|
|
.unwrap()
|
|
|
|
/ spec.proposer_reward_quotient
|
|
|
|
})
|
|
|
|
.sum();
|
|
|
|
|
|
|
|
// Check that rewards are in decreasing order
|
|
|
|
assert!(prev_reward >= rewards);
|
|
|
|
|
|
|
|
prev_reward = rewards;
|
|
|
|
seen_indices.extend(fresh_indices);
|
|
|
|
}
|
|
|
|
}
|
2020-04-30 05:21:43 +00:00
|
|
|
|
2020-06-18 11:06:34 +00:00
|
|
|
struct TestContext {
|
|
|
|
spec: ChainSpec,
|
|
|
|
state: BeaconState<MainnetEthSpec>,
|
|
|
|
keypairs: Vec<Keypair>,
|
|
|
|
op_pool: OperationPool<MainnetEthSpec>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl TestContext {
|
|
|
|
fn new() -> Self {
|
|
|
|
let spec = MainnetEthSpec::default_spec();
|
|
|
|
let num_validators = 32;
|
|
|
|
let mut state_builder =
|
|
|
|
TestingBeaconStateBuilder::<MainnetEthSpec>::from_deterministic_keypairs(
|
|
|
|
num_validators,
|
|
|
|
&spec,
|
|
|
|
);
|
|
|
|
state_builder.build_caches(&spec).unwrap();
|
|
|
|
let (state, keypairs) = state_builder.build();
|
|
|
|
let op_pool = OperationPool::new();
|
|
|
|
|
|
|
|
TestContext {
|
|
|
|
spec,
|
|
|
|
state,
|
|
|
|
keypairs,
|
|
|
|
op_pool,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn proposer_slashing(&self, proposer_index: u64) -> ProposerSlashing {
|
|
|
|
TestingProposerSlashingBuilder::double_vote::<MainnetEthSpec>(
|
|
|
|
ProposerSlashingTestTask::Valid,
|
|
|
|
proposer_index,
|
|
|
|
&self.keypairs[proposer_index as usize].sk,
|
|
|
|
&self.state.fork,
|
|
|
|
self.state.genesis_validators_root,
|
|
|
|
&self.spec,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn attester_slashing(&self, slashed_indices: &[u64]) -> AttesterSlashing<MainnetEthSpec> {
|
2020-07-25 02:03:18 +00:00
|
|
|
let signer = |idx: u64, message: &[u8]| {
|
|
|
|
self.keypairs[idx as usize]
|
|
|
|
.sk
|
|
|
|
.sign(Hash256::from_slice(&message))
|
|
|
|
};
|
2020-06-18 11:06:34 +00:00
|
|
|
TestingAttesterSlashingBuilder::double_vote(
|
|
|
|
AttesterSlashingTestTask::Valid,
|
|
|
|
slashed_indices,
|
|
|
|
signer,
|
|
|
|
&self.state.fork,
|
|
|
|
self.state.genesis_validators_root,
|
|
|
|
&self.spec,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-30 05:21:43 +00:00
|
|
|
/// Insert two slashings for the same proposer and ensure only one is returned.
|
|
|
|
#[test]
|
|
|
|
fn duplicate_proposer_slashing() {
|
2020-06-18 11:06:34 +00:00
|
|
|
let ctxt = TestContext::new();
|
|
|
|
let (op_pool, state, spec) = (&ctxt.op_pool, &ctxt.state, &ctxt.spec);
|
2020-04-30 05:21:43 +00:00
|
|
|
let proposer_index = 0;
|
2020-06-18 11:06:34 +00:00
|
|
|
let slashing1 = ctxt.proposer_slashing(proposer_index);
|
2020-04-30 05:21:43 +00:00
|
|
|
let slashing2 = ProposerSlashing {
|
|
|
|
signed_header_1: slashing1.signed_header_2.clone(),
|
|
|
|
signed_header_2: slashing1.signed_header_1.clone(),
|
|
|
|
};
|
|
|
|
|
2020-06-18 11:06:34 +00:00
|
|
|
// Both slashings should be valid and accepted by the pool.
|
|
|
|
op_pool.insert_proposer_slashing(slashing1.clone().validate(state, spec).unwrap());
|
|
|
|
op_pool.insert_proposer_slashing(slashing2.clone().validate(state, spec).unwrap());
|
2020-04-30 05:21:43 +00:00
|
|
|
|
|
|
|
// Should only get the second slashing back.
|
2020-06-18 11:06:34 +00:00
|
|
|
assert_eq!(op_pool.get_slashings(state).0, vec![slashing2]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Sanity check on the pruning of proposer slashings
|
|
|
|
#[test]
|
|
|
|
fn prune_proposer_slashing_noop() {
|
|
|
|
let ctxt = TestContext::new();
|
|
|
|
let (op_pool, state, spec) = (&ctxt.op_pool, &ctxt.state, &ctxt.spec);
|
|
|
|
let slashing = ctxt.proposer_slashing(0);
|
|
|
|
op_pool.insert_proposer_slashing(slashing.clone().validate(state, spec).unwrap());
|
|
|
|
op_pool.prune_proposer_slashings(state);
|
|
|
|
assert_eq!(op_pool.get_slashings(state).0, vec![slashing]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Sanity check on the pruning of attester slashings
|
|
|
|
#[test]
|
|
|
|
fn prune_attester_slashing_noop() {
|
|
|
|
let ctxt = TestContext::new();
|
|
|
|
let (op_pool, state, spec) = (&ctxt.op_pool, &ctxt.state, &ctxt.spec);
|
|
|
|
let slashing = ctxt.attester_slashing(&[1, 3, 5, 7, 9]);
|
|
|
|
op_pool
|
|
|
|
.insert_attester_slashing(slashing.clone().validate(state, spec).unwrap(), state.fork);
|
|
|
|
op_pool.prune_attester_slashings(state, state.fork);
|
|
|
|
assert_eq!(op_pool.get_slashings(state).1, vec![slashing]);
|
2020-04-30 05:21:43 +00:00
|
|
|
}
|
2019-03-06 03:46:12 +00:00
|
|
|
}
|