Skip to content

Commit 847a5dd

Browse files
fab-10siladu
authored andcommitted
Make layered txpool aware of minGasPrice and minPriorityFeePerGas dynamic options (besu-eth#6611)
Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net> Co-authored-by: Simon Dudley <simon.dudley@consensys.net>
1 parent 8e6b4c0 commit 847a5dd

File tree

23 files changed

+223
-63
lines changed

23 files changed

+223
-63
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
### Additions and Improvements
1313
- Extend `Blockchain` service [#6592](https://github.com/hyperledger/besu/pull/6592)
1414
- RocksDB database metadata refactoring [#6555](https://github.com/hyperledger/besu/pull/6555)
15+
- Make layered txpool aware of minGasPrice and minPriorityFeePerGas dynamic options [#6611](https://github.com/hyperledger/besu/pull/6611)
1516

1617
### Bug fixes
1718

besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,8 @@ public BesuController build() {
710710
syncState,
711711
transactionPoolConfiguration,
712712
pluginTransactionValidatorFactory,
713-
besuComponent.map(BesuComponent::getBlobCache).orElse(new BlobCache()));
713+
besuComponent.map(BesuComponent::getBlobCache).orElse(new BlobCache()),
714+
miningParameters);
714715

715716
final List<PeerValidator> peerValidators = createPeerValidators(protocolSchedule);
716717

besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.hyperledger.besu.ethereum.core.BlockDataGenerator;
3535
import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture;
3636
import org.hyperledger.besu.ethereum.core.Difficulty;
37+
import org.hyperledger.besu.ethereum.core.MiningParameters;
3738
import org.hyperledger.besu.ethereum.core.MutableWorldState;
3839
import org.hyperledger.besu.ethereum.core.TransactionReceipt;
3940
import org.hyperledger.besu.ethereum.core.TransactionTestFixture;
@@ -167,7 +168,8 @@ public void setUp() {
167168
syncState,
168169
txPoolConfig,
169170
null,
170-
new BlobCache());
171+
new BlobCache(),
172+
MiningParameters.newDefault());
171173

172174
serviceImpl = new BesuEventsImpl(blockchain, blockBroadcaster, transactionPool, syncState);
173175
}

ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/bonsai/AbstractIsolationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,8 @@ public abstract class AbstractIsolationTests {
134134
new EndLayer(txPoolMetrics),
135135
txPoolMetrics,
136136
transactionReplacementTester,
137-
new BlobCache()));
137+
new BlobCache(),
138+
MiningParameters.newDefault()));
138139

139140
protected final List<GenesisAllocation> accounts =
140141
GenesisConfigFile.development()

ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactory.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import static org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration.Implementation.LAYERED;
1818

1919
import org.hyperledger.besu.ethereum.ProtocolContext;
20+
import org.hyperledger.besu.ethereum.core.MiningParameters;
2021
import org.hyperledger.besu.ethereum.eth.manager.EthContext;
2122
import org.hyperledger.besu.ethereum.eth.messages.EthPV62;
2223
import org.hyperledger.besu.ethereum.eth.messages.EthPV65;
@@ -55,7 +56,8 @@ public static TransactionPool createTransactionPool(
5556
final SyncState syncState,
5657
final TransactionPoolConfiguration transactionPoolConfiguration,
5758
final PluginTransactionValidatorFactory pluginTransactionValidatorFactory,
58-
final BlobCache blobCache) {
59+
final BlobCache blobCache,
60+
final MiningParameters miningParameters) {
5961

6062
final TransactionPoolMetrics metrics = new TransactionPoolMetrics(metricsSystem);
6163

@@ -78,7 +80,8 @@ public static TransactionPool createTransactionPool(
7880
transactionsMessageSender,
7981
newPooledTransactionHashesMessageSender,
8082
pluginTransactionValidatorFactory,
81-
blobCache);
83+
blobCache,
84+
miningParameters);
8285
}
8386

8487
static TransactionPool createTransactionPool(
@@ -93,7 +96,8 @@ static TransactionPool createTransactionPool(
9396
final TransactionsMessageSender transactionsMessageSender,
9497
final NewPooledTransactionHashesMessageSender newPooledTransactionHashesMessageSender,
9598
final PluginTransactionValidatorFactory pluginTransactionValidatorFactory,
96-
final BlobCache blobCache) {
99+
final BlobCache blobCache,
100+
final MiningParameters miningParameters) {
97101

98102
final TransactionPool transactionPool =
99103
new TransactionPool(
@@ -104,7 +108,8 @@ static TransactionPool createTransactionPool(
104108
clock,
105109
metrics,
106110
transactionPoolConfiguration,
107-
blobCache),
111+
blobCache,
112+
miningParameters),
108113
protocolSchedule,
109114
protocolContext,
110115
new TransactionBroadcaster(
@@ -233,7 +238,8 @@ private static PendingTransactions createPendingTransactions(
233238
final Clock clock,
234239
final TransactionPoolMetrics metrics,
235240
final TransactionPoolConfiguration transactionPoolConfiguration,
236-
final BlobCache blobCache) {
241+
final BlobCache blobCache,
242+
final MiningParameters miningParameters) {
237243

238244
boolean isFeeMarketImplementBaseFee =
239245
protocolSchedule.anyMatch(
@@ -246,7 +252,8 @@ private static PendingTransactions createPendingTransactions(
246252
metrics,
247253
transactionPoolConfiguration,
248254
isFeeMarketImplementBaseFee,
249-
blobCache);
255+
blobCache,
256+
miningParameters);
250257
} else {
251258
return createPendingTransactionSorter(
252259
protocolContext,
@@ -284,7 +291,8 @@ private static PendingTransactions createLayeredPendingTransactions(
284291
final TransactionPoolMetrics metrics,
285292
final TransactionPoolConfiguration transactionPoolConfiguration,
286293
final boolean isFeeMarketImplementBaseFee,
287-
final BlobCache blobCache) {
294+
final BlobCache blobCache,
295+
final MiningParameters miningParameters) {
288296

289297
final TransactionPoolReplacementHandler transactionReplacementHandler =
290298
new TransactionPoolReplacementHandler(transactionPoolConfiguration.getPriceBump());
@@ -327,15 +335,17 @@ private static PendingTransactions createLayeredPendingTransactions(
327335
metrics,
328336
transactionReplacementTester,
329337
feeMarket,
330-
blobCache);
338+
blobCache,
339+
miningParameters);
331340
} else {
332341
pendingTransactionsSorter =
333342
new GasPricePrioritizedTransactions(
334343
transactionPoolConfiguration,
335344
readyTransactions,
336345
metrics,
337346
transactionReplacementTester,
338-
blobCache);
347+
blobCache,
348+
miningParameters);
339349
}
340350

341351
return new LayeredPendingTransactions(transactionPoolConfiguration, pendingTransactionsSorter);

ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/AbstractPrioritizedTransactions.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package org.hyperledger.besu.ethereum.eth.transactions.layered;
1616

1717
import org.hyperledger.besu.datatypes.Address;
18+
import org.hyperledger.besu.ethereum.core.MiningParameters;
1819
import org.hyperledger.besu.ethereum.eth.transactions.BlobCache;
1920
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction;
2021
import org.hyperledger.besu.ethereum.eth.transactions.TransactionAddedResult;
@@ -36,16 +37,19 @@
3637
*/
3738
public abstract class AbstractPrioritizedTransactions extends AbstractSequentialTransactionsLayer {
3839
protected final TreeSet<PendingTransaction> orderByFee;
40+
protected final MiningParameters miningParameters;
3941

4042
public AbstractPrioritizedTransactions(
4143
final TransactionPoolConfiguration poolConfig,
4244
final TransactionsLayer prioritizedTransactions,
4345
final TransactionPoolMetrics metrics,
4446
final BiFunction<PendingTransaction, PendingTransaction, Boolean>
4547
transactionReplacementTester,
46-
final BlobCache blobCache) {
48+
final BlobCache blobCache,
49+
final MiningParameters miningParameters) {
4750
super(poolConfig, prioritizedTransactions, transactionReplacementTester, metrics, blobCache);
4851
this.orderByFee = new TreeSet<>(this::compareByFee);
52+
this.miningParameters = miningParameters;
4953
}
5054

5155
@Override

ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/BaseFeePrioritizedTransactions.java

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.hyperledger.besu.datatypes.Wei;
2020
import org.hyperledger.besu.ethereum.core.BlockHeader;
21+
import org.hyperledger.besu.ethereum.core.MiningParameters;
2122
import org.hyperledger.besu.ethereum.core.Transaction;
2223
import org.hyperledger.besu.ethereum.eth.transactions.BlobCache;
2324
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction;
@@ -47,8 +48,10 @@ public BaseFeePrioritizedTransactions(
4748
final BiFunction<PendingTransaction, PendingTransaction, Boolean>
4849
transactionReplacementTester,
4950
final FeeMarket feeMarket,
50-
final BlobCache blobCache) {
51-
super(poolConfig, nextLayer, metrics, transactionReplacementTester, blobCache);
51+
final BlobCache blobCache,
52+
final MiningParameters miningParameters) {
53+
super(
54+
poolConfig, nextLayer, metrics, transactionReplacementTester, blobCache, miningParameters);
5255
this.nextBlockBaseFee =
5356
Optional.of(calculateNextBlockBaseFee(feeMarket, chainHeadHeaderSupplier.get()));
5457
}
@@ -146,11 +149,34 @@ private Wei calculateNextBlockBaseFee(final FeeMarket feeMarket, final BlockHead
146149

147150
@Override
148151
protected boolean promotionFilter(final PendingTransaction pendingTransaction) {
149-
return nextBlockBaseFee
150-
.map(
151-
baseFee ->
152-
pendingTransaction.getTransaction().getMaxGasPrice().greaterOrEqualThan(baseFee))
153-
.orElse(false);
152+
// check if the tx is willing to pay at least the base fee
153+
if (nextBlockBaseFee
154+
.map(pendingTransaction.getTransaction().getMaxGasPrice()::lessThan)
155+
.orElse(true)) {
156+
return false;
157+
}
158+
159+
// priority txs are promoted even if they pay less
160+
if (!pendingTransaction.hasPriority()) {
161+
// check if max fee per gas is higher than the min gas price
162+
if (pendingTransaction
163+
.getTransaction()
164+
.getMaxGasPrice()
165+
.lessThan(miningParameters.getMinTransactionGasPrice())) {
166+
return false;
167+
}
168+
169+
// check if enough priority fee is paid
170+
if (!miningParameters.getMinPriorityFeePerGas().equals(Wei.ZERO)) {
171+
final Wei priorityFeePerGas =
172+
pendingTransaction.getTransaction().getEffectivePriorityFeePerGas(nextBlockBaseFee);
173+
if (priorityFeePerGas.lessThan(miningParameters.getMinPriorityFeePerGas())) {
174+
return false;
175+
}
176+
}
177+
}
178+
179+
return true;
154180
}
155181

156182
@Override

ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/GasPricePrioritizedTransactions.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import static java.util.Comparator.comparing;
1818

1919
import org.hyperledger.besu.ethereum.core.BlockHeader;
20+
import org.hyperledger.besu.ethereum.core.MiningParameters;
2021
import org.hyperledger.besu.ethereum.eth.transactions.BlobCache;
2122
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction;
2223
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration;
@@ -39,8 +40,10 @@ public GasPricePrioritizedTransactions(
3940
final TransactionPoolMetrics metrics,
4041
final BiFunction<PendingTransaction, PendingTransaction, Boolean>
4142
transactionReplacementTester,
42-
final BlobCache blobCache) {
43-
super(poolConfig, nextLayer, metrics, transactionReplacementTester, blobCache);
43+
final BlobCache blobCache,
44+
final MiningParameters miningParameters) {
45+
super(
46+
poolConfig, nextLayer, metrics, transactionReplacementTester, blobCache, miningParameters);
4447
}
4548

4649
@Override
@@ -58,7 +61,12 @@ protected void internalBlockAdded(final BlockHeader blockHeader, final FeeMarket
5861

5962
@Override
6063
protected boolean promotionFilter(final PendingTransaction pendingTransaction) {
61-
return true;
64+
return pendingTransaction.hasPriority()
65+
|| pendingTransaction
66+
.getTransaction()
67+
.getGasPrice()
68+
.map(miningParameters.getMinTransactionGasPrice()::lessThan)
69+
.orElse(false);
6270
}
6371

6472
@Override

ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManagerTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.hyperledger.besu.ethereum.core.BlockHeader;
3737
import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil;
3838
import org.hyperledger.besu.ethereum.core.Difficulty;
39+
import org.hyperledger.besu.ethereum.core.MiningParameters;
3940
import org.hyperledger.besu.ethereum.core.ProtocolScheduleFixture;
4041
import org.hyperledger.besu.ethereum.core.Transaction;
4142
import org.hyperledger.besu.ethereum.core.TransactionReceipt;
@@ -1118,7 +1119,8 @@ public void transactionMessagesGoToTheCorrectExecutor() {
11181119
new SyncState(blockchain, ethManager.ethContext().getEthPeers()),
11191120
TransactionPoolConfiguration.DEFAULT,
11201121
null,
1121-
new BlobCache())
1122+
new BlobCache(),
1123+
MiningParameters.newDefault())
11221124
.setEnabled();
11231125

11241126
// Send just a transaction message.

ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/ethtaskutils/AbstractMessageTaskTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.hyperledger.besu.ethereum.ProtocolContext;
2626
import org.hyperledger.besu.ethereum.chain.Blockchain;
2727
import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil;
28+
import org.hyperledger.besu.ethereum.core.MiningParameters;
2829
import org.hyperledger.besu.ethereum.eth.EthProtocol;
2930
import org.hyperledger.besu.ethereum.eth.EthProtocolConfiguration;
3031
import org.hyperledger.besu.ethereum.eth.manager.EthContext;
@@ -136,7 +137,8 @@ public void setupTest() {
136137
syncState,
137138
TransactionPoolConfiguration.DEFAULT,
138139
null,
139-
new BlobCache());
140+
new BlobCache(),
141+
MiningParameters.newDefault());
140142
transactionPool.setEnabled();
141143

142144
ethProtocolManager =

0 commit comments

Comments
 (0)