Skip to content

Commit 454d04f

Browse files
fab-10usmansaleem
authored andcommitted
Add pending block header to TransactionEvaluationContext (besu-eth#7483)
Add pending block header to TransactionEvaluationContext plugin API, so PluginTransactionSelector can access info of the pending block. --- Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net> Co-authored-by: Usman Saleem <usman@usmans.info> Signed-off-by: gconnect <agatevureglory@gmail.com>
1 parent bfe5e75 commit 454d04f

File tree

10 files changed

+48
-25
lines changed

10 files changed

+48
-25
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
### Additions and Improvements
1111
- Add 'inbound' field to admin_peers JSON-RPC Call [#7461](https://github.com/hyperledger/besu/pull/7461)
12+
- Add pending block header to `TransactionEvaluationContext` plugin API [#7483](https://github.com/hyperledger/besu/pull/7483)
1213

1314
### Bug fixes
1415
- Fix tracing in precompiled contracts when halting for out of gas [#7318](https://github.com/hyperledger/besu/issues/7318)

ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/BlockSelectionContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public record BlockSelectionContext(
2929
GasCalculator gasCalculator,
3030
GasLimitCalculator gasLimitCalculator,
3131
BlockHashProcessor blockHashProcessor,
32-
ProcessableBlockHeader processableBlockHeader,
32+
ProcessableBlockHeader pendingBlockHeader,
3333
FeeMarket feeMarket,
3434
Wei blobGasPrice,
3535
Address miningBeneficiary,

ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/BlockTransactionSelector.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,10 @@ private TransactionEvaluationContext createTransactionEvaluationContext(
263263
.getTransactionPriceCalculator()
264264
.price(
265265
pendingTransaction.getTransaction(),
266-
blockSelectionContext.processableBlockHeader().getBaseFee());
266+
blockSelectionContext.pendingBlockHeader().getBaseFee());
267267

268268
return new TransactionEvaluationContext(
269+
blockSelectionContext.pendingBlockHeader(),
269270
pendingTransaction,
270271
Stopwatch.createStarted(),
271272
transactionGasPriceInBlock,
@@ -330,10 +331,10 @@ private TransactionSelectionResult evaluatePostProcessing(
330331
private TransactionProcessingResult processTransaction(
331332
final PendingTransaction pendingTransaction, final WorldUpdater worldStateUpdater) {
332333
final BlockHashLookup blockHashLookup =
333-
new CachingBlockHashLookup(blockSelectionContext.processableBlockHeader(), blockchain);
334+
new CachingBlockHashLookup(blockSelectionContext.pendingBlockHeader(), blockchain);
334335
return transactionProcessor.processTransaction(
335336
worldStateUpdater,
336-
blockSelectionContext.processableBlockHeader(),
337+
blockSelectionContext.pendingBlockHeader(),
337338
pendingTransaction.getTransaction(),
338339
blockSelectionContext.miningBeneficiary(),
339340
pluginOperationTracer,

ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/TransactionEvaluationContext.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,26 @@
1717
import org.hyperledger.besu.datatypes.Wei;
1818
import org.hyperledger.besu.ethereum.core.Transaction;
1919
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction;
20+
import org.hyperledger.besu.plugin.data.ProcessableBlockHeader;
2021

2122
import com.google.common.base.Stopwatch;
2223

2324
public class TransactionEvaluationContext
2425
implements org.hyperledger.besu.plugin.services.txselection.TransactionEvaluationContext<
2526
PendingTransaction> {
26-
private final org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction
27-
pendingTransaction;
27+
private final ProcessableBlockHeader pendingBlockHeader;
28+
private final PendingTransaction pendingTransaction;
2829
private final Stopwatch evaluationTimer;
2930
private final Wei transactionGasPrice;
3031
private final Wei minGasPrice;
3132

3233
public TransactionEvaluationContext(
34+
final ProcessableBlockHeader pendingBlockHeader,
3335
final PendingTransaction pendingTransaction,
3436
final Stopwatch evaluationTimer,
3537
final Wei transactionGasPrice,
3638
final Wei minGasPrice) {
39+
this.pendingBlockHeader = pendingBlockHeader;
3740
this.pendingTransaction = pendingTransaction;
3841
this.evaluationTimer = evaluationTimer;
3942
this.transactionGasPrice = transactionGasPrice;
@@ -44,6 +47,11 @@ public Transaction getTransaction() {
4447
return pendingTransaction.getTransaction();
4548
}
4649

50+
@Override
51+
public ProcessableBlockHeader getPendingBlockHeader() {
52+
return pendingBlockHeader;
53+
}
54+
4755
@Override
4856
public PendingTransaction getPendingTransaction() {
4957
return pendingTransaction;

ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/selectors/BlockSizeTransactionSelector.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ private boolean transactionTooLargeForBlock(
9191
final TransactionSelectionResults transactionSelectionResults) {
9292

9393
return transaction.getGasLimit()
94-
> context.processableBlockHeader().getGasLimit()
94+
> context.pendingBlockHeader().getGasLimit()
9595
- transactionSelectionResults.getCumulativeGasUsed();
9696
}
9797

@@ -104,7 +104,7 @@ private boolean transactionTooLargeForBlock(
104104
*/
105105
private boolean blockOccupancyAboveThreshold(
106106
final TransactionSelectionResults transactionSelectionResults) {
107-
final long gasAvailable = context.processableBlockHeader().getGasLimit();
107+
final long gasAvailable = context.pendingBlockHeader().getGasLimit();
108108

109109
final long gasUsed = transactionSelectionResults.getCumulativeGasUsed();
110110
final long gasRemaining = gasAvailable - gasUsed;
@@ -129,7 +129,7 @@ private boolean blockOccupancyAboveThreshold(
129129
* @return True if the block is full, false otherwise.
130130
*/
131131
private boolean blockFull(final TransactionSelectionResults transactionSelectionResults) {
132-
final long gasAvailable = context.processableBlockHeader().getGasLimit();
132+
final long gasAvailable = context.pendingBlockHeader().getGasLimit();
133133
final long gasUsed = transactionSelectionResults.getCumulativeGasUsed();
134134

135135
final long gasRemaining = gasAvailable - gasUsed;

ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/selectors/MinPriorityFeePerGasTransactionSelector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ private boolean isPriorityFeePriceBelowMinimum(final PendingTransaction pendingT
6868
Wei priorityFeePerGas =
6969
pendingTransaction
7070
.getTransaction()
71-
.getEffectivePriorityFeePerGas(context.processableBlockHeader().getBaseFee());
71+
.getEffectivePriorityFeePerGas(context.pendingBlockHeader().getBaseFee());
7272
return priorityFeePerGas.lessThan(context.miningParameters().getMinPriorityFeePerGas());
7373
}
7474

ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/MinPriorityFeePerGasTransactionSelectorTest.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,27 +33,24 @@
3333
import com.google.common.base.Stopwatch;
3434
import org.junit.jupiter.api.BeforeEach;
3535
import org.junit.jupiter.api.Test;
36+
import org.junit.jupiter.api.extension.ExtendWith;
37+
import org.mockito.Mock;
38+
import org.mockito.junit.jupiter.MockitoExtension;
3639

40+
@ExtendWith(MockitoExtension.class)
3741
public class MinPriorityFeePerGasTransactionSelectorTest {
3842
private AbstractTransactionSelector transactionSelector;
3943

4044
private final int minPriorityFeeParameter = 7;
45+
@Mock private ProcessableBlockHeader pendingBlockHeader;
4146

4247
@BeforeEach
4348
public void initialize() {
4449
MiningParameters miningParameters =
4550
MiningParameters.newDefault().setMinPriorityFeePerGas(Wei.of(minPriorityFeeParameter));
4651
BlockSelectionContext context =
4752
new BlockSelectionContext(
48-
miningParameters,
49-
null,
50-
null,
51-
null,
52-
mock(ProcessableBlockHeader.class),
53-
null,
54-
null,
55-
null,
56-
null);
53+
miningParameters, null, null, null, pendingBlockHeader, null, null, null, null);
5754
transactionSelector = new MinPriorityFeePerGasTransactionSelector(context);
5855
}
5956

@@ -100,6 +97,6 @@ private TransactionEvaluationContext mockTransactionEvaluationContext(
10097
when(pendingTransaction.getTransaction()).thenReturn(transaction);
10198
when(transaction.getEffectivePriorityFeePerGas(any())).thenReturn(Wei.of(priorityFeePerGas));
10299
return new TransactionEvaluationContext(
103-
pendingTransaction, Stopwatch.createStarted(), Wei.ONE, Wei.ONE);
100+
pendingBlockHeader, pendingTransaction, Stopwatch.createStarted(), Wei.ONE, Wei.ONE);
104101
}
105102
}

ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/txselection/selectors/BlobSizeTransactionSelectorTest.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ void notBlobTransactionsAreSelectedWithoutAnyCheck() {
7676

7777
final var nonBlobTx = createEIP1559PendingTransaction();
7878

79-
final var txEvaluationContext = new TransactionEvaluationContext(nonBlobTx, null, null, null);
79+
final var txEvaluationContext =
80+
new TransactionEvaluationContext(
81+
blockSelectionContext.pendingBlockHeader(), nonBlobTx, null, null, null);
8082

8183
final var result =
8284
selector.evaluateTransactionPreProcessing(txEvaluationContext, selectionResults);
@@ -94,7 +96,9 @@ void firstBlobTransactionIsSelected() {
9496

9597
final var firstBlobTx = createBlobPendingTransaction(MAX_BLOBS);
9698

97-
final var txEvaluationContext = new TransactionEvaluationContext(firstBlobTx, null, null, null);
99+
final var txEvaluationContext =
100+
new TransactionEvaluationContext(
101+
blockSelectionContext.pendingBlockHeader(), firstBlobTx, null, null, null);
98102

99103
when(selectionResults.getCumulativeBlobGasUsed()).thenReturn(0L);
100104

@@ -112,7 +116,9 @@ void returnsBlobsFullWhenMaxNumberOfBlobsAlreadyPresent() {
112116

113117
final var firstBlobTx = createBlobPendingTransaction(1);
114118

115-
final var txEvaluationContext = new TransactionEvaluationContext(firstBlobTx, null, null, null);
119+
final var txEvaluationContext =
120+
new TransactionEvaluationContext(
121+
blockSelectionContext.pendingBlockHeader(), firstBlobTx, null, null, null);
116122

117123
when(selectionResults.getCumulativeBlobGasUsed()).thenReturn(MAX_BLOB_GAS);
118124

@@ -132,7 +138,9 @@ void returnsTooLargeForRemainingBlobGas() {
132138

133139
final var firstBlobTx = createBlobPendingTransaction(MAX_BLOBS);
134140

135-
final var txEvaluationContext = new TransactionEvaluationContext(firstBlobTx, null, null, null);
141+
final var txEvaluationContext =
142+
new TransactionEvaluationContext(
143+
blockSelectionContext.pendingBlockHeader(), firstBlobTx, null, null, null);
136144

137145
when(selectionResults.getCumulativeBlobGasUsed()).thenReturn(MAX_BLOB_GAS - 1);
138146

plugin-api/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ Calculated : ${currentHash}
7070
tasks.register('checkAPIChanges', FileStateChecker) {
7171
description = "Checks that the API for the Plugin-API project does not change without deliberate thought"
7272
files = sourceSets.main.allJava.files
73-
knownHash = '6Hy3eaCpnxehyDO3smSAr1i2DsB2q/V37/m8POycikI='
73+
knownHash = '2tFIKwEd8T5I37ywbFnVcMwTR8HiiCC6gO1Chd3hZp8='
7474
}
7575
check.dependsOn('checkAPIChanges')
7676

plugin-api/src/main/java/org/hyperledger/besu/plugin/services/txselection/TransactionEvaluationContext.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import org.hyperledger.besu.datatypes.PendingTransaction;
1818
import org.hyperledger.besu.datatypes.Wei;
19+
import org.hyperledger.besu.plugin.data.ProcessableBlockHeader;
1920

2021
import com.google.common.base.Stopwatch;
2122

@@ -27,6 +28,13 @@
2728
*/
2829
public interface TransactionEvaluationContext<PT extends PendingTransaction> {
2930

31+
/**
32+
* Gets the pending block header
33+
*
34+
* @return the pending block header
35+
*/
36+
ProcessableBlockHeader getPendingBlockHeader();
37+
3038
/**
3139
* Gets the pending transaction.
3240
*

0 commit comments

Comments
 (0)