mirror of
https://github.com/sigp/lighthouse.git
synced 2026-05-30 20:57:10 +00:00
Merge branch 'unstable' of https://github.com/sigp/lighthouse into gloas-range-sync
This commit is contained in:
@@ -4175,7 +4175,14 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
|
||||
};
|
||||
|
||||
// Read the cached head prior to taking the fork choice lock to avoid potential deadlocks.
|
||||
let old_head_slot = self.canonical_head.cached_head().head_slot();
|
||||
let cached_head = self.canonical_head.cached_head();
|
||||
let old_head_slot = cached_head.head_slot();
|
||||
|
||||
// Compute the expected proposer for `current_slot` on the canonical chain. This is used by
|
||||
// `on_block` to gate proposer boost on the block's proposer matching the canonical proposer
|
||||
// (per spec `update_proposer_boost_root` added in v1.7.0-alpha.5).
|
||||
let canonical_head_proposer_index =
|
||||
self.canonical_head_proposer_index(current_slot, &cached_head)?;
|
||||
|
||||
// Take an upgradable read lock on fork choice so we can check if this block has already
|
||||
// been imported. We don't want to repeat work importing a block that is already imported.
|
||||
@@ -4208,6 +4215,7 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
|
||||
block_delay,
|
||||
&state,
|
||||
payload_verification_status,
|
||||
canonical_head_proposer_index,
|
||||
&self.spec,
|
||||
)
|
||||
.map_err(|e| BlockError::BeaconChainError(Box::new(e.into())))?;
|
||||
@@ -4950,6 +4958,42 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
|
||||
}))
|
||||
}
|
||||
|
||||
/// Compute the expected beacon proposer for `slot` on the canonical chain extending `cached_head`.
|
||||
///
|
||||
/// Uses the beacon proposer cache to avoid recomputing the shuffling on every block import.
|
||||
///
|
||||
/// This is used by `update_proposer_boost_root` to gate proposer boost on the block's proposer
|
||||
/// matching the canonical proposer, per consensus-specs v1.7.0-alpha.5.
|
||||
///
|
||||
/// This function should never error unless there is some corruption of the head state. If a
|
||||
/// state advance is needed, it will be handled by the proposer cache.
|
||||
pub fn canonical_head_proposer_index(
|
||||
&self,
|
||||
slot: Slot,
|
||||
cached_head: &CachedHead<T::EthSpec>,
|
||||
) -> Result<u64, Error> {
|
||||
let proposal_epoch = slot.epoch(T::EthSpec::slots_per_epoch());
|
||||
let head_block_root = cached_head.head_block_root();
|
||||
let head_state = &cached_head.snapshot.beacon_state;
|
||||
|
||||
let shuffling_decision_root = head_state.proposer_shuffling_decision_root_at_epoch(
|
||||
proposal_epoch,
|
||||
head_block_root,
|
||||
&self.spec,
|
||||
)?;
|
||||
|
||||
self.with_proposer_cache::<_, Error>(
|
||||
shuffling_decision_root,
|
||||
proposal_epoch,
|
||||
|proposers| {
|
||||
proposers
|
||||
.get_slot::<T::EthSpec>(slot)
|
||||
.map(|p| p.index as u64)
|
||||
},
|
||||
|| Ok((cached_head.head_state_root(), head_state.clone())),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn get_expected_withdrawals(
|
||||
&self,
|
||||
forkchoice_update_params: &ForkchoiceUpdateParameters,
|
||||
@@ -5023,11 +5067,8 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
|
||||
}
|
||||
.ok_or(Error::MissingExecutionPayloadEnvelope(parent_block_root))?;
|
||||
|
||||
let parent_bid = advanced_state.latest_execution_payload_bid()?.clone();
|
||||
|
||||
apply_parent_execution_payload(
|
||||
&mut advanced_state,
|
||||
&parent_bid,
|
||||
&envelope.message.execution_requests,
|
||||
&self.spec,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user