Add Proposer Cache Pruning & POS Activated Banner (#3109)

## Issue Addressed

The proposers cache wasn't being pruned. Also didn't have a celebratory banner for the merge 😄

## Banner
![pos_log_panda](https://user-images.githubusercontent.com/37123614/159528545-3aa54cbd-9362-49b1-830c-f4402f6ac341.png)
This commit is contained in:
ethDreamer 2022-03-22 21:33:38 +00:00
parent 116c5721a3
commit af50130e21
4 changed files with 55 additions and 14 deletions

View File

@ -59,7 +59,7 @@ use fork_choice::{ForkChoice, ForkChoiceStore, PayloadVerificationStatus};
use parking_lot::RwLockReadGuard; use parking_lot::RwLockReadGuard;
use proto_array::Block as ProtoBlock; use proto_array::Block as ProtoBlock;
use safe_arith::ArithError; use safe_arith::ArithError;
use slog::{debug, error, Logger}; use slog::{debug, error, info, Logger};
use slot_clock::SlotClock; use slot_clock::SlotClock;
use ssz::Encode; use ssz::Encode;
use state_processing::per_block_processing::is_merge_transition_block; use state_processing::per_block_processing::is_merge_transition_block;
@ -81,6 +81,30 @@ use types::{
SignedBeaconBlock, SignedBeaconBlockHeader, Slot, SignedBeaconBlock, SignedBeaconBlockHeader, Slot,
}; };
const POS_PANDA_BANNER: &str = r#"
,,, ,,, ,,, ,,,
;" ^; ;' ", ;" ^; ;' ",
; s$$$$$$$s ; ; s$$$$$$$s ;
, ss$$$$$$$$$$s ,' ooooooooo. .oooooo. .oooooo..o , ss$$$$$$$$$$s ,'
;s$$$$$$$$$$$$$$$ `888 `Y88. d8P' `Y8b d8P' `Y8 ;s$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$ 888 .d88'888 888Y88bo. $$$$$$$$$$$$$$$$$$
$$$$P""Y$$$Y""W$$$$$ 888ooo88P' 888 888 `"Y8888o. $$$$P""Y$$$Y""W$$$$$
$$$$ p"$$$"q $$$$$ 888 888 888 `"Y88b $$$$ p"$$$"q $$$$$
$$$$ .$$$$$. $$$$ 888 `88b d88'oo .d8P $$$$ .$$$$$. $$$$
$$DcaU$$$$$$$$$$ o888o `Y8bood8P' 8""88888P' $$DcaU$$$$$$$$$$
"Y$$$"*"$$$Y" "Y$$$"*"$$$Y"
"$b.$$" "$b.$$"
.o. . o8o . .o8
.888. .o8 `"' .o8 "888
.8"888. .ooooo. .o888oooooo oooo ooo .oooo. .o888oo .ooooo. .oooo888
.8' `888. d88' `"Y8 888 `888 `88. .8' `P )88b 888 d88' `88bd88' `888
.88ooo8888. 888 888 888 `88..8' .oP"888 888 888ooo888888 888
.8' `888. 888 .o8 888 . 888 `888' d8( 888 888 .888 .o888 888
o88o o8888o`Y8bod8P' "888"o888o `8' `Y888""8o "888"`Y8bod8P'`Y8bod88P"
"#;
/// Maximum block slot number. Block with slots bigger than this constant will NOT be processed. /// Maximum block slot number. Block with slots bigger than this constant will NOT be processed.
const MAXIMUM_BLOCK_SLOT_NUMBER: u64 = 4_294_967_296; // 2^32 const MAXIMUM_BLOCK_SLOT_NUMBER: u64 = 4_294_967_296; // 2^32
@ -1118,9 +1142,13 @@ impl<'a, T: BeaconChainTypes> FullyVerifiedBlock<'a, T> {
// early. // early.
// - Doing the check here means we can keep our fork-choice implementation "pure". I.e., no // - Doing the check here means we can keep our fork-choice implementation "pure". I.e., no
// calls to remote servers. // calls to remote servers.
let valid_merge_transition_block =
if is_merge_transition_block(&state, block.message().body()) { if is_merge_transition_block(&state, block.message().body()) {
validate_merge_block(chain, block.message())? validate_merge_block(chain, block.message())?;
} true
} else {
false
};
// The specification declares that this should be run *inside* `per_block_processing`, // The specification declares that this should be run *inside* `per_block_processing`,
// however we run it here to keep `per_block_processing` pure (i.e., no calls to external // however we run it here to keep `per_block_processing` pure (i.e., no calls to external
@ -1264,6 +1292,14 @@ impl<'a, T: BeaconChainTypes> FullyVerifiedBlock<'a, T> {
}); });
} }
if valid_merge_transition_block {
info!(chain.log, "{}", POS_PANDA_BANNER);
info!(chain.log, "Proof of Stake Activated"; "slot" => block.slot());
info!(chain.log, ""; "Terminal POW Block Hash" => ?block.message().execution_payload()?.parent_hash.into_root());
info!(chain.log, ""; "Merge Transition Block Root" => ?block.message().tree_hash_root());
info!(chain.log, ""; "Merge Transition Execution Hash" => ?block.message().execution_payload()?.block_hash.into_root());
}
Ok(Self { Ok(Self {
block, block,
block_root, block_root,

View File

@ -704,8 +704,7 @@ where
execution_layer.spawn_watchdog_routine(beacon_chain.slot_clock.clone()); execution_layer.spawn_watchdog_routine(beacon_chain.slot_clock.clone());
// Spawn a routine that removes expired proposer preparations. // Spawn a routine that removes expired proposer preparations.
execution_layer execution_layer.spawn_clean_proposer_caches_routine::<TSlotClock, TEthSpec>(
.spawn_clean_proposer_preparation_routine::<TSlotClock, TEthSpec>(
beacon_chain.slot_clock.clone(), beacon_chain.slot_clock.clone(),
); );

View File

@ -374,8 +374,8 @@ impl ExecutionLayer {
self.engines().upcheck_not_synced(Logging::Disabled).await; self.engines().upcheck_not_synced(Logging::Disabled).await;
} }
/// Spawns a routine which cleans the cached proposer preparations periodically. /// Spawns a routine which cleans the cached proposer data periodically.
pub fn spawn_clean_proposer_preparation_routine<S: SlotClock + 'static, T: EthSpec>( pub fn spawn_clean_proposer_caches_routine<S: SlotClock + 'static, T: EthSpec>(
&self, &self,
slot_clock: S, slot_clock: S,
) { ) {
@ -393,7 +393,7 @@ impl ExecutionLayer {
.map(|slot| slot.epoch(T::slots_per_epoch())) .map(|slot| slot.epoch(T::slots_per_epoch()))
{ {
Some(current_epoch) => el Some(current_epoch) => el
.clean_proposer_preparation(current_epoch) .clean_proposer_caches::<T>(current_epoch)
.await .await
.map_err(|e| { .map_err(|e| {
error!( error!(
@ -473,8 +473,8 @@ impl ExecutionLayer {
} }
} }
/// Removes expired entries from cached proposer preparations /// Removes expired entries from proposer_preparation_data and proposers caches
async fn clean_proposer_preparation(&self, current_epoch: Epoch) -> Result<(), Error> { async fn clean_proposer_caches<T: EthSpec>(&self, current_epoch: Epoch) -> Result<(), Error> {
let mut proposer_preparation_data = self.proposer_preparation_data().await; let mut proposer_preparation_data = self.proposer_preparation_data().await;
// Keep all entries that have been updated in the last 2 epochs // Keep all entries that have been updated in the last 2 epochs
@ -482,6 +482,13 @@ impl ExecutionLayer {
proposer_preparation_data.retain(|_validator_index, preparation_entry| { proposer_preparation_data.retain(|_validator_index, preparation_entry| {
preparation_entry.update_epoch >= retain_epoch preparation_entry.update_epoch >= retain_epoch
}); });
drop(proposer_preparation_data);
let retain_slot = retain_epoch.start_slot(T::slots_per_epoch());
self.proposers()
.write()
.await
.retain(|proposer_key, _proposer| proposer_key.slot >= retain_slot);
Ok(()) Ok(())
} }

View File

@ -954,7 +954,6 @@ pub fn serve<T: BeaconChainTypes>(
delay, delay,
); );
match chain.process_block(block.clone()) { match chain.process_block(block.clone()) {
Ok(root) => { Ok(root) => {
info!( info!(