Skip to content

Commit 7c6c9b7

Browse files
committed
Fix allow underpriced tx processing
Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net>
1 parent 5edf766 commit 7c6c9b7

File tree

5 files changed

+22
-17
lines changed

5 files changed

+22
-17
lines changed

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AbstractEstimateGas.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ protected static TransactionValidationParams getTransactionValidationParams(
204204

205205
return isAllowExceedingBalance
206206
? TransactionValidationParams.transactionSimulatorAllowExceedingBalanceAndFutureNonce()
207-
: TransactionValidationParams.transactionSimulatorEstimateGasParams();
207+
: TransactionValidationParams.transactionSimulatorAllowUnderpricedAndFutureNonce();
208208
}
209209

210210
@VisibleForTesting

ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGasTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ public void shouldNotIgnoreSenderBalanceByDefault() {
444444
modifiedLegacyTransactionCallParameter(
445445
Long.MAX_VALUE, Wei.ZERO, OptionalLong.empty(), Optional.empty())),
446446
eq(Optional.empty()), // no account overrides
447-
eq(TransactionValidationParams.transactionSimulatorEstimateGasParams()),
447+
eq(TransactionValidationParams.transactionSimulatorAllowUnderpricedAndFutureNonce()),
448448
any(OperationTracer.class),
449449
eq(pendingBlockHeader));
450450
}

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -494,17 +494,23 @@ public TransactionProcessingResult processTransaction(
494494
final CoinbaseFeePriceCalculator coinbaseCalculator;
495495
if (blockHeader.getBaseFee().isPresent()) {
496496
final Wei baseFee = blockHeader.getBaseFee().get();
497-
if (transactionGasPrice.compareTo(baseFee) < 0) {
498-
return TransactionProcessingResult.failed(
499-
gasUsedByTransaction,
500-
refundedGas,
501-
ValidationResult.invalid(
502-
TransactionInvalidReason.TRANSACTION_PRICE_TOO_LOW,
503-
"transaction price must be greater than base fee"),
504-
Optional.empty(),
505-
Optional.empty());
497+
final boolean gasPriceBelowBaseFee = transactionGasPrice.compareTo(baseFee) < 0;
498+
if (transactionValidationParams.allowUnderpriced()) {
499+
coinbaseCalculator =
500+
gasPriceBelowBaseFee ? (a, b, c) -> Wei.ZERO : coinbaseFeePriceCalculator;
501+
} else {
502+
if (gasPriceBelowBaseFee) {
503+
return TransactionProcessingResult.failed(
504+
gasUsedByTransaction,
505+
refundedGas,
506+
ValidationResult.invalid(
507+
TransactionInvalidReason.TRANSACTION_PRICE_TOO_LOW,
508+
"transaction price must be greater than base fee"),
509+
Optional.empty(),
510+
Optional.empty());
511+
}
512+
coinbaseCalculator = coinbaseFeePriceCalculator;
506513
}
507-
coinbaseCalculator = coinbaseFeePriceCalculator;
508514
} else {
509515
coinbaseCalculator = CoinbaseFeePriceCalculator.frontier();
510516
}

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionValidationParams.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public interface TransactionValidationParams {
3838
TransactionValidationParams transactionSimulatorParamsAllowFutureNonce =
3939
ImmutableTransactionValidationParams.of(true, false, false, false, false, true);
4040

41-
TransactionValidationParams transactionSimulatorEstimateGasParams =
41+
TransactionValidationParams transactionSimulatorAllowUnderpricedAndFutureNonceParams =
4242
ImmutableTransactionValidationParams.of(true, false, true, false, false, true);
4343

4444
TransactionValidationParams transactionSimulatorAllowExceedingBalanceParams =
@@ -85,8 +85,8 @@ static TransactionValidationParams transactionSimulatorAllowFutureNonce() {
8585
return transactionSimulatorParamsAllowFutureNonce;
8686
}
8787

88-
static TransactionValidationParams transactionSimulatorEstimateGasParams() {
89-
return transactionSimulatorEstimateGasParams;
88+
static TransactionValidationParams transactionSimulatorAllowUnderpricedAndFutureNonce() {
89+
return transactionSimulatorAllowUnderpricedAndFutureNonceParams;
9090
}
9191

9292
static TransactionValidationParams transactionSimulatorAllowExceedingBalance() {

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/TransactionSimulator.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -414,8 +414,7 @@ public Optional<TransactionSimulatorResult> processWithWorldUpdater(
414414
final Address senderAddress = callParams.getSender().orElse(DEFAULT_FROM);
415415

416416
final ProcessableBlockHeader blockHeaderToProcess;
417-
if ((transactionValidationParams.isAllowExceedingBalance()
418-
|| transactionValidationParams.allowUnderpriced())
417+
if (transactionValidationParams.isAllowExceedingBalance()
419418
&& processableHeader.getBaseFee().isPresent()) {
420419
blockHeaderToProcess =
421420
new BlockHeaderBuilder()

0 commit comments

Comments
 (0)