diff --git a/beacon_node/beacon_chain/src/beacon_chain.rs b/beacon_node/beacon_chain/src/beacon_chain.rs index f5e23d150c..6aadcce544 100644 --- a/beacon_node/beacon_chain/src/beacon_chain.rs +++ b/beacon_node/beacon_chain/src/beacon_chain.rs @@ -3208,8 +3208,37 @@ impl BeaconChain { // Import the blocks into the chain. for (signature_verified_block, envelope) in signature_verified_blocks { - let block_slot = signature_verified_block.slot(); let block_root = signature_verified_block.block_root(); + let block_slot = signature_verified_block.slot(); + + // For Gloas blocks, persist the envelope and notify fork choice + // before importing the block. The next block's `load_parent` will + // check for this envelope in the store. + if let Some(available_envelope) = envelope.clone() { + let (signed_envelope, _columns) = available_envelope.deconstruct(); + if let Err(e) = self + .store + .put_payload_envelope(&block_root, &signed_envelope) + { + return ChainSegmentResult::Failed { + imported_blocks, + error: BlockError::BeaconChainError(Box::new(e.into())), + }; + } + if let Err(e) = self + .canonical_head + .fork_choice_write_lock() + .on_valid_payload_envelope_received(block_root) + { + return ChainSegmentResult::Failed { + imported_blocks, + error: BlockError::BeaconChainError(Box::new( + BeaconChainError::ForkChoiceError(e), + )), + }; + } + } + match self .process_block( block_root,