Not all invalid transient not selected txs should be penalized (#8231)

Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net>
This commit is contained in:
Fabio Di Fabio
2025-02-04 10:52:34 +01:00
committed by GitHub
parent e006bbf62e
commit 90df5e5564
5 changed files with 28 additions and 14 deletions

View File

@@ -85,14 +85,15 @@ public class ProcessingResultTransactionSelector extends AbstractTransactionSele
final ValidationResult<TransactionInvalidReason> invalidReasonValidationResult) {
final TransactionInvalidReason invalidReason = invalidReasonValidationResult.getInvalidReason();
// If the invalid reason is transient, then leave the transaction in the pool and continue
// If the invalid reason is transient, then penalize but leave the transaction in the pool and
// continue
if (isTransientValidationError(invalidReason)) {
LOG.atTrace()
.setMessage("Transient validation error {} for transaction {} keeping it in the pool")
.setMessage("Transient validation error {} for transaction {}, penalize it in the pool")
.addArgument(invalidReason)
.addArgument(transaction::toTraceLog)
.log();
return TransactionSelectionResult.invalidTransient(invalidReason.name());
return TransactionSelectionResult.invalidPenalized(invalidReason.name());
}
// If the transaction was invalid for any other reason, delete it, and continue.
LOG.atTrace()

View File

@@ -852,7 +852,7 @@ public abstract class AbstractBlockTransactionSelectorTest {
.containsOnly(
entry(
futureTransaction,
TransactionSelectionResult.invalidTransient(
TransactionSelectionResult.invalidPenalized(
TransactionInvalidReason.NONCE_TOO_HIGH.name())));
}
@@ -1035,13 +1035,13 @@ public abstract class AbstractBlockTransactionSelectorTest {
try {
Thread.sleep(t);
} catch (final InterruptedException e) {
return TransactionSelectionResult.invalidTransient(EXECUTION_INTERRUPTED.name());
return TransactionSelectionResult.invalidPenalized(EXECUTION_INTERRUPTED.name());
}
} else {
try {
Thread.sleep(fastProcessingTxTime);
} catch (final InterruptedException e) {
return TransactionSelectionResult.invalidTransient(EXECUTION_INTERRUPTED.name());
return TransactionSelectionResult.invalidPenalized(EXECUTION_INTERRUPTED.name());
}
}
return SELECTED;
@@ -1190,13 +1190,13 @@ public abstract class AbstractBlockTransactionSelectorTest {
try {
Thread.sleep(t);
} catch (final InterruptedException e) {
return TransactionSelectionResult.invalidTransient(EXECUTION_INTERRUPTED.name());
return TransactionSelectionResult.invalidPenalized(EXECUTION_INTERRUPTED.name());
}
} else {
try {
Thread.sleep(fastProcessingTxTime);
} catch (final InterruptedException e) {
return TransactionSelectionResult.invalidTransient(EXECUTION_INTERRUPTED.name());
return TransactionSelectionResult.invalidPenalized(EXECUTION_INTERRUPTED.name());
}
}
return invalidSelectionResult;

View File

@@ -537,7 +537,7 @@ public class LayeredPendingTransactionsTest extends BaseTransactionPoolTest {
pendingTransactions.selectTransactions(
pendingTx -> {
parsedTransactions.add(pendingTx);
return TransactionSelectionResult.invalidTransient(
return TransactionSelectionResult.invalidPenalized(
GAS_PRICE_BELOW_CURRENT_BASE_FEE.name());
});

View File

@@ -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 = 'CrhgK6qq7Ym5AARLCQ0lQvZQpsejUgoFcnL1rU+ZGBs='
knownHash = 'FEieWer0x6AdCmvf02G7yGQxS5JRxsIYrRDpqsNgQ+0='
}
check.dependsOn('checkAPIChanges')

View File

@@ -66,7 +66,8 @@ public class TransactionSelectionResult {
BLOCK_SELECTION_TIMEOUT_INVALID_TX(true, true, true),
TX_EVALUATION_TOO_LONG(true, false, true),
INVALID_TX_EVALUATION_TOO_LONG(true, true, true),
INVALID_TRANSIENT(false, false, true),
INVALID_TRANSIENT(false, false, false),
INVALID_PENALIZED(false, false, true),
INVALID(false, true, false);
private final boolean stop;
@@ -160,21 +161,21 @@ public class TransactionSelectionResult {
* price, but the selection should continue.
*/
public static final TransactionSelectionResult CURRENT_TX_PRICE_BELOW_MIN =
TransactionSelectionResult.invalidTransient("CURRENT_TX_PRICE_BELOW_MIN");
TransactionSelectionResult.invalidPenalized("CURRENT_TX_PRICE_BELOW_MIN");
/**
* The transaction has not been selected since its blob price is below the current network blob
* price, but the selection should continue.
*/
public static final TransactionSelectionResult BLOB_PRICE_BELOW_CURRENT_MIN =
TransactionSelectionResult.invalidTransient("BLOB_PRICE_BELOW_CURRENT_MIN");
TransactionSelectionResult.invalidPenalized("BLOB_PRICE_BELOW_CURRENT_MIN");
/**
* The transaction has not been selected since its priority fee is below the configured min
* priority fee per gas, but the selection should continue.
*/
public static final TransactionSelectionResult PRIORITY_FEE_PER_GAS_BELOW_CURRENT_MIN =
TransactionSelectionResult.invalidTransient("PRIORITY_FEE_PER_GAS_BELOW_CURRENT_MIN");
TransactionSelectionResult.invalidPenalized("PRIORITY_FEE_PER_GAS_BELOW_CURRENT_MIN");
/**
* The transaction has not been selected since its sender already had a previous transaction not
@@ -217,6 +218,18 @@ public class TransactionSelectionResult {
return new TransactionSelectionResult(BaseStatus.INVALID_TRANSIENT, invalidReason);
}
/**
* Return a selection result that identify the candidate transaction as temporarily invalid and
* that it should be penalized, this means that the transaction could become valid at a later
* time.
*
* @param invalidReason the reason why transaction is invalid
* @return the selection result
*/
public static TransactionSelectionResult invalidPenalized(final String invalidReason) {
return new TransactionSelectionResult(BaseStatus.INVALID_PENALIZED, invalidReason);
}
/**
* Return a selection result that identify the candidate transaction as permanently invalid, this
* means that it could be removed safely from the transaction pool.