fix tests

This commit is contained in:
Eitan Seri-Levi
2026-05-22 14:08:31 +03:00
parent 4760df5e6b
commit 5a34031b84
3 changed files with 21 additions and 26 deletions

View File

@@ -92,45 +92,35 @@ impl GossipVerifiedProposerPreferences {
return Err(ProposerPreferencesError::DependentRootNotCanonical { dependent_root });
}
let dependent_state_root = dependent_block.state_root;
let dependent_block_slot = dependent_block.slot;
drop(fork_choice);
// Fetch the state at the dependent_root block.
// Per spec, we need the checkpoint state at epoch (proposal_epoch - MIN_SEED_LOOKAHEAD).
// The dependent_root is the block root at the proposer shuffling decision slot.
let (state_root, mut dependent_state) = ctx
.store
.get_advanced_hot_state(dependent_root, dependent_block_slot, dependent_state_root)
.map_err(crate::BeaconChainError::DBError)?
.ok_or(ProposerPreferencesError::DependentRootUnknown { dependent_root })?;
// We need to advance the state to `target_epoch` so epoch transition runs and
// `process_proposer_lookahead` populates the lookahead for the proposal epoch.
// We need a state at `target_epoch` so we have the correct proposer lookahead.
let proposal_epoch = proposal_slot.epoch(T::EthSpec::slots_per_epoch());
let target_epoch = proposal_epoch.saturating_sub(ctx.spec.min_seed_lookahead);
let target_slot = target_epoch.start_slot(T::EthSpec::slots_per_epoch());
if dependent_state.current_epoch() < target_epoch {
partial_state_advance(
&mut dependent_state,
Some(state_root),
target_slot,
ctx.spec,
)
let (state_root, mut state) = ctx
.store
.get_advanced_hot_state(dependent_root, target_slot, dependent_state_root)
.map_err(crate::BeaconChainError::DBError)?
.ok_or(ProposerPreferencesError::DependentRootUnknown { dependent_root })?;
if state.current_epoch() < target_epoch {
partial_state_advance(&mut state, Some(state_root), target_slot, ctx.spec)
.map_err(crate::BeaconChainError::StateAdvanceError)?;
}
if !dependent_state.is_valid_proposal_slot(&signed_preferences.message, ctx.spec)? {
if !state.is_valid_proposal_slot(&signed_preferences.message, ctx.spec)? {
return Err(ProposerPreferencesError::InvalidProposalSlot {
validator_index,
proposal_slot,
});
}
// Verify signature using the dependent state (which has the validator pubkeys)
// Verify signature
proposer_preferences_signature_set(
&dependent_state,
|i| get_pubkey_from_state(&dependent_state, i),
&state,
|i| get_pubkey_from_state(&state, i),
&signed_preferences,
ctx.spec,
)

View File

@@ -6,7 +6,7 @@ use fork_choice::ForkChoice;
use genesis::{generate_deterministic_keypairs, interop_genesis_state};
use proto_array::PayloadStatus;
use slot_clock::{SlotClock, TestingSlotClock};
use store::{HotColdDB, StoreConfig};
use store::{HotColdDB, MemoryStore, StoreConfig};
use types::{
Address, BeaconBlock, ChainSpec, Checkpoint, Epoch, EthSpec, Hash256, MinimalEthSpec,
ProposerPreferences, SignedBeaconBlock, SignedProposerPreferences, Slot,
@@ -36,6 +36,7 @@ struct TestContext {
preferences_cache: GossipVerifiedProposerPreferenceCache,
slot_clock: TestingSlotClock,
spec: ChainSpec,
store: Arc<HotColdDB<E, MemoryStore, MemoryStore>>,
}
impl TestContext {
@@ -91,6 +92,7 @@ impl TestContext {
preferences_cache: GossipVerifiedProposerPreferenceCache::default(),
slot_clock,
spec,
store,
}
}
@@ -100,6 +102,7 @@ impl TestContext {
gossip_verified_proposer_preferences_cache: &self.preferences_cache,
slot_clock: &self.slot_clock,
spec: &self.spec,
store: &self.store,
}
}

View File

@@ -4113,7 +4113,9 @@ impl<T: BeaconChainTypes> NetworkBeaconProcessor<T> {
| ProposerPreferencesError::ProposalSlotAlreadyPassed { .. }
| ProposerPreferencesError::BeaconChainError(_)
| ProposerPreferencesError::BeaconStateError(_)
| ProposerPreferencesError::UnableToReadSlot,
| ProposerPreferencesError::UnableToReadSlot
| ProposerPreferencesError::DependentRootUnknown { .. }
| ProposerPreferencesError::DependentRootNotCanonical { .. },
) => {
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
}