diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/MainnetBlockValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/MainnetBlockValidator.java index bdfbe5065b4..c57c545bc8b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/MainnetBlockValidator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/MainnetBlockValidator.java @@ -15,7 +15,6 @@ package org.hyperledger.besu.ethereum; import org.hyperledger.besu.ethereum.chain.BadBlockCause; -import org.hyperledger.besu.ethereum.chain.BadBlockManager; import org.hyperledger.besu.ethereum.chain.MutableBlockchain; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockHeader; @@ -56,9 +55,6 @@ public class MainnetBlockValidator implements BlockValidator { /** The BlockProcessor used to process blocks. */ protected final BlockProcessor blockProcessor; - /** The BadBlockManager used to manage bad blocks. */ - protected final BadBlockManager badBlockManager; - /** * Constructs a new MainnetBlockValidator with the given BlockHeaderValidator, BlockBodyValidator, * BlockProcessor, and BadBlockManager. @@ -66,17 +62,14 @@ public class MainnetBlockValidator implements BlockValidator { * @param blockHeaderValidator the BlockHeaderValidator used to validate block headers * @param blockBodyValidator the BlockBodyValidator used to validate block bodies * @param blockProcessor the BlockProcessor used to process blocks - * @param badBlockManager the BadBlockManager used to manage bad blocks */ public MainnetBlockValidator( final BlockHeaderValidator blockHeaderValidator, final BlockBodyValidator blockBodyValidator, - final BlockProcessor blockProcessor, - final BadBlockManager badBlockManager) { + final BlockProcessor blockProcessor) { this.blockHeaderValidator = blockHeaderValidator; this.blockBodyValidator = blockBodyValidator; this.blockProcessor = blockProcessor; - this.badBlockManager = badBlockManager; } /** @@ -131,7 +124,7 @@ public BlockProcessingResult validateAndProcessBlock( new BlockProcessingResult( "Parent block with hash " + header.getParentHash() + " not present"); // Blocks should not be marked bad due to missing data - handleFailedBlockProcessing(block, retval, false); + handleFailedBlockProcessing(block, retval, false, context); return retval; } parentHeader = maybeParentHeader.get(); @@ -140,13 +133,13 @@ public BlockProcessingResult validateAndProcessBlock( header, parentHeader, context, headerValidationMode)) { final String error = String.format("Header validation failed (%s)", headerValidationMode); var retval = new BlockProcessingResult(error); - handleFailedBlockProcessing(block, retval, shouldRecordBadBlock); + handleFailedBlockProcessing(block, retval, shouldRecordBadBlock, context); return retval; } } catch (StorageException ex) { var retval = new BlockProcessingResult(Optional.empty(), ex); // Blocks should not be marked bad due to a local storage failure - handleFailedBlockProcessing(block, retval, false); + handleFailedBlockProcessing(block, retval, false, context); return retval; } @@ -165,12 +158,12 @@ public BlockProcessingResult validateAndProcessBlock( + parentHeader.getStateRoot() + " is not available"); // Blocks should not be marked bad due to missing data - handleFailedBlockProcessing(block, retval, false); + handleFailedBlockProcessing(block, retval, false, context); return retval; } var result = processBlock(context, worldState, block); if (result.isFailed()) { - handleFailedBlockProcessing(block, result, shouldRecordBadBlock); + handleFailedBlockProcessing(block, result, shouldRecordBadBlock, context); return result; } else { List receipts = @@ -185,7 +178,7 @@ public BlockProcessingResult validateAndProcessBlock( ommerValidationMode, BodyValidationMode.FULL)) { result = new BlockProcessingResult("failed to validate output of imported block"); - handleFailedBlockProcessing(block, result, shouldRecordBadBlock); + handleFailedBlockProcessing(block, result, shouldRecordBadBlock, context); return result; } @@ -199,7 +192,7 @@ public BlockProcessingResult validateAndProcessBlock( } catch (StorageException ex) { var retval = new BlockProcessingResult(Optional.empty(), ex); // Do not record bad block due to a local storage issue - handleFailedBlockProcessing(block, retval, false); + handleFailedBlockProcessing(block, retval, false, context); return retval; } catch (Exception ex) { // Wrap checked autocloseable exception from try-with-resources @@ -210,7 +203,8 @@ public BlockProcessingResult validateAndProcessBlock( private void handleFailedBlockProcessing( final Block failedBlock, final BlockValidationResult result, - final boolean shouldRecordBadBlock) { + final boolean shouldRecordBadBlock, + final ProtocolContext context) { if (result.causedBy().isPresent()) { // Block processing failed exceptionally, we cannot assume the block was intrinsically invalid LOG.info( @@ -230,7 +224,7 @@ private void handleFailedBlockProcessing( // Result.errorMessage should not be empty on failure, but add a default to be safe String description = result.errorMessage.orElse("Unknown cause"); final BadBlockCause cause = BadBlockCause.fromValidationFailure(description); - badBlockManager.addBadBlock(failedBlock, cause); + context.getBadBlockManager().addBadBlock(failedBlock, cause); } else { LOG.debug("Invalid block {} not added to badBlockManager ", failedBlock.toLogString()); } @@ -268,7 +262,9 @@ public boolean validateBlockForSyncing( final BlockHeader header = block.getHeader(); if (!blockHeaderValidator.validateHeader(header, context, headerValidationMode)) { String description = String.format("Failed header validation (%s)", headerValidationMode); - badBlockManager.addBadBlock(block, BadBlockCause.fromValidationFailure(description)); + context + .getBadBlockManager() + .addBadBlock(block, BadBlockCause.fromValidationFailure(description)); return false; } @@ -277,8 +273,10 @@ public boolean validateBlockForSyncing( } if (!blockBodyValidator.validateBodyLight(context, block, receipts, ommerValidationMode)) { - badBlockManager.addBadBlock( - block, BadBlockCause.fromValidationFailure("Failed body validation (light)")); + context + .getBadBlockManager() + .addBadBlock( + block, BadBlockCause.fromValidationFailure("Failed body validation (light)")); return false; } return true; diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java index 452457f7b40..9ff34c23646 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java @@ -376,8 +376,7 @@ public ProtocolSpec build(final ProtocolSchedule protocolSchedule) { } final BlockValidator blockValidator = - blockValidatorBuilder.apply( - blockHeaderValidator, blockBodyValidator, blockProcessor, badBlockManager); + blockValidatorBuilder.apply(blockHeaderValidator, blockBodyValidator, blockProcessor); final BlockImporter blockImporter = blockImporterBuilder.apply(blockValidator); return new ProtocolSpec( name, @@ -501,8 +500,7 @@ public interface BlockValidatorBuilder { BlockValidator apply( BlockHeaderValidator blockHeaderValidator, BlockBodyValidator blockBodyValidator, - BlockProcessor blockProcessor, - BadBlockManager badBlockManager); + BlockProcessor blockProcessor); } public interface BlockImporterBuilder { diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java index 9095b0783fe..523e2a4d5d8 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java @@ -120,8 +120,7 @@ public void setup() { when(protocolSpec.getGasCalculator()).thenReturn(gasCalculator); when(protocolSpec.getFeeMarket()).thenReturn(feeMarket); mainnetBlockValidator = - new MainnetBlockValidator( - blockHeaderValidator, blockBodyValidator, blockProcessor, badBlockManager); + new MainnetBlockValidator(blockHeaderValidator, blockBodyValidator, blockProcessor); } @Test diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/MainnetBlockValidatorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/MainnetBlockValidatorTest.java index 25f8a40131c..a99018b8200 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/MainnetBlockValidatorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/MainnetBlockValidatorTest.java @@ -69,8 +69,7 @@ public class MainnetBlockValidatorTest { private final BlockBodyValidator blockBodyValidator = mock(BlockBodyValidator.class); private final MainnetBlockValidator mainnetBlockValidator = - new MainnetBlockValidator( - blockHeaderValidator, blockBodyValidator, blockProcessor, badBlockManager); + new MainnetBlockValidator(blockHeaderValidator, blockBodyValidator, blockProcessor); public static Stream getStorageExceptions() { return Stream.of( @@ -92,6 +91,7 @@ public void setup() { new BlockProcessingResult(Optional.empty(), false); when(protocolContext.getBlockchain()).thenReturn(blockchain); + when(protocolContext.getBadBlockManager()).thenReturn(badBlockManager); when(protocolContext.getWorldStateArchive()).thenReturn(worldStateArchive); when(worldStateArchive.getWorldState(any())).thenReturn(Optional.of(worldState)); when(worldStateArchive.getWorldState(any())).thenReturn(Optional.of(worldState));