2022-10-15 22:25:54 +00:00
|
|
|
use crate::consensus_context::ConsensusContext;
|
2021-07-09 06:15:32 +00:00
|
|
|
use errors::{BlockOperationError, BlockProcessingError, HeaderInvalid};
|
2019-03-09 21:33:17 +00:00
|
|
|
use rayon::prelude::*;
|
2020-04-20 02:35:11 +00:00
|
|
|
use safe_arith::{ArithError, SafeArith};
|
2020-04-06 04:13:19 +00:00
|
|
|
use signature_sets::{block_proposal_signature_set, get_pubkey_from_state, randao_signature_set};
|
2021-07-28 05:40:21 +00:00
|
|
|
use std::borrow::Cow;
|
2020-02-10 23:19:36 +00:00
|
|
|
use tree_hash::TreeHash;
|
2019-03-06 04:22:45 +00:00
|
|
|
use types::*;
|
|
|
|
|
2019-06-03 05:25:06 +00:00
|
|
|
pub use self::verify_attester_slashing::{
|
|
|
|
get_slashable_indices, get_slashable_indices_modular, verify_attester_slashing,
|
|
|
|
};
|
2019-03-06 03:46:12 +00:00
|
|
|
pub use self::verify_proposer_slashing::verify_proposer_slashing;
|
2021-07-09 06:15:32 +00:00
|
|
|
pub use altair::sync_committee::process_sync_aggregate;
|
2021-09-22 00:37:28 +00:00
|
|
|
pub use block_signature_verifier::{BlockSignatureVerifier, ParallelSignatureSets};
|
2022-11-01 17:15:11 +00:00
|
|
|
pub use eip4844::eip4844::process_blob_kzg_commitments;
|
2019-08-29 01:34:25 +00:00
|
|
|
pub use is_valid_indexed_attestation::is_valid_indexed_attestation;
|
2021-07-09 06:15:32 +00:00
|
|
|
pub use process_operations::process_operations;
|
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 use verify_attestation::{
|
2019-08-14 00:55:24 +00:00
|
|
|
verify_attestation_for_block_inclusion, verify_attestation_for_state,
|
2019-03-20 05:52:58 +00:00
|
|
|
};
|
2022-11-10 00:09:07 +00:00
|
|
|
#[cfg(all(feature = "withdrawals", feature = "withdrawals-processing"))]
|
|
|
|
pub use verify_bls_to_execution_change::verify_bls_to_execution_change;
|
2019-05-22 08:54:26 +00:00
|
|
|
pub use verify_deposit::{
|
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
|
|
|
get_existing_validator_index, verify_deposit_merkle_proof, verify_deposit_signature,
|
2019-05-22 08:54:26 +00:00
|
|
|
};
|
2021-08-30 06:41:30 +00:00
|
|
|
pub use verify_exit::verify_exit;
|
2019-03-06 04:22:45 +00:00
|
|
|
|
2021-07-09 06:15:32 +00:00
|
|
|
pub mod altair;
|
2020-04-06 04:13:19 +00:00
|
|
|
pub mod block_signature_verifier;
|
2022-11-01 17:15:11 +00:00
|
|
|
pub mod eip4844;
|
2019-03-06 06:14:54 +00:00
|
|
|
pub mod errors;
|
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
|
|
|
mod is_valid_indexed_attestation;
|
2021-07-09 06:15:32 +00:00
|
|
|
pub mod process_operations;
|
2020-03-05 06:19:35 +00:00
|
|
|
pub mod signature_sets;
|
2019-04-10 11:58:27 +00:00
|
|
|
pub mod tests;
|
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
|
|
|
mod verify_attestation;
|
2019-03-06 04:22:45 +00:00
|
|
|
mod verify_attester_slashing;
|
2022-11-10 00:09:07 +00:00
|
|
|
#[cfg(all(feature = "withdrawals", feature = "withdrawals-processing"))]
|
|
|
|
mod verify_bls_to_execution_change;
|
2019-03-06 04:22:45 +00:00
|
|
|
mod verify_deposit;
|
|
|
|
mod verify_exit;
|
|
|
|
mod verify_proposer_slashing;
|
|
|
|
|
2022-11-14 19:14:31 +00:00
|
|
|
#[cfg(feature = "withdrawals-processing")]
|
2022-11-14 00:20:27 +00:00
|
|
|
use crate::common::decrease_balance;
|
2022-11-14 19:14:31 +00:00
|
|
|
|
2020-05-05 23:12:28 +00:00
|
|
|
#[cfg(feature = "arbitrary-fuzz")]
|
|
|
|
use arbitrary::Arbitrary;
|
|
|
|
|
2019-08-29 01:34:25 +00:00
|
|
|
/// The strategy to be used when validating the block's signatures.
|
2020-05-05 23:12:28 +00:00
|
|
|
#[cfg_attr(feature = "arbitrary-fuzz", derive(Arbitrary))]
|
2022-08-09 06:05:13 +00:00
|
|
|
#[derive(PartialEq, Clone, Copy, Debug)]
|
2019-08-29 01:34:25 +00:00
|
|
|
pub enum BlockSignatureStrategy {
|
|
|
|
/// Do not validate any signature. Use with caution.
|
|
|
|
NoVerification,
|
|
|
|
/// Validate each signature individually, as its object is being processed.
|
|
|
|
VerifyIndividual,
|
2021-11-01 07:44:40 +00:00
|
|
|
/// Validate only the randao reveal signature.
|
|
|
|
VerifyRandao,
|
2019-08-29 01:34:25 +00:00
|
|
|
/// Verify all signatures in bulk at the beginning of block processing.
|
|
|
|
VerifyBulk,
|
|
|
|
}
|
|
|
|
|
|
|
|
/// The strategy to be used when validating the block's signatures.
|
2020-05-05 23:12:28 +00:00
|
|
|
#[cfg_attr(feature = "arbitrary-fuzz", derive(Arbitrary))]
|
2019-08-29 01:34:25 +00:00
|
|
|
#[derive(PartialEq, Clone, Copy)]
|
2019-08-14 00:55:24 +00:00
|
|
|
pub enum VerifySignatures {
|
2019-08-29 01:34:25 +00:00
|
|
|
/// Validate all signatures encountered.
|
2019-08-14 00:55:24 +00:00
|
|
|
True,
|
2019-08-29 01:34:25 +00:00
|
|
|
/// Do not validate any signature. Use with caution.
|
2019-08-14 00:55:24 +00:00
|
|
|
False,
|
|
|
|
}
|
|
|
|
|
2019-08-29 01:34:25 +00:00
|
|
|
impl VerifySignatures {
|
2019-09-30 03:58:45 +00:00
|
|
|
pub fn is_true(self) -> bool {
|
|
|
|
self == VerifySignatures::True
|
2019-08-29 01:34:25 +00:00
|
|
|
}
|
2019-03-06 04:22:45 +00:00
|
|
|
}
|
|
|
|
|
2021-12-21 06:30:52 +00:00
|
|
|
/// Control verification of the latest block header.
|
|
|
|
#[cfg_attr(feature = "arbitrary-fuzz", derive(Arbitrary))]
|
|
|
|
#[derive(PartialEq, Clone, Copy)]
|
|
|
|
pub enum VerifyBlockRoot {
|
|
|
|
True,
|
|
|
|
False,
|
|
|
|
}
|
|
|
|
|
2019-03-06 05:24:56 +00:00
|
|
|
/// Updates the state for a new block, whilst validating that the block is valid, optionally
|
|
|
|
/// checking the block proposer signature.
|
|
|
|
///
|
|
|
|
/// Returns `Ok(())` if the block is valid and the state was successfully updated. Otherwise
|
|
|
|
/// returns an error describing why the block was invalid or how the function failed to execute.
|
|
|
|
///
|
2020-02-10 23:19:36 +00:00
|
|
|
/// If `block_root` is `Some`, this root is used for verification of the proposer's signature. If it
|
|
|
|
/// is `None` the signing root is computed from scratch. This parameter only exists to avoid
|
|
|
|
/// re-calculating the root when it is already known. Note `block_root` should be equal to the
|
|
|
|
/// tree hash root of the block, NOT the signing root of the block. This function takes
|
|
|
|
/// care of mixing in the domain.
|
2022-10-13 22:07:32 +00:00
|
|
|
pub fn per_block_processing<T: EthSpec, Payload: AbstractExecPayload<T>>(
|
2021-07-09 06:15:32 +00:00
|
|
|
state: &mut BeaconState<T>,
|
2022-03-31 07:52:23 +00:00
|
|
|
signed_block: &SignedBeaconBlock<T, Payload>,
|
2019-08-29 01:34:25 +00:00
|
|
|
block_signature_strategy: BlockSignatureStrategy,
|
2021-12-21 06:30:52 +00:00
|
|
|
verify_block_root: VerifyBlockRoot,
|
2022-10-15 22:25:54 +00:00
|
|
|
ctxt: &mut ConsensusContext<T>,
|
2019-03-06 04:22:45 +00:00
|
|
|
spec: &ChainSpec,
|
2019-08-29 01:34:25 +00:00
|
|
|
) -> Result<(), BlockProcessingError> {
|
2021-07-09 06:15:32 +00:00
|
|
|
let block = signed_block.message();
|
|
|
|
|
|
|
|
// Verify that the `SignedBeaconBlock` instantiation matches the fork at `signed_block.slot()`.
|
|
|
|
signed_block
|
|
|
|
.fork_name(spec)
|
|
|
|
.map_err(BlockProcessingError::InconsistentBlockFork)?;
|
|
|
|
|
|
|
|
// Verify that the `BeaconState` instantiation matches the fork at `state.slot()`.
|
|
|
|
state
|
|
|
|
.fork_name(spec)
|
|
|
|
.map_err(BlockProcessingError::InconsistentStateFork)?;
|
|
|
|
|
2019-08-29 01:34:25 +00:00
|
|
|
let verify_signatures = match block_signature_strategy {
|
|
|
|
BlockSignatureStrategy::VerifyBulk => {
|
|
|
|
// Verify all signatures in the block at once.
|
2022-10-15 22:25:54 +00:00
|
|
|
let block_root = Some(ctxt.get_current_block_root(signed_block)?);
|
|
|
|
let proposer_index = Some(ctxt.get_proposer_index(state, spec)?);
|
2019-08-29 01:34:25 +00:00
|
|
|
block_verify!(
|
2020-04-06 04:13:19 +00:00
|
|
|
BlockSignatureVerifier::verify_entire_block(
|
|
|
|
state,
|
|
|
|
|i| get_pubkey_from_state(state, i),
|
2021-07-28 05:40:21 +00:00
|
|
|
|pk_bytes| pk_bytes.decompress().ok().map(Cow::Owned),
|
2020-04-06 04:13:19 +00:00
|
|
|
signed_block,
|
|
|
|
block_root,
|
2022-10-15 22:25:54 +00:00
|
|
|
proposer_index,
|
2020-04-06 04:13:19 +00:00
|
|
|
spec
|
|
|
|
)
|
|
|
|
.is_ok(),
|
2019-08-29 01:34:25 +00:00
|
|
|
BlockProcessingError::BulkSignatureVerificationFailed
|
|
|
|
);
|
|
|
|
VerifySignatures::False
|
|
|
|
}
|
|
|
|
BlockSignatureStrategy::VerifyIndividual => VerifySignatures::True,
|
|
|
|
BlockSignatureStrategy::NoVerification => VerifySignatures::False,
|
2021-11-01 07:44:40 +00:00
|
|
|
BlockSignatureStrategy::VerifyRandao => VerifySignatures::False,
|
2019-08-29 01:34:25 +00:00
|
|
|
};
|
|
|
|
|
2022-03-31 07:52:23 +00:00
|
|
|
let proposer_index = process_block_header(
|
|
|
|
state,
|
|
|
|
block.temporary_block_header(),
|
|
|
|
verify_block_root,
|
2022-10-15 22:25:54 +00:00
|
|
|
ctxt,
|
2022-03-31 07:52:23 +00:00
|
|
|
spec,
|
|
|
|
)?;
|
2020-02-10 23:19:36 +00:00
|
|
|
|
|
|
|
if verify_signatures.is_true() {
|
2022-10-15 22:25:54 +00:00
|
|
|
verify_block_signature(state, signed_block, ctxt, spec)?;
|
2020-02-10 23:19:36 +00:00
|
|
|
}
|
2019-03-06 04:22:45 +00:00
|
|
|
|
2021-11-01 07:44:40 +00:00
|
|
|
let verify_randao = if let BlockSignatureStrategy::VerifyRandao = block_signature_strategy {
|
|
|
|
VerifySignatures::True
|
|
|
|
} else {
|
|
|
|
verify_signatures
|
|
|
|
};
|
2019-05-22 02:17:40 +00:00
|
|
|
// Ensure the current and previous epoch caches are built.
|
2019-05-20 04:36:54 +00:00
|
|
|
state.build_committee_cache(RelativeEpoch::Previous, spec)?;
|
|
|
|
state.build_committee_cache(RelativeEpoch::Current, spec)?;
|
2019-03-06 04:22:45 +00:00
|
|
|
|
2021-09-26 23:42:29 +00:00
|
|
|
// The call to the `process_execution_payload` must happen before the call to the
|
|
|
|
// `process_randao` as the former depends on the `randao_mix` computed with the reveal of the
|
|
|
|
// previous block.
|
|
|
|
if is_execution_enabled(state, block.body()) {
|
2022-01-06 03:14:58 +00:00
|
|
|
let payload = block.body().execution_payload()?;
|
2022-11-14 00:20:27 +00:00
|
|
|
#[cfg(all(feature = "withdrawals", feature = "withdrawals-processing"))]
|
|
|
|
process_withdrawals::<T, Payload>(state, payload, spec)?;
|
2022-10-14 22:35:10 +00:00
|
|
|
process_execution_payload::<T, Payload>(state, payload, spec)?;
|
2021-09-26 23:42:29 +00:00
|
|
|
}
|
|
|
|
|
2022-10-15 22:25:54 +00:00
|
|
|
process_randao(state, block, verify_randao, ctxt, spec)?;
|
2021-07-09 06:15:32 +00:00
|
|
|
process_eth1_data(state, block.body().eth1_data())?;
|
2022-10-15 22:25:54 +00:00
|
|
|
process_operations(state, block.body(), verify_signatures, ctxt, spec)?;
|
2021-07-09 06:15:32 +00:00
|
|
|
|
2022-01-06 03:14:58 +00:00
|
|
|
if let Ok(sync_aggregate) = block.body().sync_aggregate() {
|
2021-07-28 05:40:21 +00:00
|
|
|
process_sync_aggregate(
|
|
|
|
state,
|
2021-09-24 04:55:21 +00:00
|
|
|
sync_aggregate,
|
2021-07-28 05:40:21 +00:00
|
|
|
proposer_index,
|
|
|
|
verify_signatures,
|
|
|
|
spec,
|
|
|
|
)?;
|
2021-07-09 06:15:32 +00:00
|
|
|
}
|
2019-03-06 06:03:18 +00:00
|
|
|
|
2022-11-01 17:15:11 +00:00
|
|
|
process_blob_kzg_commitments(block.body())?;
|
|
|
|
|
2019-03-06 06:03:18 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2021-07-09 06:15:32 +00:00
|
|
|
/// Processes the block header, returning the proposer index.
|
2019-05-10 04:47:09 +00:00
|
|
|
pub fn process_block_header<T: EthSpec>(
|
2019-05-08 05:36:02 +00:00
|
|
|
state: &mut BeaconState<T>,
|
2022-03-31 07:52:23 +00:00
|
|
|
block_header: BeaconBlockHeader,
|
2021-12-21 06:30:52 +00:00
|
|
|
verify_block_root: VerifyBlockRoot,
|
2022-10-15 22:25:54 +00:00
|
|
|
ctxt: &mut ConsensusContext<T>,
|
2019-03-17 01:25:37 +00:00
|
|
|
spec: &ChainSpec,
|
2021-07-09 06:15:32 +00:00
|
|
|
) -> Result<u64, BlockOperationError<HeaderInvalid>> {
|
2020-04-01 11:03:03 +00:00
|
|
|
// Verify that the slots match
|
2021-07-09 06:15:32 +00:00
|
|
|
verify!(
|
2022-03-31 07:52:23 +00:00
|
|
|
block_header.slot == state.slot(),
|
2021-07-09 06:15:32 +00:00
|
|
|
HeaderInvalid::StateSlotMismatch
|
|
|
|
);
|
2019-03-17 01:25:37 +00:00
|
|
|
|
2020-06-03 03:34:01 +00:00
|
|
|
// Verify that the block is newer than the latest block header
|
|
|
|
verify!(
|
2022-03-31 07:52:23 +00:00
|
|
|
block_header.slot > state.latest_block_header().slot,
|
2020-06-03 03:34:01 +00:00
|
|
|
HeaderInvalid::OlderThanLatestBlockHeader {
|
2022-03-31 07:52:23 +00:00
|
|
|
block_slot: block_header.slot,
|
2021-07-09 06:15:32 +00:00
|
|
|
latest_block_header_slot: state.latest_block_header().slot,
|
2020-06-03 03:34:01 +00:00
|
|
|
}
|
|
|
|
);
|
|
|
|
|
2020-04-01 11:03:03 +00:00
|
|
|
// Verify that proposer index is the correct index
|
2022-10-15 22:25:54 +00:00
|
|
|
let proposer_index = block_header.proposer_index;
|
|
|
|
let state_proposer_index = ctxt.get_proposer_index(state, spec)?;
|
2020-04-01 11:03:03 +00:00
|
|
|
verify!(
|
|
|
|
proposer_index == state_proposer_index,
|
|
|
|
HeaderInvalid::ProposerIndexMismatch {
|
|
|
|
block_proposer_index: proposer_index,
|
|
|
|
state_proposer_index,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
2021-12-21 06:30:52 +00:00
|
|
|
if verify_block_root == VerifyBlockRoot::True {
|
|
|
|
let expected_previous_block_root = state.latest_block_header().tree_hash_root();
|
|
|
|
verify!(
|
2022-03-31 07:52:23 +00:00
|
|
|
block_header.parent_root == expected_previous_block_root,
|
2021-12-21 06:30:52 +00:00
|
|
|
HeaderInvalid::ParentBlockRootMismatch {
|
|
|
|
state: expected_previous_block_root,
|
2022-03-31 07:52:23 +00:00
|
|
|
block: block_header.parent_root,
|
2021-12-21 06:30:52 +00:00
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
2019-03-17 01:25:37 +00:00
|
|
|
|
2022-03-31 07:52:23 +00:00
|
|
|
*state.latest_block_header_mut() = block_header;
|
2019-03-17 01:25:37 +00:00
|
|
|
|
2019-05-20 02:42:02 +00:00
|
|
|
// Verify proposer is not slashed
|
2019-08-29 01:34:25 +00:00
|
|
|
verify!(
|
2022-10-15 22:25:54 +00:00
|
|
|
!state.get_validator(proposer_index as usize)?.slashed,
|
2020-04-01 11:03:03 +00:00
|
|
|
HeaderInvalid::ProposerSlashed(proposer_index)
|
2019-08-29 01:34:25 +00:00
|
|
|
);
|
2019-05-20 02:42:02 +00:00
|
|
|
|
2022-10-15 22:25:54 +00:00
|
|
|
Ok(proposer_index)
|
2019-03-17 01:25:37 +00:00
|
|
|
}
|
|
|
|
|
2019-03-06 06:03:18 +00:00
|
|
|
/// Verifies the signature of a block.
|
|
|
|
///
|
2020-06-19 01:18:27 +00:00
|
|
|
/// Spec v0.12.1
|
2022-10-13 22:07:32 +00:00
|
|
|
pub fn verify_block_signature<T: EthSpec, Payload: AbstractExecPayload<T>>(
|
2019-05-08 05:36:02 +00:00
|
|
|
state: &BeaconState<T>,
|
2022-03-31 07:52:23 +00:00
|
|
|
block: &SignedBeaconBlock<T, Payload>,
|
2022-10-15 22:25:54 +00:00
|
|
|
ctxt: &mut ConsensusContext<T>,
|
2019-03-06 06:03:18 +00:00
|
|
|
spec: &ChainSpec,
|
2019-08-29 01:34:25 +00:00
|
|
|
) -> Result<(), BlockOperationError<HeaderInvalid>> {
|
2022-10-15 22:25:54 +00:00
|
|
|
let block_root = Some(ctxt.get_current_block_root(block)?);
|
|
|
|
let proposer_index = Some(ctxt.get_proposer_index(state, spec)?);
|
2019-03-06 06:03:18 +00:00
|
|
|
verify!(
|
2020-04-06 04:13:19 +00:00
|
|
|
block_proposal_signature_set(
|
|
|
|
state,
|
|
|
|
|i| get_pubkey_from_state(state, i),
|
|
|
|
block,
|
|
|
|
block_root,
|
2022-10-15 22:25:54 +00:00
|
|
|
proposer_index,
|
2020-04-06 04:13:19 +00:00
|
|
|
spec
|
|
|
|
)?
|
2020-07-25 02:03:18 +00:00
|
|
|
.verify(),
|
2019-08-29 01:34:25 +00:00
|
|
|
HeaderInvalid::ProposalSignatureInvalid
|
2019-03-06 06:03:18 +00:00
|
|
|
);
|
2019-03-06 04:22:45 +00:00
|
|
|
|
2019-03-06 06:03:18 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Verifies the `randao_reveal` against the block's proposer pubkey and updates
|
|
|
|
/// `state.latest_randao_mixes`.
|
2022-10-13 22:07:32 +00:00
|
|
|
pub fn process_randao<T: EthSpec, Payload: AbstractExecPayload<T>>(
|
2019-05-08 05:36:02 +00:00
|
|
|
state: &mut BeaconState<T>,
|
2022-03-31 07:52:23 +00:00
|
|
|
block: BeaconBlockRef<'_, T, Payload>,
|
2019-08-29 01:34:25 +00:00
|
|
|
verify_signatures: VerifySignatures,
|
2022-10-15 22:25:54 +00:00
|
|
|
ctxt: &mut ConsensusContext<T>,
|
2019-03-06 06:03:18 +00:00
|
|
|
spec: &ChainSpec,
|
2019-08-29 01:34:25 +00:00
|
|
|
) -> Result<(), BlockProcessingError> {
|
|
|
|
if verify_signatures.is_true() {
|
|
|
|
// Verify RANDAO reveal signature.
|
2022-10-15 22:25:54 +00:00
|
|
|
let proposer_index = ctxt.get_proposer_index(state, spec)?;
|
2019-08-29 01:34:25 +00:00
|
|
|
block_verify!(
|
2022-10-15 22:25:54 +00:00
|
|
|
randao_signature_set(
|
|
|
|
state,
|
|
|
|
|i| get_pubkey_from_state(state, i),
|
|
|
|
block,
|
|
|
|
Some(proposer_index),
|
|
|
|
spec
|
|
|
|
)?
|
|
|
|
.verify(),
|
2019-08-29 01:34:25 +00:00
|
|
|
BlockProcessingError::RandaoSignatureInvalid
|
|
|
|
);
|
|
|
|
}
|
2019-03-06 04:22:45 +00:00
|
|
|
|
2019-03-17 01:25:37 +00:00
|
|
|
// Update the current epoch RANDAO mix.
|
2021-07-09 06:15:32 +00:00
|
|
|
state.update_randao_mix(state.current_epoch(), block.body().randao_reveal())?;
|
2019-03-06 04:22:45 +00:00
|
|
|
|
2019-03-06 06:03:18 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
2019-03-06 04:22:45 +00:00
|
|
|
|
2019-03-06 06:03:18 +00:00
|
|
|
/// Update the `state.eth1_data_votes` based upon the `eth1_data` provided.
|
2019-05-10 04:47:09 +00:00
|
|
|
pub fn process_eth1_data<T: EthSpec>(
|
2019-05-08 05:36:02 +00:00
|
|
|
state: &mut BeaconState<T>,
|
|
|
|
eth1_data: &Eth1Data,
|
|
|
|
) -> Result<(), Error> {
|
2020-04-20 02:35:11 +00:00
|
|
|
if let Some(new_eth1_data) = get_new_eth1_data(state, eth1_data)? {
|
2021-07-09 06:15:32 +00:00
|
|
|
*state.eth1_data_mut() = new_eth1_data;
|
Prepare for public testnet (#628)
* Update to spec v0.9.0
* Update to v0.9.1
* Bump spec tags for v0.9.1
* Formatting, fix CI failures
* Resolve accidental KeyPair merge conflict
* Document new BeaconState functions
* Add `validator` changes from `validator-to-rest`
* Add initial (failing) REST api tests
* Fix signature parsing
* Add more tests
* Refactor http router
* Add working tests for publish beacon block
* Add validator duties tests
* Move account_manager under `lighthouse` binary
* Unify logfile handling in `environment` crate.
* Fix incorrect cache drops in `advance_caches`
* Update fork choice for v0.9.1
* Add `deposit_contract` crate
* Add progress on validator onboarding
* Add unfinished attesation code
* Update account manager CLI
* Write eth1 data file as hex string
* Integrate ValidatorDirectory with validator_client
* Move ValidatorDirectory into validator_client
* Clean up some FIXMEs
* Add beacon_chain_sim
* Fix a few docs/logs
* Expand `beacon_chain_sim`
* Fix spec for `beacon_chain_sim
* More testing for api
* Start work on attestation endpoint
* Reject empty attestations
* Allow attestations to genesis block
* Add working tests for `rest_api` validator endpoint
* Remove grpc from beacon_node
* Start heavy refactor of validator client
- Block production is working
* Prune old validator client files
* Start works on attestation service
* Add attestation service to validator client
* Use full pubkey for validator directories
* Add validator duties post endpoint
* Use par_iter for keypair generation
* Use bulk duties request in validator client
* Add version http endpoint tests
* Add interop keys and startup wait
* Ensure a prompt exit
* Add duties pruning
* Fix compile error in beacon node tests
* Add github workflow
* Modify rust.yaml
* Modify gitlab actions
* Add to CI file
* Add sudo to CI npm install
* Move cargo fmt to own job in tests
* Fix cargo fmt in CI
* Add rustup update before cargo fmt
* Change name of CI job
* Make other CI jobs require cargo fmt
* Add CI badge
* Remove gitlab and travis files
* Add different http timeout for debug
* Update docker file, use makefile in CI
* Use make in the dockerfile, skip the test
* Use the makefile for debug GI test
* Update book
* Tidy grpc and misc things
* Apply discv5 fixes
* Address other minor issues
* Fix warnings
* Attempt fix for addr parsing
* Tidy validator config, CLIs
* Tidy comments
* Tidy signing, reduce ForkService duplication
* Fail if skipping too many slots
* Set default recent genesis time to 0
* Add custom http timeout to validator
* Fix compile bug in node_test_rig
* Remove old bootstrap flag from val CLI
* Update docs
* Tidy val client
* Change val client log levels
* Add comments, more validity checks
* Fix compile error, add comments
* Undo changes to eth2-libp2p/src
* Reduce duplication of keypair generation
* Add more logging for validator duties
* Fix beacon_chain_sim, nitpicks
* Fix compile error, minor nits
* Update to use v0.9.2 version of deposit contract
* Add efforts to automate eth1 testnet deployment
* Fix lcli testnet deployer
* Modify bn CLI to parse eth2_testnet_dir
* Progress with account_manager deposit tools
* Make account manager submit deposits
* Add password option for submitting deposits
* Allow custom deposit amount
* Add long names to lcli clap
* Add password option to lcli deploy command
* Fix minor bugs whilst testing
* Address Michael's comments
* Add refund-deposit-contract to lcli
* Use time instead of skip count for denying long skips
* Improve logging for eth1
* Fix bug with validator services exiting on error
* Drop the block cache after genesis
* Modify eth1 testnet config
* Improve eth1 logging
* Make validator wait until genesis time
* Fix bug in eth1 voting
* Add more logging to eth1 voting
* Handle errors in eth1 http module
* Set SECONDS_PER_DAY to sensible minimum
* Shorten delay before testnet start
* Ensure eth1 block is produced without any votes
* Improve eth1 logging
* Fix broken tests in eth1
* Tidy code in rest_api
* Fix failing test in deposit_contract
* Make CLI args more consistent
* Change validator/duties endpoint
* Add time-based skip slot limiting
* Add new error type missed in previous commit
* Add log when waiting for genesis
* Refactor beacon node CLI
* Remove unused dep
* Add lcli eth1-genesis command
* Fix bug in master merge
* Apply clippy lints to beacon node
* Add support for YamlConfig in Eth2TestnetDir
* Upgrade tesnet deposit contract version
* Remove unnecessary logging and correct formatting
* Add a hardcoded eth2 testnet config
* Ensure http server flag works. Overwrite configs with flags.
* Ensure boot nodes are loaded from testnet dir
* Fix account manager CLI bugs
* Fix bugs with beacon node cli
* Allow testnet dir without boot nodes
* Write genesis state as SSZ
* Remove ---/n from the start of testnet_dir files
* Set default libp2p address
* Tidy account manager CLI, add logging
* Add check to see if testnet dir exists
* Apply reviewers suggestions
* Add HeadTracker struct
* Add fork choice persistence
* Shorten slot time for simulator
* Add the /beacon/heads API endpoint
* Update hardcoded testnet
* Add tests for BeaconChain persistence + fix bugs
* Extend BeaconChain persistence testing
* Ensure chain is finalized b4 persistence tests
* Ensure boot_enr.yaml is include in binary
* Refactor beacon_chain_sim
* Move files about in beacon sim
* Update beacon_chain_sim
* Fix bug with deposit inclusion
* Increase log in genesis service, fix todo
* Tidy sim, fix broken rest_api tests
* Fix more broken tests
* Update testnet
* Fix broken rest api test
* Tidy account manager CLI
* Use tempdir for account manager
* Stop hardcoded testnet dir from creating dir
* Rename Eth2TestnetDir to Eth2TestnetConfig
* Change hardcoded -> hard_coded
* Tidy account manager
* Add log to account manager
* Tidy, ensure head tracker is loaded from disk
* Tidy beacon chain builder
* Tidy eth1_chain
* Adds log support for simulator
* Revert "Adds log support for simulator"
This reverts commit ec77c66a052350f551db145cf20f213823428dd3.
* Adds log support for simulator
* Tidy after self-review
* Change default log level
* Address Michael's delicious PR comments
* Fix off-by-one in tests
2019-12-03 04:28:57 +00:00
|
|
|
}
|
|
|
|
|
2021-07-09 06:15:32 +00:00
|
|
|
state.eth1_data_votes_mut().push(eth1_data.clone())?;
|
2019-05-20 02:42:02 +00:00
|
|
|
|
Prepare for public testnet (#628)
* Update to spec v0.9.0
* Update to v0.9.1
* Bump spec tags for v0.9.1
* Formatting, fix CI failures
* Resolve accidental KeyPair merge conflict
* Document new BeaconState functions
* Add `validator` changes from `validator-to-rest`
* Add initial (failing) REST api tests
* Fix signature parsing
* Add more tests
* Refactor http router
* Add working tests for publish beacon block
* Add validator duties tests
* Move account_manager under `lighthouse` binary
* Unify logfile handling in `environment` crate.
* Fix incorrect cache drops in `advance_caches`
* Update fork choice for v0.9.1
* Add `deposit_contract` crate
* Add progress on validator onboarding
* Add unfinished attesation code
* Update account manager CLI
* Write eth1 data file as hex string
* Integrate ValidatorDirectory with validator_client
* Move ValidatorDirectory into validator_client
* Clean up some FIXMEs
* Add beacon_chain_sim
* Fix a few docs/logs
* Expand `beacon_chain_sim`
* Fix spec for `beacon_chain_sim
* More testing for api
* Start work on attestation endpoint
* Reject empty attestations
* Allow attestations to genesis block
* Add working tests for `rest_api` validator endpoint
* Remove grpc from beacon_node
* Start heavy refactor of validator client
- Block production is working
* Prune old validator client files
* Start works on attestation service
* Add attestation service to validator client
* Use full pubkey for validator directories
* Add validator duties post endpoint
* Use par_iter for keypair generation
* Use bulk duties request in validator client
* Add version http endpoint tests
* Add interop keys and startup wait
* Ensure a prompt exit
* Add duties pruning
* Fix compile error in beacon node tests
* Add github workflow
* Modify rust.yaml
* Modify gitlab actions
* Add to CI file
* Add sudo to CI npm install
* Move cargo fmt to own job in tests
* Fix cargo fmt in CI
* Add rustup update before cargo fmt
* Change name of CI job
* Make other CI jobs require cargo fmt
* Add CI badge
* Remove gitlab and travis files
* Add different http timeout for debug
* Update docker file, use makefile in CI
* Use make in the dockerfile, skip the test
* Use the makefile for debug GI test
* Update book
* Tidy grpc and misc things
* Apply discv5 fixes
* Address other minor issues
* Fix warnings
* Attempt fix for addr parsing
* Tidy validator config, CLIs
* Tidy comments
* Tidy signing, reduce ForkService duplication
* Fail if skipping too many slots
* Set default recent genesis time to 0
* Add custom http timeout to validator
* Fix compile bug in node_test_rig
* Remove old bootstrap flag from val CLI
* Update docs
* Tidy val client
* Change val client log levels
* Add comments, more validity checks
* Fix compile error, add comments
* Undo changes to eth2-libp2p/src
* Reduce duplication of keypair generation
* Add more logging for validator duties
* Fix beacon_chain_sim, nitpicks
* Fix compile error, minor nits
* Update to use v0.9.2 version of deposit contract
* Add efforts to automate eth1 testnet deployment
* Fix lcli testnet deployer
* Modify bn CLI to parse eth2_testnet_dir
* Progress with account_manager deposit tools
* Make account manager submit deposits
* Add password option for submitting deposits
* Allow custom deposit amount
* Add long names to lcli clap
* Add password option to lcli deploy command
* Fix minor bugs whilst testing
* Address Michael's comments
* Add refund-deposit-contract to lcli
* Use time instead of skip count for denying long skips
* Improve logging for eth1
* Fix bug with validator services exiting on error
* Drop the block cache after genesis
* Modify eth1 testnet config
* Improve eth1 logging
* Make validator wait until genesis time
* Fix bug in eth1 voting
* Add more logging to eth1 voting
* Handle errors in eth1 http module
* Set SECONDS_PER_DAY to sensible minimum
* Shorten delay before testnet start
* Ensure eth1 block is produced without any votes
* Improve eth1 logging
* Fix broken tests in eth1
* Tidy code in rest_api
* Fix failing test in deposit_contract
* Make CLI args more consistent
* Change validator/duties endpoint
* Add time-based skip slot limiting
* Add new error type missed in previous commit
* Add log when waiting for genesis
* Refactor beacon node CLI
* Remove unused dep
* Add lcli eth1-genesis command
* Fix bug in master merge
* Apply clippy lints to beacon node
* Add support for YamlConfig in Eth2TestnetDir
* Upgrade tesnet deposit contract version
* Remove unnecessary logging and correct formatting
* Add a hardcoded eth2 testnet config
* Ensure http server flag works. Overwrite configs with flags.
* Ensure boot nodes are loaded from testnet dir
* Fix account manager CLI bugs
* Fix bugs with beacon node cli
* Allow testnet dir without boot nodes
* Write genesis state as SSZ
* Remove ---/n from the start of testnet_dir files
* Set default libp2p address
* Tidy account manager CLI, add logging
* Add check to see if testnet dir exists
* Apply reviewers suggestions
* Add HeadTracker struct
* Add fork choice persistence
* Shorten slot time for simulator
* Add the /beacon/heads API endpoint
* Update hardcoded testnet
* Add tests for BeaconChain persistence + fix bugs
* Extend BeaconChain persistence testing
* Ensure chain is finalized b4 persistence tests
* Ensure boot_enr.yaml is include in binary
* Refactor beacon_chain_sim
* Move files about in beacon sim
* Update beacon_chain_sim
* Fix bug with deposit inclusion
* Increase log in genesis service, fix todo
* Tidy sim, fix broken rest_api tests
* Fix more broken tests
* Update testnet
* Fix broken rest api test
* Tidy account manager CLI
* Use tempdir for account manager
* Stop hardcoded testnet dir from creating dir
* Rename Eth2TestnetDir to Eth2TestnetConfig
* Change hardcoded -> hard_coded
* Tidy account manager
* Add log to account manager
* Tidy, ensure head tracker is loaded from disk
* Tidy beacon chain builder
* Tidy eth1_chain
* Adds log support for simulator
* Revert "Adds log support for simulator"
This reverts commit ec77c66a052350f551db145cf20f213823428dd3.
* Adds log support for simulator
* Tidy after self-review
* Change default log level
* Address Michael's delicious PR comments
* Fix off-by-one in tests
2019-12-03 04:28:57 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2020-04-20 02:35:11 +00:00
|
|
|
/// Returns `Ok(Some(eth1_data))` if adding the given `eth1_data` to `state.eth1_data_votes` would
|
Prepare for public testnet (#628)
* Update to spec v0.9.0
* Update to v0.9.1
* Bump spec tags for v0.9.1
* Formatting, fix CI failures
* Resolve accidental KeyPair merge conflict
* Document new BeaconState functions
* Add `validator` changes from `validator-to-rest`
* Add initial (failing) REST api tests
* Fix signature parsing
* Add more tests
* Refactor http router
* Add working tests for publish beacon block
* Add validator duties tests
* Move account_manager under `lighthouse` binary
* Unify logfile handling in `environment` crate.
* Fix incorrect cache drops in `advance_caches`
* Update fork choice for v0.9.1
* Add `deposit_contract` crate
* Add progress on validator onboarding
* Add unfinished attesation code
* Update account manager CLI
* Write eth1 data file as hex string
* Integrate ValidatorDirectory with validator_client
* Move ValidatorDirectory into validator_client
* Clean up some FIXMEs
* Add beacon_chain_sim
* Fix a few docs/logs
* Expand `beacon_chain_sim`
* Fix spec for `beacon_chain_sim
* More testing for api
* Start work on attestation endpoint
* Reject empty attestations
* Allow attestations to genesis block
* Add working tests for `rest_api` validator endpoint
* Remove grpc from beacon_node
* Start heavy refactor of validator client
- Block production is working
* Prune old validator client files
* Start works on attestation service
* Add attestation service to validator client
* Use full pubkey for validator directories
* Add validator duties post endpoint
* Use par_iter for keypair generation
* Use bulk duties request in validator client
* Add version http endpoint tests
* Add interop keys and startup wait
* Ensure a prompt exit
* Add duties pruning
* Fix compile error in beacon node tests
* Add github workflow
* Modify rust.yaml
* Modify gitlab actions
* Add to CI file
* Add sudo to CI npm install
* Move cargo fmt to own job in tests
* Fix cargo fmt in CI
* Add rustup update before cargo fmt
* Change name of CI job
* Make other CI jobs require cargo fmt
* Add CI badge
* Remove gitlab and travis files
* Add different http timeout for debug
* Update docker file, use makefile in CI
* Use make in the dockerfile, skip the test
* Use the makefile for debug GI test
* Update book
* Tidy grpc and misc things
* Apply discv5 fixes
* Address other minor issues
* Fix warnings
* Attempt fix for addr parsing
* Tidy validator config, CLIs
* Tidy comments
* Tidy signing, reduce ForkService duplication
* Fail if skipping too many slots
* Set default recent genesis time to 0
* Add custom http timeout to validator
* Fix compile bug in node_test_rig
* Remove old bootstrap flag from val CLI
* Update docs
* Tidy val client
* Change val client log levels
* Add comments, more validity checks
* Fix compile error, add comments
* Undo changes to eth2-libp2p/src
* Reduce duplication of keypair generation
* Add more logging for validator duties
* Fix beacon_chain_sim, nitpicks
* Fix compile error, minor nits
* Update to use v0.9.2 version of deposit contract
* Add efforts to automate eth1 testnet deployment
* Fix lcli testnet deployer
* Modify bn CLI to parse eth2_testnet_dir
* Progress with account_manager deposit tools
* Make account manager submit deposits
* Add password option for submitting deposits
* Allow custom deposit amount
* Add long names to lcli clap
* Add password option to lcli deploy command
* Fix minor bugs whilst testing
* Address Michael's comments
* Add refund-deposit-contract to lcli
* Use time instead of skip count for denying long skips
* Improve logging for eth1
* Fix bug with validator services exiting on error
* Drop the block cache after genesis
* Modify eth1 testnet config
* Improve eth1 logging
* Make validator wait until genesis time
* Fix bug in eth1 voting
* Add more logging to eth1 voting
* Handle errors in eth1 http module
* Set SECONDS_PER_DAY to sensible minimum
* Shorten delay before testnet start
* Ensure eth1 block is produced without any votes
* Improve eth1 logging
* Fix broken tests in eth1
* Tidy code in rest_api
* Fix failing test in deposit_contract
* Make CLI args more consistent
* Change validator/duties endpoint
* Add time-based skip slot limiting
* Add new error type missed in previous commit
* Add log when waiting for genesis
* Refactor beacon node CLI
* Remove unused dep
* Add lcli eth1-genesis command
* Fix bug in master merge
* Apply clippy lints to beacon node
* Add support for YamlConfig in Eth2TestnetDir
* Upgrade tesnet deposit contract version
* Remove unnecessary logging and correct formatting
* Add a hardcoded eth2 testnet config
* Ensure http server flag works. Overwrite configs with flags.
* Ensure boot nodes are loaded from testnet dir
* Fix account manager CLI bugs
* Fix bugs with beacon node cli
* Allow testnet dir without boot nodes
* Write genesis state as SSZ
* Remove ---/n from the start of testnet_dir files
* Set default libp2p address
* Tidy account manager CLI, add logging
* Add check to see if testnet dir exists
* Apply reviewers suggestions
* Add HeadTracker struct
* Add fork choice persistence
* Shorten slot time for simulator
* Add the /beacon/heads API endpoint
* Update hardcoded testnet
* Add tests for BeaconChain persistence + fix bugs
* Extend BeaconChain persistence testing
* Ensure chain is finalized b4 persistence tests
* Ensure boot_enr.yaml is include in binary
* Refactor beacon_chain_sim
* Move files about in beacon sim
* Update beacon_chain_sim
* Fix bug with deposit inclusion
* Increase log in genesis service, fix todo
* Tidy sim, fix broken rest_api tests
* Fix more broken tests
* Update testnet
* Fix broken rest api test
* Tidy account manager CLI
* Use tempdir for account manager
* Stop hardcoded testnet dir from creating dir
* Rename Eth2TestnetDir to Eth2TestnetConfig
* Change hardcoded -> hard_coded
* Tidy account manager
* Add log to account manager
* Tidy, ensure head tracker is loaded from disk
* Tidy beacon chain builder
* Tidy eth1_chain
* Adds log support for simulator
* Revert "Adds log support for simulator"
This reverts commit ec77c66a052350f551db145cf20f213823428dd3.
* Adds log support for simulator
* Tidy after self-review
* Change default log level
* Address Michael's delicious PR comments
* Fix off-by-one in tests
2019-12-03 04:28:57 +00:00
|
|
|
/// result in a change to `state.eth1_data`.
|
|
|
|
pub fn get_new_eth1_data<T: EthSpec>(
|
|
|
|
state: &BeaconState<T>,
|
|
|
|
eth1_data: &Eth1Data,
|
2020-04-20 02:35:11 +00:00
|
|
|
) -> Result<Option<Eth1Data>, ArithError> {
|
2019-05-20 02:42:02 +00:00
|
|
|
let num_votes = state
|
2021-07-09 06:15:32 +00:00
|
|
|
.eth1_data_votes()
|
2019-03-06 04:22:45 +00:00
|
|
|
.iter()
|
2019-05-20 02:42:02 +00:00
|
|
|
.filter(|vote| *vote == eth1_data)
|
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
|
|
|
.count();
|
2019-05-20 02:42:02 +00:00
|
|
|
|
Prepare for public testnet (#628)
* Update to spec v0.9.0
* Update to v0.9.1
* Bump spec tags for v0.9.1
* Formatting, fix CI failures
* Resolve accidental KeyPair merge conflict
* Document new BeaconState functions
* Add `validator` changes from `validator-to-rest`
* Add initial (failing) REST api tests
* Fix signature parsing
* Add more tests
* Refactor http router
* Add working tests for publish beacon block
* Add validator duties tests
* Move account_manager under `lighthouse` binary
* Unify logfile handling in `environment` crate.
* Fix incorrect cache drops in `advance_caches`
* Update fork choice for v0.9.1
* Add `deposit_contract` crate
* Add progress on validator onboarding
* Add unfinished attesation code
* Update account manager CLI
* Write eth1 data file as hex string
* Integrate ValidatorDirectory with validator_client
* Move ValidatorDirectory into validator_client
* Clean up some FIXMEs
* Add beacon_chain_sim
* Fix a few docs/logs
* Expand `beacon_chain_sim`
* Fix spec for `beacon_chain_sim
* More testing for api
* Start work on attestation endpoint
* Reject empty attestations
* Allow attestations to genesis block
* Add working tests for `rest_api` validator endpoint
* Remove grpc from beacon_node
* Start heavy refactor of validator client
- Block production is working
* Prune old validator client files
* Start works on attestation service
* Add attestation service to validator client
* Use full pubkey for validator directories
* Add validator duties post endpoint
* Use par_iter for keypair generation
* Use bulk duties request in validator client
* Add version http endpoint tests
* Add interop keys and startup wait
* Ensure a prompt exit
* Add duties pruning
* Fix compile error in beacon node tests
* Add github workflow
* Modify rust.yaml
* Modify gitlab actions
* Add to CI file
* Add sudo to CI npm install
* Move cargo fmt to own job in tests
* Fix cargo fmt in CI
* Add rustup update before cargo fmt
* Change name of CI job
* Make other CI jobs require cargo fmt
* Add CI badge
* Remove gitlab and travis files
* Add different http timeout for debug
* Update docker file, use makefile in CI
* Use make in the dockerfile, skip the test
* Use the makefile for debug GI test
* Update book
* Tidy grpc and misc things
* Apply discv5 fixes
* Address other minor issues
* Fix warnings
* Attempt fix for addr parsing
* Tidy validator config, CLIs
* Tidy comments
* Tidy signing, reduce ForkService duplication
* Fail if skipping too many slots
* Set default recent genesis time to 0
* Add custom http timeout to validator
* Fix compile bug in node_test_rig
* Remove old bootstrap flag from val CLI
* Update docs
* Tidy val client
* Change val client log levels
* Add comments, more validity checks
* Fix compile error, add comments
* Undo changes to eth2-libp2p/src
* Reduce duplication of keypair generation
* Add more logging for validator duties
* Fix beacon_chain_sim, nitpicks
* Fix compile error, minor nits
* Update to use v0.9.2 version of deposit contract
* Add efforts to automate eth1 testnet deployment
* Fix lcli testnet deployer
* Modify bn CLI to parse eth2_testnet_dir
* Progress with account_manager deposit tools
* Make account manager submit deposits
* Add password option for submitting deposits
* Allow custom deposit amount
* Add long names to lcli clap
* Add password option to lcli deploy command
* Fix minor bugs whilst testing
* Address Michael's comments
* Add refund-deposit-contract to lcli
* Use time instead of skip count for denying long skips
* Improve logging for eth1
* Fix bug with validator services exiting on error
* Drop the block cache after genesis
* Modify eth1 testnet config
* Improve eth1 logging
* Make validator wait until genesis time
* Fix bug in eth1 voting
* Add more logging to eth1 voting
* Handle errors in eth1 http module
* Set SECONDS_PER_DAY to sensible minimum
* Shorten delay before testnet start
* Ensure eth1 block is produced without any votes
* Improve eth1 logging
* Fix broken tests in eth1
* Tidy code in rest_api
* Fix failing test in deposit_contract
* Make CLI args more consistent
* Change validator/duties endpoint
* Add time-based skip slot limiting
* Add new error type missed in previous commit
* Add log when waiting for genesis
* Refactor beacon node CLI
* Remove unused dep
* Add lcli eth1-genesis command
* Fix bug in master merge
* Apply clippy lints to beacon node
* Add support for YamlConfig in Eth2TestnetDir
* Upgrade tesnet deposit contract version
* Remove unnecessary logging and correct formatting
* Add a hardcoded eth2 testnet config
* Ensure http server flag works. Overwrite configs with flags.
* Ensure boot nodes are loaded from testnet dir
* Fix account manager CLI bugs
* Fix bugs with beacon node cli
* Allow testnet dir without boot nodes
* Write genesis state as SSZ
* Remove ---/n from the start of testnet_dir files
* Set default libp2p address
* Tidy account manager CLI, add logging
* Add check to see if testnet dir exists
* Apply reviewers suggestions
* Add HeadTracker struct
* Add fork choice persistence
* Shorten slot time for simulator
* Add the /beacon/heads API endpoint
* Update hardcoded testnet
* Add tests for BeaconChain persistence + fix bugs
* Extend BeaconChain persistence testing
* Ensure chain is finalized b4 persistence tests
* Ensure boot_enr.yaml is include in binary
* Refactor beacon_chain_sim
* Move files about in beacon sim
* Update beacon_chain_sim
* Fix bug with deposit inclusion
* Increase log in genesis service, fix todo
* Tidy sim, fix broken rest_api tests
* Fix more broken tests
* Update testnet
* Fix broken rest api test
* Tidy account manager CLI
* Use tempdir for account manager
* Stop hardcoded testnet dir from creating dir
* Rename Eth2TestnetDir to Eth2TestnetConfig
* Change hardcoded -> hard_coded
* Tidy account manager
* Add log to account manager
* Tidy, ensure head tracker is loaded from disk
* Tidy beacon chain builder
* Tidy eth1_chain
* Adds log support for simulator
* Revert "Adds log support for simulator"
This reverts commit ec77c66a052350f551db145cf20f213823428dd3.
* Adds log support for simulator
* Tidy after self-review
* Change default log level
* Address Michael's delicious PR comments
* Fix off-by-one in tests
2019-12-03 04:28:57 +00:00
|
|
|
// The +1 is to account for the `eth1_data` supplied to the function.
|
2020-04-20 02:35:11 +00:00
|
|
|
if num_votes.safe_add(1)?.safe_mul(2)? > T::SlotsPerEth1VotingPeriod::to_usize() {
|
|
|
|
Ok(Some(eth1_data.clone()))
|
Prepare for public testnet (#628)
* Update to spec v0.9.0
* Update to v0.9.1
* Bump spec tags for v0.9.1
* Formatting, fix CI failures
* Resolve accidental KeyPair merge conflict
* Document new BeaconState functions
* Add `validator` changes from `validator-to-rest`
* Add initial (failing) REST api tests
* Fix signature parsing
* Add more tests
* Refactor http router
* Add working tests for publish beacon block
* Add validator duties tests
* Move account_manager under `lighthouse` binary
* Unify logfile handling in `environment` crate.
* Fix incorrect cache drops in `advance_caches`
* Update fork choice for v0.9.1
* Add `deposit_contract` crate
* Add progress on validator onboarding
* Add unfinished attesation code
* Update account manager CLI
* Write eth1 data file as hex string
* Integrate ValidatorDirectory with validator_client
* Move ValidatorDirectory into validator_client
* Clean up some FIXMEs
* Add beacon_chain_sim
* Fix a few docs/logs
* Expand `beacon_chain_sim`
* Fix spec for `beacon_chain_sim
* More testing for api
* Start work on attestation endpoint
* Reject empty attestations
* Allow attestations to genesis block
* Add working tests for `rest_api` validator endpoint
* Remove grpc from beacon_node
* Start heavy refactor of validator client
- Block production is working
* Prune old validator client files
* Start works on attestation service
* Add attestation service to validator client
* Use full pubkey for validator directories
* Add validator duties post endpoint
* Use par_iter for keypair generation
* Use bulk duties request in validator client
* Add version http endpoint tests
* Add interop keys and startup wait
* Ensure a prompt exit
* Add duties pruning
* Fix compile error in beacon node tests
* Add github workflow
* Modify rust.yaml
* Modify gitlab actions
* Add to CI file
* Add sudo to CI npm install
* Move cargo fmt to own job in tests
* Fix cargo fmt in CI
* Add rustup update before cargo fmt
* Change name of CI job
* Make other CI jobs require cargo fmt
* Add CI badge
* Remove gitlab and travis files
* Add different http timeout for debug
* Update docker file, use makefile in CI
* Use make in the dockerfile, skip the test
* Use the makefile for debug GI test
* Update book
* Tidy grpc and misc things
* Apply discv5 fixes
* Address other minor issues
* Fix warnings
* Attempt fix for addr parsing
* Tidy validator config, CLIs
* Tidy comments
* Tidy signing, reduce ForkService duplication
* Fail if skipping too many slots
* Set default recent genesis time to 0
* Add custom http timeout to validator
* Fix compile bug in node_test_rig
* Remove old bootstrap flag from val CLI
* Update docs
* Tidy val client
* Change val client log levels
* Add comments, more validity checks
* Fix compile error, add comments
* Undo changes to eth2-libp2p/src
* Reduce duplication of keypair generation
* Add more logging for validator duties
* Fix beacon_chain_sim, nitpicks
* Fix compile error, minor nits
* Update to use v0.9.2 version of deposit contract
* Add efforts to automate eth1 testnet deployment
* Fix lcli testnet deployer
* Modify bn CLI to parse eth2_testnet_dir
* Progress with account_manager deposit tools
* Make account manager submit deposits
* Add password option for submitting deposits
* Allow custom deposit amount
* Add long names to lcli clap
* Add password option to lcli deploy command
* Fix minor bugs whilst testing
* Address Michael's comments
* Add refund-deposit-contract to lcli
* Use time instead of skip count for denying long skips
* Improve logging for eth1
* Fix bug with validator services exiting on error
* Drop the block cache after genesis
* Modify eth1 testnet config
* Improve eth1 logging
* Make validator wait until genesis time
* Fix bug in eth1 voting
* Add more logging to eth1 voting
* Handle errors in eth1 http module
* Set SECONDS_PER_DAY to sensible minimum
* Shorten delay before testnet start
* Ensure eth1 block is produced without any votes
* Improve eth1 logging
* Fix broken tests in eth1
* Tidy code in rest_api
* Fix failing test in deposit_contract
* Make CLI args more consistent
* Change validator/duties endpoint
* Add time-based skip slot limiting
* Add new error type missed in previous commit
* Add log when waiting for genesis
* Refactor beacon node CLI
* Remove unused dep
* Add lcli eth1-genesis command
* Fix bug in master merge
* Apply clippy lints to beacon node
* Add support for YamlConfig in Eth2TestnetDir
* Upgrade tesnet deposit contract version
* Remove unnecessary logging and correct formatting
* Add a hardcoded eth2 testnet config
* Ensure http server flag works. Overwrite configs with flags.
* Ensure boot nodes are loaded from testnet dir
* Fix account manager CLI bugs
* Fix bugs with beacon node cli
* Allow testnet dir without boot nodes
* Write genesis state as SSZ
* Remove ---/n from the start of testnet_dir files
* Set default libp2p address
* Tidy account manager CLI, add logging
* Add check to see if testnet dir exists
* Apply reviewers suggestions
* Add HeadTracker struct
* Add fork choice persistence
* Shorten slot time for simulator
* Add the /beacon/heads API endpoint
* Update hardcoded testnet
* Add tests for BeaconChain persistence + fix bugs
* Extend BeaconChain persistence testing
* Ensure chain is finalized b4 persistence tests
* Ensure boot_enr.yaml is include in binary
* Refactor beacon_chain_sim
* Move files about in beacon sim
* Update beacon_chain_sim
* Fix bug with deposit inclusion
* Increase log in genesis service, fix todo
* Tidy sim, fix broken rest_api tests
* Fix more broken tests
* Update testnet
* Fix broken rest api test
* Tidy account manager CLI
* Use tempdir for account manager
* Stop hardcoded testnet dir from creating dir
* Rename Eth2TestnetDir to Eth2TestnetConfig
* Change hardcoded -> hard_coded
* Tidy account manager
* Add log to account manager
* Tidy, ensure head tracker is loaded from disk
* Tidy beacon chain builder
* Tidy eth1_chain
* Adds log support for simulator
* Revert "Adds log support for simulator"
This reverts commit ec77c66a052350f551db145cf20f213823428dd3.
* Adds log support for simulator
* Tidy after self-review
* Change default log level
* Address Michael's delicious PR comments
* Fix off-by-one in tests
2019-12-03 04:28:57 +00:00
|
|
|
} else {
|
2020-04-20 02:35:11 +00:00
|
|
|
Ok(None)
|
2019-03-06 04:22:45 +00:00
|
|
|
}
|
2019-03-06 06:03:18 +00:00
|
|
|
}
|
2021-09-08 18:45:22 +00:00
|
|
|
|
2021-11-17 00:45:30 +00:00
|
|
|
/// Performs *partial* verification of the `payload`.
|
|
|
|
///
|
|
|
|
/// The verification is partial, since the execution payload is not verified against an execution
|
|
|
|
/// engine. That is expected to be performed by an upstream function.
|
|
|
|
///
|
|
|
|
/// ## Specification
|
|
|
|
///
|
|
|
|
/// Contains a partial set of checks from the `process_execution_payload` function:
|
|
|
|
///
|
|
|
|
/// https://github.com/ethereum/consensus-specs/blob/v1.1.5/specs/merge/beacon-chain.md#process_execution_payload
|
2022-10-14 22:35:10 +00:00
|
|
|
pub fn partially_verify_execution_payload<'payload, T: EthSpec, Payload: AbstractExecPayload<T>>(
|
2021-11-17 00:45:30 +00:00
|
|
|
state: &BeaconState<T>,
|
2022-10-14 22:35:10 +00:00
|
|
|
payload: Payload::Ref<'payload>,
|
2021-09-08 18:45:22 +00:00
|
|
|
spec: &ChainSpec,
|
|
|
|
) -> Result<(), BlockProcessingError> {
|
2021-12-12 09:04:21 +00:00
|
|
|
if is_merge_transition_complete(state) {
|
2021-09-08 18:45:22 +00:00
|
|
|
block_verify!(
|
2022-10-26 19:15:26 +00:00
|
|
|
payload.parent_hash() == state.latest_execution_payload_header()?.block_hash(),
|
2021-09-08 18:45:22 +00:00
|
|
|
BlockProcessingError::ExecutionHashChainIncontiguous {
|
2022-10-26 19:15:26 +00:00
|
|
|
expected: state.latest_execution_payload_header()?.block_hash(),
|
2022-03-31 07:52:23 +00:00
|
|
|
found: payload.parent_hash(),
|
2021-09-08 18:45:22 +00:00
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
2021-09-26 23:42:29 +00:00
|
|
|
block_verify!(
|
2022-03-31 07:52:23 +00:00
|
|
|
payload.prev_randao() == *state.get_randao_mix(state.current_epoch())?,
|
2021-09-26 23:42:29 +00:00
|
|
|
BlockProcessingError::ExecutionRandaoMismatch {
|
|
|
|
expected: *state.get_randao_mix(state.current_epoch())?,
|
2022-03-31 07:52:23 +00:00
|
|
|
found: payload.prev_randao(),
|
2021-09-26 23:42:29 +00:00
|
|
|
}
|
|
|
|
);
|
2021-09-08 18:45:22 +00:00
|
|
|
|
|
|
|
let timestamp = compute_timestamp_at_slot(state, spec)?;
|
|
|
|
block_verify!(
|
2022-03-31 07:52:23 +00:00
|
|
|
payload.timestamp() == timestamp,
|
2021-09-08 18:45:22 +00:00
|
|
|
BlockProcessingError::ExecutionInvalidTimestamp {
|
|
|
|
expected: timestamp,
|
2022-03-31 07:52:23 +00:00
|
|
|
found: payload.timestamp(),
|
2021-09-08 18:45:22 +00:00
|
|
|
}
|
|
|
|
);
|
|
|
|
|
2021-11-17 00:45:30 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Calls `partially_verify_execution_payload` and then updates the payload header in the `state`.
|
|
|
|
///
|
|
|
|
/// ## Specification
|
|
|
|
///
|
|
|
|
/// Partially equivalent to the `process_execution_payload` function:
|
|
|
|
///
|
|
|
|
/// https://github.com/ethereum/consensus-specs/blob/v1.1.5/specs/merge/beacon-chain.md#process_execution_payload
|
2022-10-14 22:35:10 +00:00
|
|
|
pub fn process_execution_payload<'payload, T: EthSpec, Payload: AbstractExecPayload<T>>(
|
2021-11-17 00:45:30 +00:00
|
|
|
state: &mut BeaconState<T>,
|
2022-10-14 22:35:10 +00:00
|
|
|
payload: Payload::Ref<'payload>,
|
2021-11-17 00:45:30 +00:00
|
|
|
spec: &ChainSpec,
|
|
|
|
) -> Result<(), BlockProcessingError> {
|
2022-10-14 22:35:10 +00:00
|
|
|
partially_verify_execution_payload::<T, Payload>(state, payload, spec)?;
|
2021-11-17 00:45:30 +00:00
|
|
|
|
2022-10-14 22:35:10 +00:00
|
|
|
match state.latest_execution_payload_header_mut()? {
|
|
|
|
ExecutionPayloadHeaderRefMut::Merge(header_mut) => {
|
|
|
|
match payload.to_execution_payload_header() {
|
|
|
|
ExecutionPayloadHeader::Merge(header) => *header_mut = header,
|
|
|
|
_ => return Err(BlockProcessingError::IncorrectStateType),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ExecutionPayloadHeaderRefMut::Capella(header_mut) => {
|
|
|
|
match payload.to_execution_payload_header() {
|
|
|
|
ExecutionPayloadHeader::Capella(header) => *header_mut = header,
|
|
|
|
_ => return Err(BlockProcessingError::IncorrectStateType),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ExecutionPayloadHeaderRefMut::Eip4844(header_mut) => {
|
|
|
|
match payload.to_execution_payload_header() {
|
|
|
|
ExecutionPayloadHeader::Eip4844(header) => *header_mut = header,
|
|
|
|
_ => return Err(BlockProcessingError::IncorrectStateType),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-09-08 18:45:22 +00:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
/// These functions will definitely be called before the merge. Their entire purpose is to check if
|
|
|
|
/// the merge has happened or if we're on the transition block. Thus we don't want to propagate
|
|
|
|
/// errors from the `BeaconState` being an earlier variant than `BeaconStateMerge` as we'd have to
|
|
|
|
/// repeaetedly write code to treat these errors as false.
|
2022-10-13 22:07:32 +00:00
|
|
|
/// https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/beacon-chain.md#is_merge_transition_complete
|
2021-12-12 09:04:21 +00:00
|
|
|
pub fn is_merge_transition_complete<T: EthSpec>(state: &BeaconState<T>) -> bool {
|
2022-11-24 04:14:06 +00:00
|
|
|
// We must check defaultness against the payload header with 0x0 roots, as that's what's meant
|
|
|
|
// by `ExecutionPayloadHeader()` in the spec.
|
2021-09-08 18:45:22 +00:00
|
|
|
state
|
|
|
|
.latest_execution_payload_header()
|
2022-11-24 04:14:06 +00:00
|
|
|
.map(|header| !header.is_default_with_zero_roots())
|
2021-09-08 18:45:22 +00:00
|
|
|
.unwrap_or(false)
|
|
|
|
}
|
2022-10-13 22:07:32 +00:00
|
|
|
/// https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/beacon-chain.md#is_merge_transition_block
|
|
|
|
pub fn is_merge_transition_block<T: EthSpec, Payload: AbstractExecPayload<T>>(
|
2021-12-12 09:04:21 +00:00
|
|
|
state: &BeaconState<T>,
|
2022-03-31 07:52:23 +00:00
|
|
|
body: BeaconBlockBodyRef<T, Payload>,
|
2021-12-12 09:04:21 +00:00
|
|
|
) -> bool {
|
2022-11-24 04:14:06 +00:00
|
|
|
// For execution payloads in blocks (which may be headers) we must check defaultness against
|
|
|
|
// the payload with `transactions_root` equal to the tree hash of the empty list.
|
2021-09-08 18:45:22 +00:00
|
|
|
body.execution_payload()
|
2022-11-24 04:14:06 +00:00
|
|
|
.map(|payload| {
|
|
|
|
!is_merge_transition_complete(state) && !payload.is_default_with_empty_roots()
|
|
|
|
})
|
2021-09-08 18:45:22 +00:00
|
|
|
.unwrap_or(false)
|
|
|
|
}
|
2022-10-13 22:07:32 +00:00
|
|
|
/// https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/beacon-chain.md#is_execution_enabled
|
|
|
|
pub fn is_execution_enabled<T: EthSpec, Payload: AbstractExecPayload<T>>(
|
2021-09-08 18:45:22 +00:00
|
|
|
state: &BeaconState<T>,
|
2022-03-31 07:52:23 +00:00
|
|
|
body: BeaconBlockBodyRef<T, Payload>,
|
2021-09-08 18:45:22 +00:00
|
|
|
) -> bool {
|
2021-12-12 09:04:21 +00:00
|
|
|
is_merge_transition_block(state, body) || is_merge_transition_complete(state)
|
2021-09-08 18:45:22 +00:00
|
|
|
}
|
2022-10-13 22:07:32 +00:00
|
|
|
|
|
|
|
/// https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/beacon-chain.md#compute_timestamp_at_slot
|
2021-09-08 18:45:22 +00:00
|
|
|
pub fn compute_timestamp_at_slot<T: EthSpec>(
|
|
|
|
state: &BeaconState<T>,
|
|
|
|
spec: &ChainSpec,
|
|
|
|
) -> Result<u64, ArithError> {
|
|
|
|
let slots_since_genesis = state.slot().as_u64().safe_sub(spec.genesis_slot.as_u64())?;
|
|
|
|
slots_since_genesis
|
|
|
|
.safe_mul(spec.seconds_per_slot)
|
|
|
|
.and_then(|since_genesis| state.genesis_time().safe_add(since_genesis))
|
|
|
|
}
|
2022-11-14 00:20:27 +00:00
|
|
|
|
|
|
|
/// FIXME: add link to this function once the spec is stable
|
2022-11-22 18:27:48 +00:00
|
|
|
#[cfg(feature = "withdrawals")]
|
2022-11-14 00:20:27 +00:00
|
|
|
pub fn get_expected_withdrawals<T: EthSpec>(
|
|
|
|
state: &BeaconState<T>,
|
|
|
|
spec: &ChainSpec,
|
|
|
|
) -> Result<Withdrawals<T>, BlockProcessingError> {
|
|
|
|
let epoch = state.current_epoch();
|
2022-11-14 19:14:31 +00:00
|
|
|
let mut withdrawal_index = state.next_withdrawal_index()?;
|
|
|
|
let mut validator_index = state.next_withdrawal_validator_index()?;
|
2022-11-14 00:20:27 +00:00
|
|
|
let mut withdrawals = vec![];
|
|
|
|
|
2022-11-22 18:27:48 +00:00
|
|
|
if cfg!(not(feature = "withdrawals-processing")) {
|
|
|
|
return Ok(withdrawals.into());
|
|
|
|
}
|
|
|
|
|
2022-11-14 00:20:27 +00:00
|
|
|
for _ in 0..state.validators().len() {
|
|
|
|
let validator = state.get_validator(validator_index as usize)?;
|
2022-11-14 19:14:31 +00:00
|
|
|
let balance = *state.balances().get(validator_index as usize).ok_or(
|
|
|
|
BeaconStateError::BalancesOutOfBounds(validator_index as usize),
|
|
|
|
)?;
|
2022-11-14 00:20:27 +00:00
|
|
|
if validator.is_fully_withdrawable_at(balance, epoch, spec) {
|
|
|
|
withdrawals.push(Withdrawal {
|
|
|
|
index: withdrawal_index,
|
|
|
|
validator_index,
|
2022-11-14 19:14:31 +00:00
|
|
|
address: validator
|
|
|
|
.get_eth1_withdrawal_address(spec)
|
|
|
|
.ok_or(BlockProcessingError::WithdrawalCredentialsInvalid)?,
|
2022-11-14 00:20:27 +00:00
|
|
|
amount: balance,
|
|
|
|
});
|
|
|
|
withdrawal_index.safe_add_assign(1)?;
|
|
|
|
} else if validator.is_partially_withdrawable_validator(balance, spec) {
|
|
|
|
withdrawals.push(Withdrawal {
|
|
|
|
index: withdrawal_index,
|
|
|
|
validator_index,
|
2022-11-14 19:14:31 +00:00
|
|
|
address: validator
|
|
|
|
.get_eth1_withdrawal_address(spec)
|
|
|
|
.ok_or(BlockProcessingError::WithdrawalCredentialsInvalid)?,
|
2022-11-14 00:20:27 +00:00
|
|
|
amount: balance.safe_sub(spec.max_effective_balance)?,
|
|
|
|
});
|
|
|
|
withdrawal_index.safe_add_assign(1)?;
|
|
|
|
}
|
|
|
|
if withdrawals.len() == T::max_withdrawals_per_payload() {
|
|
|
|
break;
|
|
|
|
}
|
2022-11-14 19:14:31 +00:00
|
|
|
validator_index = validator_index
|
|
|
|
.safe_add(1)?
|
|
|
|
.safe_rem(state.validators().len() as u64)?;
|
2022-11-14 00:20:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Ok(withdrawals.into())
|
|
|
|
}
|
|
|
|
|
|
|
|
/// FIXME: add link to this function once the spec is stable
|
|
|
|
#[cfg(all(feature = "withdrawals", feature = "withdrawals-processing"))]
|
|
|
|
pub fn process_withdrawals<'payload, T: EthSpec, Payload: AbstractExecPayload<T>>(
|
|
|
|
state: &mut BeaconState<T>,
|
|
|
|
payload: Payload::Ref<'payload>,
|
|
|
|
spec: &ChainSpec,
|
|
|
|
) -> Result<(), BlockProcessingError> {
|
|
|
|
match state {
|
|
|
|
BeaconState::Merge(_) => Ok(()),
|
|
|
|
BeaconState::Capella(_) | BeaconState::Eip4844(_) => {
|
|
|
|
let expected_withdrawals = get_expected_withdrawals(state, spec)?;
|
2022-11-14 19:14:31 +00:00
|
|
|
let expected_root = expected_withdrawals.tree_hash_root();
|
2022-11-14 00:20:27 +00:00
|
|
|
let withdrawals_root = payload.withdrawals_root()?;
|
|
|
|
|
2022-11-14 19:14:31 +00:00
|
|
|
if expected_root != withdrawals_root {
|
2022-11-14 00:20:27 +00:00
|
|
|
return Err(BlockProcessingError::WithdrawalsRootMismatch {
|
2022-11-14 19:14:31 +00:00
|
|
|
expected: expected_root,
|
|
|
|
found: withdrawals_root,
|
2022-11-14 00:20:27 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
for withdrawal in expected_withdrawals.iter() {
|
|
|
|
decrease_balance(
|
|
|
|
state,
|
|
|
|
withdrawal.validator_index as usize,
|
|
|
|
withdrawal.amount,
|
|
|
|
)?;
|
|
|
|
}
|
|
|
|
|
|
|
|
if let Some(latest_withdrawal) = expected_withdrawals.last() {
|
2022-11-14 19:14:31 +00:00
|
|
|
*state.next_withdrawal_index_mut()? = latest_withdrawal.index.safe_add(1)?;
|
|
|
|
let next_validator_index = latest_withdrawal
|
|
|
|
.validator_index
|
|
|
|
.safe_add(1)?
|
|
|
|
.safe_rem(state.validators().len() as u64)?;
|
2022-11-14 00:20:27 +00:00
|
|
|
*state.next_withdrawal_validator_index_mut()? = next_validator_index;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
// these shouldn't even be encountered but they're here for completeness
|
|
|
|
BeaconState::Base(_) | BeaconState::Altair(_) => Ok(()),
|
|
|
|
}
|
|
|
|
}
|