From 57527e509433cf1d6b778648b8ecdaed047175a0 Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Wed, 25 Feb 2026 14:26:21 +1100 Subject: [PATCH] Fix load_parent --- .../beacon_chain/src/block_verification.rs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/beacon_node/beacon_chain/src/block_verification.rs b/beacon_node/beacon_chain/src/block_verification.rs index d63161f279..275297133f 100644 --- a/beacon_node/beacon_chain/src/block_verification.rs +++ b/beacon_node/beacon_chain/src/block_verification.rs @@ -1993,8 +1993,20 @@ fn load_parent>( // Retrieve any state that is advanced through to at most `block.slot()`: this is // particularly important if `block` descends from the finalized/split block, but at a slot // prior to the finalized slot (which is invalid and inaccessible in our DB schema). - // TODO(gloas): use correct payload_status based on block - let payload_status = StatePayloadStatus::Pending; + // + // Post-Gloas we must also fetch a state with the correct payload status. If the current + // block builds upon the payload of its parent block, then we know the parent block is FULL + // and we need to load the full state. + let payload_status = if block.as_block().fork_name_unchecked().gloas_enabled() { + let parent_bid_block_hash = parent_block.payload_bid_block_hash()?; + if block.as_block().is_parent_block_full(parent_bid_block_hash) { + StatePayloadStatus::Full + } else { + StatePayloadStatus::Pending + } + } else { + StatePayloadStatus::Pending + }; let (parent_state_root, state) = chain .store .get_advanced_hot_state( @@ -2025,7 +2037,9 @@ fn load_parent>( ); } - let beacon_state_root = if state.slot() == parent_block.slot() { + let beacon_state_root = if state.slot() == parent_block.slot() + && let StatePayloadStatus::Pending = payload_status + { // Sanity check. if parent_state_root != parent_block.state_root() { return Err(BeaconChainError::DBInconsistent(format!(