Fixed some stuff in state processing (#3640)

This commit is contained in:
ethDreamer 2022-10-13 17:07:32 -05:00 committed by GitHub
parent 255fdf0724
commit c1c5dc0a64
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 32 additions and 31 deletions

View File

@ -67,7 +67,7 @@ pub fn initialize_beacon_state_from_eth1<T: EthSpec>(
state.fork_mut().previous_version = spec.bellatrix_fork_version; state.fork_mut().previous_version = spec.bellatrix_fork_version;
// Override latest execution payload header. // Override latest execution payload header.
// See https://github.com/ethereum/consensus-specs/blob/v1.1.0/specs/merge/beacon-chain.md#testing // See https://github.com/ethereum/consensus-specs/blob/v1.1.0/specs/bellatrix/beacon-chain.md#testing
*state.latest_execution_payload_header_mut()? = *state.latest_execution_payload_header_mut()? =
execution_payload_header.unwrap_or_default(); execution_payload_header.unwrap_or_default();
} }

View File

@ -87,7 +87,7 @@ pub enum VerifyBlockRoot {
/// re-calculating the root when it is already known. Note `block_root` should be equal to the /// 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 /// tree hash root of the block, NOT the signing root of the block. This function takes
/// care of mixing in the domain. /// care of mixing in the domain.
pub fn per_block_processing<T: EthSpec, Payload: ExecPayload<T>>( pub fn per_block_processing<T: EthSpec, Payload: AbstractExecPayload<T>>(
state: &mut BeaconState<T>, state: &mut BeaconState<T>,
signed_block: &SignedBeaconBlock<T, Payload>, signed_block: &SignedBeaconBlock<T, Payload>,
block_root: Option<Hash256>, block_root: Option<Hash256>,
@ -232,7 +232,7 @@ pub fn process_block_header<T: EthSpec>(
/// Verifies the signature of a block. /// Verifies the signature of a block.
/// ///
/// Spec v0.12.1 /// Spec v0.12.1
pub fn verify_block_signature<T: EthSpec, Payload: ExecPayload<T>>( pub fn verify_block_signature<T: EthSpec, Payload: AbstractExecPayload<T>>(
state: &BeaconState<T>, state: &BeaconState<T>,
block: &SignedBeaconBlock<T, Payload>, block: &SignedBeaconBlock<T, Payload>,
block_root: Option<Hash256>, block_root: Option<Hash256>,
@ -255,7 +255,7 @@ pub fn verify_block_signature<T: EthSpec, Payload: ExecPayload<T>>(
/// Verifies the `randao_reveal` against the block's proposer pubkey and updates /// Verifies the `randao_reveal` against the block's proposer pubkey and updates
/// `state.latest_randao_mixes`. /// `state.latest_randao_mixes`.
pub fn process_randao<T: EthSpec, Payload: ExecPayload<T>>( pub fn process_randao<T: EthSpec, Payload: AbstractExecPayload<T>>(
state: &mut BeaconState<T>, state: &mut BeaconState<T>,
block: BeaconBlockRef<'_, T, Payload>, block: BeaconBlockRef<'_, T, Payload>,
verify_signatures: VerifySignatures, verify_signatures: VerifySignatures,
@ -376,30 +376,31 @@ pub fn process_execution_payload<T: EthSpec, Payload: ExecPayload<T>>(
/// the merge has happened or if we're on the transition block. Thus we don't want to propagate /// 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 /// errors from the `BeaconState` being an earlier variant than `BeaconStateMerge` as we'd have to
/// repeaetedly write code to treat these errors as false. /// repeaetedly write code to treat these errors as false.
/// https://github.com/ethereum/consensus-specs/blob/dev/specs/merge/beacon-chain.md#is_merge_transition_complete /// https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/beacon-chain.md#is_merge_transition_complete
pub fn is_merge_transition_complete<T: EthSpec>(state: &BeaconState<T>) -> bool { pub fn is_merge_transition_complete<T: EthSpec>(state: &BeaconState<T>) -> bool {
state state
.latest_execution_payload_header() .latest_execution_payload_header()
.map(|header| *header != <ExecutionPayloadHeader<T>>::default()) .map(|header| *header != <ExecutionPayloadHeader<T>>::default())
.unwrap_or(false) .unwrap_or(false)
} }
/// https://github.com/ethereum/consensus-specs/blob/dev/specs/merge/beacon-chain.md#is_merge_transition_block /// 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: ExecPayload<T>>( pub fn is_merge_transition_block<T: EthSpec, Payload: AbstractExecPayload<T>>(
state: &BeaconState<T>, state: &BeaconState<T>,
body: BeaconBlockBodyRef<T, Payload>, body: BeaconBlockBodyRef<T, Payload>,
) -> bool { ) -> bool {
body.execution_payload() body.execution_payload()
.map(|payload| !is_merge_transition_complete(state) && *payload != Payload::default()) .map(|payload| !is_merge_transition_complete(state) && !payload.is_default())
.unwrap_or(false) .unwrap_or(false)
} }
/// https://github.com/ethereum/consensus-specs/blob/dev/specs/merge/beacon-chain.md#is_execution_enabled /// https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/beacon-chain.md#is_execution_enabled
pub fn is_execution_enabled<T: EthSpec, Payload: ExecPayload<T>>( pub fn is_execution_enabled<T: EthSpec, Payload: AbstractExecPayload<T>>(
state: &BeaconState<T>, state: &BeaconState<T>,
body: BeaconBlockBodyRef<T, Payload>, body: BeaconBlockBodyRef<T, Payload>,
) -> bool { ) -> bool {
is_merge_transition_block(state, body) || is_merge_transition_complete(state) is_merge_transition_block(state, body) || is_merge_transition_complete(state)
} }
/// https://github.com/ethereum/consensus-specs/blob/dev/specs/merge/beacon-chain.md#compute_timestamp_at_slot
/// https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/beacon-chain.md#compute_timestamp_at_slot
pub fn compute_timestamp_at_slot<T: EthSpec>( pub fn compute_timestamp_at_slot<T: EthSpec>(
state: &BeaconState<T>, state: &BeaconState<T>,
spec: &ChainSpec, spec: &ChainSpec,

View File

@ -7,8 +7,8 @@ use bls::{verify_signature_sets, PublicKey, PublicKeyBytes, SignatureSet};
use rayon::prelude::*; use rayon::prelude::*;
use std::borrow::Cow; use std::borrow::Cow;
use types::{ use types::{
BeaconState, BeaconStateError, ChainSpec, EthSpec, ExecPayload, Hash256, IndexedAttestation, AbstractExecPayload, BeaconState, BeaconStateError, ChainSpec, EthSpec, Hash256,
SignedBeaconBlock, IndexedAttestation, SignedBeaconBlock,
}; };
pub type Result<T> = std::result::Result<T, Error>; pub type Result<T> = std::result::Result<T, Error>;
@ -117,7 +117,7 @@ where
/// contains invalid signatures on deposits._ /// contains invalid signatures on deposits._
/// ///
/// See `Self::verify` for more detail. /// See `Self::verify` for more detail.
pub fn verify_entire_block<Payload: ExecPayload<T>>( pub fn verify_entire_block<Payload: AbstractExecPayload<T>>(
state: &'a BeaconState<T>, state: &'a BeaconState<T>,
get_pubkey: F, get_pubkey: F,
decompressor: D, decompressor: D,
@ -131,7 +131,7 @@ where
} }
/// Includes all signatures on the block (except the deposit signatures) for verification. /// Includes all signatures on the block (except the deposit signatures) for verification.
pub fn include_all_signatures<Payload: ExecPayload<T>>( pub fn include_all_signatures<Payload: AbstractExecPayload<T>>(
&mut self, &mut self,
block: &'a SignedBeaconBlock<T, Payload>, block: &'a SignedBeaconBlock<T, Payload>,
block_root: Option<Hash256>, block_root: Option<Hash256>,
@ -144,7 +144,7 @@ where
/// Includes all signatures on the block (except the deposit signatures and the proposal /// Includes all signatures on the block (except the deposit signatures and the proposal
/// signature) for verification. /// signature) for verification.
pub fn include_all_signatures_except_proposal<Payload: ExecPayload<T>>( pub fn include_all_signatures_except_proposal<Payload: AbstractExecPayload<T>>(
&mut self, &mut self,
block: &'a SignedBeaconBlock<T, Payload>, block: &'a SignedBeaconBlock<T, Payload>,
) -> Result<()> { ) -> Result<()> {
@ -160,7 +160,7 @@ where
} }
/// Includes the block signature for `self.block` for verification. /// Includes the block signature for `self.block` for verification.
pub fn include_block_proposal<Payload: ExecPayload<T>>( pub fn include_block_proposal<Payload: AbstractExecPayload<T>>(
&mut self, &mut self,
block: &'a SignedBeaconBlock<T, Payload>, block: &'a SignedBeaconBlock<T, Payload>,
block_root: Option<Hash256>, block_root: Option<Hash256>,
@ -177,7 +177,7 @@ where
} }
/// Includes the randao signature for `self.block` for verification. /// Includes the randao signature for `self.block` for verification.
pub fn include_randao_reveal<Payload: ExecPayload<T>>( pub fn include_randao_reveal<Payload: AbstractExecPayload<T>>(
&mut self, &mut self,
block: &'a SignedBeaconBlock<T, Payload>, block: &'a SignedBeaconBlock<T, Payload>,
) -> Result<()> { ) -> Result<()> {
@ -192,7 +192,7 @@ where
} }
/// Includes all signatures in `self.block.body.proposer_slashings` for verification. /// Includes all signatures in `self.block.body.proposer_slashings` for verification.
pub fn include_proposer_slashings<Payload: ExecPayload<T>>( pub fn include_proposer_slashings<Payload: AbstractExecPayload<T>>(
&mut self, &mut self,
block: &'a SignedBeaconBlock<T, Payload>, block: &'a SignedBeaconBlock<T, Payload>,
) -> Result<()> { ) -> Result<()> {
@ -221,7 +221,7 @@ where
} }
/// Includes all signatures in `self.block.body.attester_slashings` for verification. /// Includes all signatures in `self.block.body.attester_slashings` for verification.
pub fn include_attester_slashings<Payload: ExecPayload<T>>( pub fn include_attester_slashings<Payload: AbstractExecPayload<T>>(
&mut self, &mut self,
block: &'a SignedBeaconBlock<T, Payload>, block: &'a SignedBeaconBlock<T, Payload>,
) -> Result<()> { ) -> Result<()> {
@ -250,7 +250,7 @@ where
} }
/// Includes all signatures in `self.block.body.attestations` for verification. /// Includes all signatures in `self.block.body.attestations` for verification.
pub fn include_attestations<Payload: ExecPayload<T>>( pub fn include_attestations<Payload: AbstractExecPayload<T>>(
&mut self, &mut self,
block: &'a SignedBeaconBlock<T, Payload>, block: &'a SignedBeaconBlock<T, Payload>,
) -> Result<Vec<IndexedAttestation<T>>> { ) -> Result<Vec<IndexedAttestation<T>>> {
@ -289,7 +289,7 @@ where
} }
/// Includes all signatures in `self.block.body.voluntary_exits` for verification. /// Includes all signatures in `self.block.body.voluntary_exits` for verification.
pub fn include_exits<Payload: ExecPayload<T>>( pub fn include_exits<Payload: AbstractExecPayload<T>>(
&mut self, &mut self,
block: &'a SignedBeaconBlock<T, Payload>, block: &'a SignedBeaconBlock<T, Payload>,
) -> Result<()> { ) -> Result<()> {
@ -313,7 +313,7 @@ where
} }
/// Include the signature of the block's sync aggregate (if it exists) for verification. /// Include the signature of the block's sync aggregate (if it exists) for verification.
pub fn include_sync_aggregate<Payload: ExecPayload<T>>( pub fn include_sync_aggregate<Payload: AbstractExecPayload<T>>(
&mut self, &mut self,
block: &'a SignedBeaconBlock<T, Payload>, block: &'a SignedBeaconBlock<T, Payload>,
) -> Result<()> { ) -> Result<()> {

View File

@ -9,7 +9,7 @@ use crate::VerifySignatures;
use safe_arith::SafeArith; use safe_arith::SafeArith;
use types::consts::altair::{PARTICIPATION_FLAG_WEIGHTS, PROPOSER_WEIGHT, WEIGHT_DENOMINATOR}; use types::consts::altair::{PARTICIPATION_FLAG_WEIGHTS, PROPOSER_WEIGHT, WEIGHT_DENOMINATOR};
pub fn process_operations<'a, T: EthSpec, Payload: ExecPayload<T>>( pub fn process_operations<'a, T: EthSpec, Payload: AbstractExecPayload<T>>(
state: &mut BeaconState<T>, state: &mut BeaconState<T>,
block_body: BeaconBlockBodyRef<'a, T, Payload>, block_body: BeaconBlockBodyRef<'a, T, Payload>,
proposer_index: u64, proposer_index: u64,
@ -219,7 +219,7 @@ pub fn process_attester_slashings<T: EthSpec>(
} }
/// Wrapper function to handle calling the correct version of `process_attestations` based on /// Wrapper function to handle calling the correct version of `process_attestations` based on
/// the fork. /// the fork.
pub fn process_attestations<'a, T: EthSpec, Payload: ExecPayload<T>>( pub fn process_attestations<'a, T: EthSpec, Payload: AbstractExecPayload<T>>(
state: &mut BeaconState<T>, state: &mut BeaconState<T>,
block_body: BeaconBlockBodyRef<'a, T, Payload>, block_body: BeaconBlockBodyRef<'a, T, Payload>,
proposer_index: u64, proposer_index: u64,

View File

@ -7,9 +7,9 @@ use ssz::DecodeError;
use std::borrow::Cow; use std::borrow::Cow;
use tree_hash::TreeHash; use tree_hash::TreeHash;
use types::{ use types::{
AggregateSignature, AttesterSlashing, BeaconBlockRef, BeaconState, BeaconStateError, ChainSpec, AbstractExecPayload, AggregateSignature, AttesterSlashing, BeaconBlockRef, BeaconState,
DepositData, Domain, Epoch, EthSpec, ExecPayload, Fork, Hash256, InconsistentFork, BeaconStateError, ChainSpec, DepositData, Domain, Epoch, EthSpec, ExecPayload, Fork, Hash256,
IndexedAttestation, ProposerSlashing, PublicKey, PublicKeyBytes, Signature, InconsistentFork, IndexedAttestation, ProposerSlashing, PublicKey, PublicKeyBytes, Signature,
SignedAggregateAndProof, SignedBeaconBlock, SignedBeaconBlockHeader, SignedAggregateAndProof, SignedBeaconBlock, SignedBeaconBlockHeader,
SignedContributionAndProof, SignedRoot, SignedVoluntaryExit, SigningData, Slot, SyncAggregate, SignedContributionAndProof, SignedRoot, SignedVoluntaryExit, SigningData, Slot, SyncAggregate,
SyncAggregatorSelectionData, Unsigned, SyncAggregatorSelectionData, Unsigned,
@ -71,7 +71,7 @@ where
} }
/// A signature set that is valid if a block was signed by the expected block producer. /// A signature set that is valid if a block was signed by the expected block producer.
pub fn block_proposal_signature_set<'a, T, F, Payload: ExecPayload<T>>( pub fn block_proposal_signature_set<'a, T, F, Payload: AbstractExecPayload<T>>(
state: &'a BeaconState<T>, state: &'a BeaconState<T>,
get_pubkey: F, get_pubkey: F,
signed_block: &'a SignedBeaconBlock<T, Payload>, signed_block: &'a SignedBeaconBlock<T, Payload>,
@ -108,7 +108,7 @@ where
/// Unlike `block_proposal_signature_set` this does **not** check that the proposer index is /// Unlike `block_proposal_signature_set` this does **not** check that the proposer index is
/// correct according to the shuffling. It should only be used if no suitable `BeaconState` is /// correct according to the shuffling. It should only be used if no suitable `BeaconState` is
/// available. /// available.
pub fn block_proposal_signature_set_from_parts<'a, T, F, Payload: ExecPayload<T>>( pub fn block_proposal_signature_set_from_parts<'a, T, F, Payload: AbstractExecPayload<T>>(
signed_block: &'a SignedBeaconBlock<T, Payload>, signed_block: &'a SignedBeaconBlock<T, Payload>,
block_root: Option<Hash256>, block_root: Option<Hash256>,
proposer_index: u64, proposer_index: u64,
@ -152,7 +152,7 @@ where
} }
/// A signature set that is valid if the block proposers randao reveal signature is correct. /// A signature set that is valid if the block proposers randao reveal signature is correct.
pub fn randao_signature_set<'a, T, F, Payload: ExecPayload<T>>( pub fn randao_signature_set<'a, T, F, Payload: AbstractExecPayload<T>>(
state: &'a BeaconState<T>, state: &'a BeaconState<T>,
get_pubkey: F, get_pubkey: F,
block: BeaconBlockRef<'a, T, Payload>, block: BeaconBlockRef<'a, T, Payload>,