Skip to content

Commit 2e151d5

Browse files
committed
Support pending transaction score when saving and restoring txpool
Signed-off-by: Fabio Di Fabio <[email protected]>
1 parent 3d41ccb commit 2e151d5

File tree

9 files changed

+249
-42
lines changed

9 files changed

+249
-42
lines changed

consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinatorTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.assertj.core.api.Assertions.fail;
1919
import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryBlockchain;
2020
import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryWorldStateArchive;
21+
import static org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction.MAX_SCORE;
2122
import static org.mockito.ArgumentMatchers.any;
2223
import static org.mockito.ArgumentMatchers.anyLong;
2324
import static org.mockito.ArgumentMatchers.eq;
@@ -1080,7 +1081,8 @@ private PendingTransaction createLocalTransaction(final long transactionNumber)
10801081
.nonce(transactionNumber)
10811082
.createTransaction(KEYS1),
10821083
true,
1083-
true);
1084+
true,
1085+
MAX_SCORE);
10841086
}
10851087

10861088
private static BlockHeader mockBlockHeader() {

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

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

1717
import static org.assertj.core.api.Assertions.assertThat;
1818
import static org.assertj.core.api.Assertions.fail;
19+
import static org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction.MAX_SCORE;
1920
import static org.hyperledger.besu.plugin.data.TransactionSelectionResult.BLOBS_FULL;
2021
import static org.hyperledger.besu.plugin.data.TransactionSelectionResult.SELECTED;
2122
import static org.hyperledger.besu.plugin.data.TransactionSelectionResult.TX_TOO_LARGE_FOR_REMAINING_BLOB_GAS;
@@ -172,12 +173,12 @@ private void evaluateAndAssertNotSelected(
172173

173174
private PendingTransaction createEIP1559PendingTransaction() {
174175
return PendingTransaction.newPendingTransaction(
175-
createTransaction(TransactionType.EIP1559, 0), false, false);
176+
createTransaction(TransactionType.EIP1559, 0), false, false, MAX_SCORE);
176177
}
177178

178179
private PendingTransaction createBlobPendingTransaction(final int blobCount) {
179180
return PendingTransaction.newPendingTransaction(
180-
createTransaction(TransactionType.BLOB, blobCount), false, false);
181+
createTransaction(TransactionType.BLOB, blobCount), false, false, MAX_SCORE);
181182
}
182183

183184
private Transaction createTransaction(final TransactionType type, final int blobCount) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package org.hyperledger.besu.ethereum.blockcreation.txselection.selectors;
1616

1717
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction.MAX_SCORE;
1819
import static org.hyperledger.besu.plugin.data.TransactionSelectionResult.BLOCK_FULL;
1920
import static org.hyperledger.besu.plugin.data.TransactionSelectionResult.BLOCK_OCCUPANCY_ABOVE_THRESHOLD;
2021
import static org.hyperledger.besu.plugin.data.TransactionSelectionResult.SELECTED;
@@ -247,7 +248,7 @@ private void evaluateAndAssertNotSelected(
247248

248249
private PendingTransaction createPendingTransaction(final long gasLimit) {
249250
return PendingTransaction.newPendingTransaction(
250-
createTransaction(TransactionType.EIP1559, gasLimit), false, false);
251+
createTransaction(TransactionType.EIP1559, gasLimit), false, false, MAX_SCORE);
251252
}
252253

253254
private Transaction createTransaction(final TransactionType type, final long gasLimit) {

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

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@
4848
*/
4949
public abstract class PendingTransaction
5050
implements org.hyperledger.besu.datatypes.PendingTransaction {
51-
static final int NOT_INITIALIZED = -1;
51+
public static final Byte MAX_SCORE = Byte.MAX_VALUE;
52+
private static final int NOT_INITIALIZED = -1;
5253
private static final AtomicLong TRANSACTIONS_ADDED = new AtomicLong();
5354
private final Transaction transaction;
5455
private final long addedAt;
@@ -58,37 +59,42 @@ public abstract class PendingTransaction
5859
private int memorySize = NOT_INITIALIZED;
5960

6061
private PendingTransaction(
61-
final Transaction transaction, final long addedAt, final long sequence, final byte score) {
62+
final Transaction transaction, final byte score, final long addedAt, final long sequence) {
6263
this.transaction = transaction;
6364
this.addedAt = addedAt;
6465
this.sequence = sequence;
6566
this.score = score;
6667
}
6768

68-
private PendingTransaction(final Transaction transaction, final long addedAt) {
69-
this(transaction, addedAt, TRANSACTIONS_ADDED.getAndIncrement(), Byte.MAX_VALUE);
69+
private PendingTransaction(final Transaction transaction, final byte score, final long addedAt) {
70+
this(transaction, score, addedAt, TRANSACTIONS_ADDED.getAndIncrement());
7071
}
7172

7273
public static PendingTransaction newPendingTransaction(
73-
final Transaction transaction, final boolean isLocal, final boolean hasPriority) {
74-
return newPendingTransaction(transaction, isLocal, hasPriority, System.currentTimeMillis());
74+
final Transaction transaction,
75+
final boolean isLocal,
76+
final boolean hasPriority,
77+
final byte score) {
78+
return newPendingTransaction(
79+
transaction, isLocal, hasPriority, score, System.currentTimeMillis());
7580
}
7681

7782
public static PendingTransaction newPendingTransaction(
7883
final Transaction transaction,
7984
final boolean isLocal,
8085
final boolean hasPriority,
86+
final byte score,
8187
final long addedAt) {
8288
if (isLocal) {
8389
if (hasPriority) {
84-
return new Local.Priority(transaction, addedAt);
90+
return new Local.Priority(transaction, score, addedAt);
8591
}
86-
return new Local(transaction, addedAt);
92+
return new Local(transaction, score, addedAt);
8793
}
8894
if (hasPriority) {
89-
return new Remote.Priority(transaction, addedAt);
95+
return new Remote.Priority(transaction, score, addedAt);
9096
}
91-
return new Remote(transaction, addedAt);
97+
return new Remote(transaction, score, addedAt);
9298
}
9399

94100
@Override
@@ -311,16 +317,16 @@ public String toTraceLog() {
311317

312318
public static class Local extends PendingTransaction {
313319

314-
public Local(final Transaction transaction, final long addedAt) {
315-
super(transaction, addedAt);
320+
public Local(final Transaction transaction, final byte score, final long addedAt) {
321+
super(transaction, score, addedAt);
316322
}
317323

318324
public Local(final Transaction transaction) {
319-
this(transaction, System.currentTimeMillis());
325+
this(transaction, MAX_SCORE, System.currentTimeMillis());
320326
}
321327

322328
private Local(final long sequence, final byte score, final Transaction transaction) {
323-
super(transaction, System.currentTimeMillis(), sequence, score);
329+
super(transaction, score, System.currentTimeMillis(), sequence);
324330
}
325331

326332
@Override
@@ -340,11 +346,11 @@ public boolean hasPriority() {
340346

341347
public static class Priority extends Local {
342348
public Priority(final Transaction transaction) {
343-
this(transaction, System.currentTimeMillis());
349+
this(transaction, MAX_SCORE, System.currentTimeMillis());
344350
}
345351

346-
public Priority(final Transaction transaction, final long addedAt) {
347-
super(transaction, addedAt);
352+
public Priority(final Transaction transaction, final byte score, final long addedAt) {
353+
super(transaction, score, addedAt);
348354
}
349355

350356
public Priority(final long sequence, final byte score, final Transaction transaction) {
@@ -365,16 +371,16 @@ public boolean hasPriority() {
365371

366372
public static class Remote extends PendingTransaction {
367373

368-
public Remote(final Transaction transaction, final long addedAt) {
369-
super(transaction, addedAt);
374+
public Remote(final Transaction transaction, final byte score, final long addedAt) {
375+
super(transaction, score, addedAt);
370376
}
371377

372378
public Remote(final Transaction transaction) {
373-
this(transaction, System.currentTimeMillis());
379+
this(transaction, MAX_SCORE, System.currentTimeMillis());
374380
}
375381

376382
private Remote(final long sequence, final byte score, final Transaction transaction) {
377-
super(transaction, System.currentTimeMillis(), sequence, score);
383+
super(transaction, score, System.currentTimeMillis(), sequence);
378384
}
379385

380386
@Override
@@ -394,11 +400,11 @@ public boolean hasPriority() {
394400

395401
public static class Priority extends Remote {
396402
public Priority(final Transaction transaction) {
397-
this(transaction, System.currentTimeMillis());
403+
this(transaction, MAX_SCORE, System.currentTimeMillis());
398404
}
399405

400-
public Priority(final Transaction transaction, final long addedAt) {
401-
super(transaction, addedAt);
406+
public Priority(final Transaction transaction, final byte score, final long addedAt) {
407+
super(transaction, score, addedAt);
402408
}
403409

404410
public Priority(final long sequence, final byte score, final Transaction transaction) {

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

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515
package org.hyperledger.besu.ethereum.eth.transactions;
1616

17+
import static org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction.MAX_SCORE;
1718
import static org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason.CHAIN_HEAD_NOT_AVAILABLE;
1819
import static org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason.CHAIN_HEAD_WORLD_STATE_NOT_AVAILABLE;
1920
import static org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason.INTERNAL_ERROR;
@@ -32,6 +33,8 @@
3233
import org.hyperledger.besu.ethereum.chain.MutableBlockchain;
3334
import org.hyperledger.besu.ethereum.core.BlockHeader;
3435
import org.hyperledger.besu.ethereum.core.Transaction;
36+
import org.hyperledger.besu.ethereum.core.encoding.EncodingContext;
37+
import org.hyperledger.besu.ethereum.core.encoding.TransactionEncoder;
3538
import org.hyperledger.besu.ethereum.eth.manager.EthContext;
3639
import org.hyperledger.besu.ethereum.eth.manager.EthPeer;
3740
import org.hyperledger.besu.ethereum.eth.manager.EthScheduler;
@@ -190,7 +193,7 @@ void handleConnect(final EthPeer peer) {
190193
public ValidationResult<TransactionInvalidReason> addTransactionViaApi(
191194
final Transaction transaction) {
192195

193-
final var result = addTransaction(transaction, true);
196+
final var result = addTransaction(transaction, true, MAX_SCORE);
194197
if (result.isValid()) {
195198
localSenders.add(transaction.getSender());
196199
transactionBroadcaster.onTransactionsAdded(List.of(transaction));
@@ -211,7 +214,7 @@ public Map<Hash, ValidationResult<TransactionInvalidReason>> addRemoteTransactio
211214
Collectors.toMap(
212215
Transaction::getHash,
213216
transaction -> {
214-
final var result = addTransaction(transaction, false);
217+
final var result = addTransaction(transaction, false, MAX_SCORE);
215218
if (result.isValid()) {
216219
addedTransactions.add(transaction);
217220
}
@@ -241,7 +244,7 @@ public Map<Hash, ValidationResult<TransactionInvalidReason>> addRemoteTransactio
241244
}
242245

243246
private ValidationResult<TransactionInvalidReason> addTransaction(
244-
final Transaction transaction, final boolean isLocal) {
247+
final Transaction transaction, final boolean isLocal, final byte score) {
245248

246249
final boolean hasPriority = isPriorityTransaction(transaction, isLocal);
247250

@@ -261,7 +264,7 @@ private ValidationResult<TransactionInvalidReason> addTransaction(
261264
if (validationResult.result.isValid()) {
262265
final TransactionAddedResult status =
263266
pendingTransactions.addTransaction(
264-
PendingTransaction.newPendingTransaction(transaction, isLocal, hasPriority),
267+
PendingTransaction.newPendingTransaction(transaction, isLocal, hasPriority, score),
265268
validationResult.maybeAccount);
266269
if (status.isSuccess()) {
267270
LOG.atTrace()
@@ -822,8 +825,10 @@ private void executeSaveToDisk(final PendingTransactions pendingTransactionsToSa
822825
.map(
823826
ptx -> {
824827
final BytesValueRLPOutput rlp = new BytesValueRLPOutput();
825-
ptx.getTransaction().writeTo(rlp);
826-
return (ptx.isReceivedFromLocalSource() ? "l" : "r")
828+
TransactionEncoder.encodeRLP(
829+
ptx.getTransaction(), rlp, EncodingContext.POOLED_TRANSACTION);
830+
return ptx.getScore()
831+
+ (ptx.isReceivedFromLocalSource() ? "l" : "r")
827832
+ rlp.encoded().toBase64String();
828833
})
829834
.mapToInt(
@@ -870,12 +875,19 @@ private void executeLoadFromDisk() {
870875
.takeWhile(unused -> !isCancelled.get())
871876
.map(
872877
line -> {
873-
final boolean isLocal = line.charAt(0) == 'l';
878+
int i = 0;
879+
final var sbScore = new StringBuilder();
880+
while ("1234567890-".indexOf(line.charAt(i)) >= 0) {
881+
sbScore.append(line.charAt(i++));
882+
}
883+
final byte score =
884+
sbScore.isEmpty() ? MAX_SCORE : Byte.parseByte(sbScore.toString());
885+
final boolean isLocal = line.charAt(i) == 'l';
874886
final Transaction tx =
875-
Transaction.readFrom(Bytes.fromBase64String(line.substring(1)));
887+
Transaction.readFrom(Bytes.fromBase64String(line.substring(i + 1)));
876888

877889
final ValidationResult<TransactionInvalidReason> result =
878-
addTransaction(tx, isLocal);
890+
addTransaction(tx, isLocal, score);
879891
return result.isValid() ? "OK" : result.getInvalidReason().name();
880892
})
881893
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

0 commit comments

Comments
 (0)