diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java index 62a6e123ab8..6d930366c76 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java @@ -14,10 +14,8 @@ */ package org.hyperledger.besu.consensus.merge.blockcreation; -import static java.util.stream.Collectors.joining; -import static org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator.ForkchoiceResult.Status.INVALID; -import static org.hyperledger.besu.ethereum.trie.diffbased.common.provider.WorldStateQueryParams.withBlockHeaderAndUpdateNodeHead; - +import com.google.common.annotations.VisibleForTesting; +import org.apache.tuweni.bytes.Bytes32; import org.hyperledger.besu.consensus.merge.MergeContext; import org.hyperledger.besu.consensus.merge.PayloadWrapper; import org.hyperledger.besu.datatypes.Address; @@ -30,14 +28,7 @@ import org.hyperledger.besu.ethereum.chain.BadBlockManager; import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.chain.MutableBlockchain; -import org.hyperledger.besu.ethereum.core.Block; -import org.hyperledger.besu.ethereum.core.BlockHeader; -import org.hyperledger.besu.ethereum.core.BlockWithReceipts; -import org.hyperledger.besu.ethereum.core.Difficulty; -import org.hyperledger.besu.ethereum.core.MiningConfiguration; -import org.hyperledger.besu.ethereum.core.MutableWorldState; -import org.hyperledger.besu.ethereum.core.Transaction; -import org.hyperledger.besu.ethereum.core.Withdrawal; +import org.hyperledger.besu.ethereum.core.*; import org.hyperledger.besu.ethereum.eth.manager.EthScheduler; import org.hyperledger.besu.ethereum.eth.sync.backwardsync.BackwardSyncContext; import org.hyperledger.besu.ethereum.eth.sync.backwardsync.BadChainListener; @@ -47,6 +38,8 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.trie.MerkleTrieException; import org.hyperledger.besu.plugin.services.exception.StorageException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.PrintWriter; import java.io.StringWriter; @@ -62,10 +55,9 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; -import com.google.common.annotations.VisibleForTesting; -import org.apache.tuweni.bytes.Bytes32; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static java.util.stream.Collectors.joining; +import static org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator.ForkchoiceResult.Status.INVALID; +import static org.hyperledger.besu.ethereum.trie.diffbased.common.provider.WorldStateQueryParams.withBlockHeaderAndUpdateNodeHead; /** The Merge coordinator. */ public class MergeCoordinator implements MergeMiningCoordinator, BadChainListener { @@ -534,35 +526,35 @@ public Optional getOrSyncHeadByHash(final Hash headHash, final Hash } private void updateFinalized(final Hash finalizedHash) { + // If finalizedHash is already set, do nothing if (mergeContext .getFinalized() .map(BlockHeader::getHash) .map(finalizedHash::equals) .orElse(Boolean.FALSE)) { - LOG.atDebug() - .setMessage("Finalized block already set to {}, nothing to do") - .addArgument(finalizedHash) - .log(); + LOG.atDebug() + .setMessage("Finalized block already set to {}, nothing to do") + .addArgument(finalizedHash) + .log(); return; } - protocolContext - .getBlockchain() - .getBlockHeader(finalizedHash) - .ifPresentOrElse( - finalizedHeader -> { - LOG.atDebug() - .setMessage("Setting finalized block header to {}") - .addArgument(finalizedHeader::toLogString) - .log(); - mergeContext.setFinalized(finalizedHeader); - }, - () -> - LOG.warn( - "Internal error, backward sync completed but failed to import finalized block {}", - finalizedHash)); + // Check if the finalized block actually exists in the blockchain + Optional maybeFinalizedHeader = protocolContext.getBlockchain().getBlockHeader(finalizedHash); + + if (maybeFinalizedHeader.isPresent()) { + LOG.atDebug() + .setMessage("Setting finalized block header to {}") + .addArgument(maybeFinalizedHeader.get()::toLogString) + .log(); + + mergeContext.setFinalized(maybeFinalizedHeader.get()); + } else { + LOG.warn("Backward sync completed but failed to import finalized block {}", finalizedHash); + } } + @Override public BlockProcessingResult validateBlock(final Block block) { final var validationResult =