diff --git a/CHANGELOG.md b/CHANGELOG.md index d12ae7cb019..a68b742a8c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ - Holesky network is deprecated [#9437](https://github.com/hyperledger/besu/pull/9437) - Sunsetting features - for more context on the reasoning behind the deprecation of these features, including alternative options, read [this blog post](https://www.lfdecentralizedtrust.org/blog/sunsetting-tessera-and-simplifying-hyperledger-besu) - Proof of Work consensus (PoW) +- Plugin API + - `PluginTransactionSelectorFactory.create(final SelectorsStateManager selectorsStateManager)` is deprecated for removal ### Bug fixes - BFT forks that change block period on time-based forks don't take effect [9681](https://github.com/hyperledger/besu/issues/9681) @@ -39,6 +41,7 @@ are provided with different values, using input as per the execution-apis spec i - Implement `txpool_status` RPC method [#10002](https://github.com/hyperledger/besu/pull/10002) - Support [EIP-7975](https://eips.ethereum.org/EIPS/eip-7975): eth/70 - partial block receipt lists - Limit pooled tx requests by size and remove pre-eth/68 transaction announcement support [#9990](https://github.com/besu-eth/besu/pull/9990) +- Plugin API: pass pending block header when creating selectors [#10034](https://github.com/besu-eth/besu/pull/10034) ## 26.2.0 diff --git a/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestTransactionSelectorPlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestTransactionSelectorPlugin.java index ea451b858a6..9722c49ee78 100644 --- a/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestTransactionSelectorPlugin.java +++ b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestTransactionSelectorPlugin.java @@ -131,6 +131,7 @@ public void selectPendingTransactions( @Override public PluginTransactionSelector create( + final ProcessableBlockHeader pendingBlockHeader, final SelectorsStateManager selectorsStateManager) { return new PluginTransactionSelector() { diff --git a/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBundlePlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBundlePlugin.java index 4bf96175248..e2b8ff8290c 100644 --- a/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBundlePlugin.java +++ b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBundlePlugin.java @@ -130,6 +130,7 @@ public void selectPendingTransactions( @Override public PluginTransactionSelector create( + final ProcessableBlockHeader pendingBlockHeader, final SelectorsStateManager selectorsStateManager) { return new PluginTransactionSelector() { diff --git a/app/src/main/java/org/hyperledger/besu/services/TransactionSelectionServiceImpl.java b/app/src/main/java/org/hyperledger/besu/services/TransactionSelectionServiceImpl.java index 240cc444f89..c67e2b8e0f0 100644 --- a/app/src/main/java/org/hyperledger/besu/services/TransactionSelectionServiceImpl.java +++ b/app/src/main/java/org/hyperledger/besu/services/TransactionSelectionServiceImpl.java @@ -53,12 +53,15 @@ public TransactionSelectionServiceImpl() {} @Override public PluginTransactionSelector createPluginTransactionSelector( + final ProcessableBlockHeader processableBlockHeader, final SelectorsStateManager selectorsStateManager) { if (factories == null) { return PluginTransactionSelector.ACCEPT_ALL; } return new AggregatedPluginTransactionSelector( - factories.stream().map(factory -> factory.create(selectorsStateManager)).toList()); + factories.stream() + .map(factory -> factory.create(processableBlockHeader, selectorsStateManager)) + .toList()); } @Override diff --git a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java index 571bf0faa6c..0a042f5bcfd 100644 --- a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java +++ b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java @@ -222,7 +222,7 @@ public BlockCreationResult createBlock( final var pluginTransactionSelector = miningConfiguration .getTransactionSelectionService() - .createPluginTransactionSelector(selectorsStateManager); + .createPluginTransactionSelector(processableBlockHeader, selectorsStateManager); final var operationTracer = pluginTransactionSelector.getOperationTracer(); operationTracer.traceStartBlock( disposableWorldState, processableBlockHeader, miningBeneficiary); diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java index d43b4706b84..8ee1e819a8b 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java @@ -706,6 +706,7 @@ public TransactionSelectionResult evaluateTransactionPostProcessing( new PluginTransactionSelectorFactory() { @Override public PluginTransactionSelector create( + final org.hyperledger.besu.plugin.data.ProcessableBlockHeader pendingBlockHeader, final SelectorsStateManager selectorsStateManager) { return pluginTransactionSelector; } @@ -717,6 +718,7 @@ public PluginTransactionSelector create( new PluginTransactionSelectorFactory() { @Override public PluginTransactionSelector create( + final org.hyperledger.besu.plugin.data.ProcessableBlockHeader pendingBlockHeader, final SelectorsStateManager selectorsStateManager) { return colletorPluginTransactionSelector; } @@ -797,6 +799,7 @@ public TransactionSelectionResult evaluateTransactionPostProcessing( new PluginTransactionSelectorFactory() { @Override public PluginTransactionSelector create( + final org.hyperledger.besu.plugin.data.ProcessableBlockHeader pendingBlockHeader, final SelectorsStateManager selectorsStateManager) { return pluginTransactionSelector; } @@ -808,6 +811,7 @@ public PluginTransactionSelector create( new PluginTransactionSelectorFactory() { @Override public PluginTransactionSelector create( + final org.hyperledger.besu.plugin.data.ProcessableBlockHeader pendingBlockHeader, final SelectorsStateManager selectorsStateManager) { return colletorPluginTransactionSelector; } @@ -865,7 +869,7 @@ record Mocks( when(transactionSelector.evaluateTransactionPreProcessing(any())).thenReturn(SELECTED); when(transactionSelector.evaluateTransactionPostProcessing(any(), any())) .thenReturn(SELECTED); - when(transactionSelectorFactory.create(any())).thenReturn(transactionSelector); + when(transactionSelectorFactory.create(any(), any())).thenReturn(transactionSelector); return new Mocks(transactionSelectorFactory, transactionSelector); }; @@ -1163,7 +1167,7 @@ public void txEvaluationContextIsCancelledReturnsTrueOnTimeout() { final PluginTransactionSelectorFactory transactionSelectorFactory = mock(PluginTransactionSelectorFactory.class); - when(transactionSelectorFactory.create(any())) + when(transactionSelectorFactory.create(any(), any())) .thenReturn( new PluginTransactionSelector() { @Override @@ -1224,7 +1228,7 @@ public void txEvaluationContextIsCancelledReturnsTrueOnCancellation() { final AtomicReference selector = new AtomicReference<>(); final PluginTransactionSelectorFactory transactionSelectorFactory = mock(PluginTransactionSelectorFactory.class); - when(transactionSelectorFactory.create(any())) + when(transactionSelectorFactory.create(any(), any())) .thenReturn( new PluginTransactionSelector() { @Override @@ -1331,7 +1335,7 @@ private void internalBlockSelectionTimeoutSimulation( final PluginTransactionSelectorFactory transactionSelectorFactory = mock(PluginTransactionSelectorFactory.class); - when(transactionSelectorFactory.create(any())).thenReturn(transactionSelector); + when(transactionSelectorFactory.create(any(), any())).thenReturn(transactionSelector); transactionSelectionService.registerPluginTransactionSelectorFactory( transactionSelectorFactory); @@ -1495,7 +1499,7 @@ private void internalBlockSelectionTimeoutSimulationInvalidTxs( final PluginTransactionSelectorFactory transactionSelectorFactory = mock(PluginTransactionSelectorFactory.class); - when(transactionSelectorFactory.create(any())).thenReturn(transactionSelector); + when(transactionSelectorFactory.create(any(), any())).thenReturn(transactionSelector); transactionSelectionService.registerPluginTransactionSelectorFactory( transactionSelectorFactory); @@ -1595,7 +1599,8 @@ protected BlockTransactionSelector createBlockSelector( miningBeneficiary, blobGasPrice, protocolSpec, - transactionSelectionService.createPluginTransactionSelector(selectorsStateManager), + transactionSelectionService.createPluginTransactionSelector( + blockHeader, selectorsStateManager), ethScheduler, selectorsStateManager, Optional.empty()); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/MiningConfiguration.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/MiningConfiguration.java index d4f2646b07e..546775728a7 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/MiningConfiguration.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/MiningConfiguration.java @@ -187,6 +187,7 @@ public TransactionSelectionService getTransactionSelectionService() { return new TransactionSelectionService() { @Override public PluginTransactionSelector createPluginTransactionSelector( + final ProcessableBlockHeader pendingBlockHeader, final SelectorsStateManager selectorsStateManager) { return PluginTransactionSelector.ACCEPT_ALL; } diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index ce21a880080..550bd6731e8 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -71,7 +71,7 @@ Calculated : ${currentHash} tasks.register('checkAPIChanges', FileStateChecker) { description = "Checks that the API for the Plugin-API project does not change without deliberate thought" files = sourceSets.main.allJava.files - knownHash = '0EGHYlomDjcBMwQmKy9qhqGaLhcIxkWUthAGdYSTxNc=' + knownHash = '6hDXxhwrNO1YWmdkQKoG89kPWcS8j3CBjPeoePbjms0=' } check.dependsOn('checkAPIChanges') diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/TransactionSelectionService.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/TransactionSelectionService.java index 35181372f0d..b8da13ead6d 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/TransactionSelectionService.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/TransactionSelectionService.java @@ -31,11 +31,12 @@ public interface TransactionSelectionService extends BesuService { /** * Create a transaction selector plugin * + * @param pendingBlockHeader the header of the block being created * @param selectorsStateManager the selectors state manager * @return the transaction selector plugin */ PluginTransactionSelector createPluginTransactionSelector( - SelectorsStateManager selectorsStateManager); + ProcessableBlockHeader pendingBlockHeader, SelectorsStateManager selectorsStateManager); /** * Called during the block creation to allow plugins to propose their own pending transactions for diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/txselection/PluginTransactionSelectorFactory.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/txselection/PluginTransactionSelectorFactory.java index 4bcdb9f1473..cb8106706aa 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/txselection/PluginTransactionSelectorFactory.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/txselection/PluginTransactionSelectorFactory.java @@ -32,11 +32,28 @@ public interface PluginTransactionSelectorFactory { * * @param selectorsStateManager the selectors state manager * @return the transaction selector + * @deprecated use {@link PluginTransactionSelectorFactory#create(ProcessableBlockHeader, + * SelectorsStateManager)} instead */ + @Deprecated(forRemoval = true) default PluginTransactionSelector create(final SelectorsStateManager selectorsStateManager) { return PluginTransactionSelector.ACCEPT_ALL; } + /** + * Create a plugin transaction selector, that can be used during block creation to apply custom + * filters to proposed pending transactions + * + * @param pendingBlockHeader the header of the block being created + * @param selectorsStateManager the selectors state manager + * @return the transaction selector + */ + default PluginTransactionSelector create( + final ProcessableBlockHeader pendingBlockHeader, + final SelectorsStateManager selectorsStateManager) { + return create(selectorsStateManager); + } + /** * Called during the block creation to allow plugins to propose their own pending transactions for * block inclusion