Introduce transaction pool interface (#4939)

* Introduce transaction pool interface

Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net>

* Fix spotless

Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net>

* Apply suggestiong from code review

Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net>

* Update consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeReorgTest.java

Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com>

* Update consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeReorgTest.java

Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com>

Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net>
Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com>
Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com>
This commit is contained in:
Fabio Di Fabio
2023-01-18 02:59:30 +01:00
committed by GitHub
parent b36f84e993
commit aa53f22004
43 changed files with 237 additions and 160 deletions

View File

@@ -33,7 +33,7 @@ import org.hyperledger.besu.ethereum.core.BlockHeaderBuilder;
import org.hyperledger.besu.ethereum.core.BlockHeaderFunctions;
import org.hyperledger.besu.ethereum.core.SealableBlockHeader;
import org.hyperledger.besu.ethereum.core.Util;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import org.hyperledger.besu.ethereum.mainnet.ScheduleBasedBlockHeaderFunctions;
@@ -49,7 +49,7 @@ public class CliqueBlockCreator extends AbstractBlockCreator {
final Address coinbase,
final Supplier<Optional<Long>> targetGasLimitSupplier,
final ExtraDataCalculator extraDataCalculator,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final NodeKey nodeKey,

View File

@@ -28,7 +28,7 @@ import org.hyperledger.besu.ethereum.chain.PoWObserver;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.MiningParameters;
import org.hyperledger.besu.ethereum.core.Util;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import org.hyperledger.besu.util.Subscribers;
@@ -51,7 +51,7 @@ public class CliqueMinerExecutor extends AbstractMinerExecutor<CliqueBlockMiner>
public CliqueMinerExecutor(
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final NodeKey nodeKey,
final MiningParameters miningParams,
final AbstractBlockScheduler blockScheduler,

View File

@@ -26,7 +26,7 @@ import org.hyperledger.besu.ethereum.blockcreation.AbstractBlockCreator;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.BlockHeaderBuilder;
import org.hyperledger.besu.ethereum.core.SealableBlockHeader;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import java.util.Optional;
@@ -43,7 +43,7 @@ public class BftBlockCreator extends AbstractBlockCreator {
final Address localAddress,
final Supplier<Optional<Long>> targetGasLimitSupplier,
final ExtraDataCalculator extraDataCalculator,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final Wei minTransactionGasPrice,

View File

@@ -32,7 +32,7 @@ import org.hyperledger.besu.ethereum.ProtocolContext;
import org.hyperledger.besu.ethereum.blockcreation.BlockCreator;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.MiningParameters;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.AbstractGasLimitSpecification;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
@@ -46,7 +46,7 @@ import org.apache.tuweni.bytes.Bytes;
public class BftBlockCreatorFactory<T extends BftConfigOptions> {
protected final ForksSchedule<T> forksSchedule;
private final AbstractPendingTransactionsSorter pendingTransactions;
private final PendingTransactions pendingTransactions;
protected final ProtocolContext protocolContext;
protected final ProtocolSchedule protocolSchedule;
protected final BftExtraDataCodec bftExtraDataCodec;
@@ -58,7 +58,7 @@ public class BftBlockCreatorFactory<T extends BftConfigOptions> {
private volatile Optional<AtomicLong> targetGasLimit;
public BftBlockCreatorFactory(
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final ForksSchedule<T> forksSchedule,

View File

@@ -29,7 +29,7 @@ import org.hyperledger.besu.ethereum.core.BlockHeaderBuilder;
import org.hyperledger.besu.ethereum.core.BlockHeaderFunctions;
import org.hyperledger.besu.ethereum.core.SealableBlockHeader;
import org.hyperledger.besu.ethereum.core.Util;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import org.hyperledger.besu.ethereum.mainnet.ScheduleBasedBlockHeaderFunctions;
@@ -49,7 +49,7 @@ public class IbftBlockCreator extends AbstractBlockCreator {
final Address coinbase,
final Supplier<Optional<Long>> targetGasLimitSupplier,
final ExtraDataCalculator extraDataCalculator,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final KeyPair nodeKeys,

View File

@@ -24,7 +24,7 @@ import org.hyperledger.besu.ethereum.core.Difficulty;
import org.hyperledger.besu.ethereum.core.SealableBlockHeader;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.core.Withdrawal;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import java.util.Collections;
@@ -40,7 +40,7 @@ public class MergeBlockCreator extends AbstractBlockCreator {
final Address coinbase,
final Supplier<Optional<Long>> targetGasLimitSupplier,
final ExtraDataCalculator extraDataCalculator,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final Wei minTransactionGasPrice,

View File

@@ -38,7 +38,7 @@ import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.core.Withdrawal;
import org.hyperledger.besu.ethereum.eth.sync.backwardsync.BackwardSyncContext;
import org.hyperledger.besu.ethereum.eth.sync.backwardsync.BadChainListener;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.AbstractGasLimitSpecification;
import org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
@@ -87,7 +87,7 @@ public class MergeCoordinator implements MergeMiningCoordinator, BadChainListene
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final ProposalBuilderExecutor blockBuilderExecutor,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final MiningParameters miningParams,
final BackwardSyncContext backwardSyncContext) {
this.protocolContext = protocolContext;

View File

@@ -35,7 +35,7 @@ import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture;
import org.hyperledger.besu.ethereum.core.Difficulty;
import org.hyperledger.besu.ethereum.core.MiningParameters;
import org.hyperledger.besu.ethereum.eth.sync.backwardsync.BackwardSyncContext;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.BlockHeaderValidator;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;
@@ -56,7 +56,7 @@ import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class MergeReorgTest implements MergeGenesisConfigHelper {
@Mock AbstractPendingTransactionsSorter mockSorter;
@Mock PendingTransactions mockPendingTransactions;
private MergeCoordinator coordinator;
@@ -88,7 +88,7 @@ public class MergeReorgTest implements MergeGenesisConfigHelper {
protocolContext,
mockProtocolSchedule,
CompletableFuture::runAsync,
mockSorter,
mockPendingTransactions,
new MiningParameters.Builder().coinbase(coinbase).build(),
mock(BackwardSyncContext.class));
mergeContext.setIsPostMerge(genesisState.getBlock().getHeader().getDifficulty());

View File

@@ -26,7 +26,7 @@ import org.hyperledger.besu.ethereum.ProtocolContext;
import org.hyperledger.besu.ethereum.blockcreation.BlockCreator;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.MiningParameters;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import java.util.Collections;
@@ -37,7 +37,7 @@ import org.apache.tuweni.bytes.Bytes;
/** Supports contract based voters and validators in extra data */
public class QbftBlockCreatorFactory extends BftBlockCreatorFactory<QbftConfigOptions> {
public QbftBlockCreatorFactory(
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final ForksSchedule<QbftConfigOptions> forksSchedule,

View File

@@ -31,7 +31,7 @@ import org.hyperledger.besu.datatypes.Address;
import org.hyperledger.besu.ethereum.ProtocolContext;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.MiningParameters;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import java.util.Optional;
@@ -59,7 +59,7 @@ public class QbftBlockCreatorFactoryTest {
qbftBlockCreatorFactory =
new QbftBlockCreatorFactory(
mock(AbstractPendingTransactionsSorter.class),
mock(PendingTransactions.class),
mock(ProtocolContext.class),
mock(ProtocolSchedule.class),
forksSchedule,

View File

@@ -20,7 +20,7 @@ import org.hyperledger.besu.ethereum.api.graphql.GraphQLContextType;
import org.hyperledger.besu.ethereum.api.query.BlockchainQueries;
import org.hyperledger.besu.ethereum.api.query.TransactionWithMetadata;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import org.hyperledger.besu.ethereum.transaction.CallParameter;
import org.hyperledger.besu.ethereum.transaction.TransactionSimulator;
@@ -38,9 +38,9 @@ import org.apache.tuweni.units.bigints.UInt256;
@SuppressWarnings("unused") // reflected by GraphQL
public class PendingStateAdapter extends AdapterBase {
private final AbstractPendingTransactionsSorter pendingTransactions;
private final PendingTransactions pendingTransactions;
public PendingStateAdapter(final AbstractPendingTransactionsSorter pendingTransactions) {
public PendingStateAdapter(final PendingTransactions pendingTransactions) {
this.pendingTransactions = pendingTransactions;
}

View File

@@ -16,7 +16,7 @@ package org.hyperledger.besu.ethereum.api.jsonrpc;
import org.hyperledger.besu.datatypes.Address;
import org.hyperledger.besu.ethereum.api.query.BlockchainQueries;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.util.NonceProvider;
import java.util.OptionalLong;
@@ -24,11 +24,10 @@ import java.util.OptionalLong;
public class LatestNonceProvider implements NonceProvider {
private final BlockchainQueries blockchainQueries;
private final AbstractPendingTransactionsSorter pendingTransactions;
private final PendingTransactions pendingTransactions;
public LatestNonceProvider(
final BlockchainQueries blockchainQueries,
final AbstractPendingTransactionsSorter pendingTransactions) {
final BlockchainQueries blockchainQueries, final PendingTransactions pendingTransactions) {
this.blockchainQueries = blockchainQueries;
this.pendingTransactions = pendingTransactions;
}

View File

@@ -24,18 +24,17 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSucces
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.TransactionCompleteResult;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.TransactionPendingResult;
import org.hyperledger.besu.ethereum.api.query.BlockchainQueries;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import java.util.Optional;
public class EthGetTransactionByHash implements JsonRpcMethod {
private final BlockchainQueries blockchain;
private final AbstractPendingTransactionsSorter pendingTransactions;
private final PendingTransactions pendingTransactions;
public EthGetTransactionByHash(
final BlockchainQueries blockchain,
final AbstractPendingTransactionsSorter pendingTransactions) {
final BlockchainQueries blockchain, final PendingTransactions pendingTransactions) {
this.blockchain = blockchain;
this.pendingTransactions = pendingTransactions;
}

View File

@@ -21,24 +21,23 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.BlockParameterOrBlockHash;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.Quantity;
import org.hyperledger.besu.ethereum.api.query.BlockchainQueries;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import java.util.function.Supplier;
import com.google.common.base.Suppliers;
public class EthGetTransactionCount extends AbstractBlockParameterOrBlockHashMethod {
private final Supplier<AbstractPendingTransactionsSorter> pendingTransactions;
private final Supplier<PendingTransactions> pendingTransactions;
public EthGetTransactionCount(
final BlockchainQueries blockchain,
final AbstractPendingTransactionsSorter pendingTransactions) {
final BlockchainQueries blockchain, final PendingTransactions pendingTransactions) {
this(Suppliers.ofInstance(blockchain), Suppliers.ofInstance(pendingTransactions));
}
public EthGetTransactionCount(
final Supplier<BlockchainQueries> blockchain,
final Supplier<AbstractPendingTransactionsSorter> pendingTransactions) {
final Supplier<PendingTransactions> pendingTransactions) {
super(blockchain);
this.pendingTransactions = pendingTransactions;
}

View File

@@ -23,7 +23,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.TransactionPen
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.transaction.pool.PendingTransactionFilter;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.transaction.pool.PendingTransactionFilter.Filter;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import java.util.Collections;
import java.util.List;
@@ -34,10 +34,9 @@ public class TxPoolBesuPendingTransactions implements JsonRpcMethod {
final PendingTransactionFilter pendingTransactionFilter;
private final AbstractPendingTransactionsSorter pendingTransactions;
private final PendingTransactions pendingTransactions;
public TxPoolBesuPendingTransactions(
final AbstractPendingTransactionsSorter pendingTransactions) {
public TxPoolBesuPendingTransactions(final PendingTransactions pendingTransactions) {
this.pendingTransactions = pendingTransactions;
this.pendingTransactionFilter = new PendingTransactionFilter();
}

View File

@@ -20,15 +20,15 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcRespon
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.PendingTransactionsStatisticsResult;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import java.util.Set;
public class TxPoolBesuStatistics implements JsonRpcMethod {
private final AbstractPendingTransactionsSorter pendingTransactions;
private final PendingTransactions pendingTransactions;
public TxPoolBesuStatistics(final AbstractPendingTransactionsSorter pendingTransactions) {
public TxPoolBesuStatistics(final PendingTransactions pendingTransactions) {
this.pendingTransactions = pendingTransactions;
}

View File

@@ -19,13 +19,13 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.PendingTransactionsResult;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
public class TxPoolBesuTransactions implements JsonRpcMethod {
private final AbstractPendingTransactionsSorter pendingTransactions;
private final PendingTransactions pendingTransactions;
public TxPoolBesuTransactions(final AbstractPendingTransactionsSorter pendingTransactions) {
public TxPoolBesuTransactions(final PendingTransactions pendingTransactions) {
this.pendingTransactions = pendingTransactions;
}

View File

@@ -20,7 +20,7 @@ import static org.mockito.Mockito.when;
import org.hyperledger.besu.datatypes.Address;
import org.hyperledger.besu.ethereum.api.query.BlockchainQueries;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.BaseFeePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.GasPricePendingTransactionsSorter;
@@ -41,7 +41,7 @@ public class LatestNonceProviderTest {
private final BlockchainQueries blockchainQueries = mock(BlockchainQueries.class);
private LatestNonceProvider nonceProvider;
@Parameterized.Parameter public AbstractPendingTransactionsSorter pendingTransactions;
@Parameterized.Parameter public PendingTransactions pendingTransactions;
@Parameterized.Parameters
public static Collection<Object[]> data() {

View File

@@ -27,7 +27,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSucces
import org.hyperledger.besu.ethereum.api.query.BlockchainQueries;
import org.hyperledger.besu.ethereum.chain.Blockchain;
import org.hyperledger.besu.ethereum.chain.ChainHead;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.BaseFeePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.GasPricePendingTransactionsSorter;
@@ -57,8 +57,7 @@ class EthGetTransactionCountTest {
@ParameterizedTest
@MethodSource("data")
void shouldUsePendingTransactionsWhenToldTo(
final AbstractPendingTransactionsSorter pendingTransactions) {
void shouldUsePendingTransactionsWhenToldTo(final PendingTransactions pendingTransactions) {
setup(pendingTransactions);
final Address address = Address.fromHexString(pendingTransactionString);
@@ -75,7 +74,7 @@ class EthGetTransactionCountTest {
@ParameterizedTest
@MethodSource("data")
void shouldUseLatestTransactionsWhenNoPendingTransactions(
final AbstractPendingTransactionsSorter pendingTransactions) {
final PendingTransactions pendingTransactions) {
setup(pendingTransactions);
final Address address = Address.fromHexString(pendingTransactionString);
@@ -91,8 +90,7 @@ class EthGetTransactionCountTest {
@ParameterizedTest
@MethodSource("data")
void shouldUseLatestWhenItIsBiggerThanPending(
final AbstractPendingTransactionsSorter pendingTransactions) {
void shouldUseLatestWhenItIsBiggerThanPending(final PendingTransactions pendingTransactions) {
setup(pendingTransactions);
final Address address = Address.fromHexString(pendingTransactionString);
@@ -109,8 +107,7 @@ class EthGetTransactionCountTest {
@ParameterizedTest
@MethodSource("data")
void shouldReturnPendingWithHighNonce(
final AbstractPendingTransactionsSorter pendingTransactions) {
void shouldReturnPendingWithHighNonce(final PendingTransactions pendingTransactions) {
setup(pendingTransactions);
final Address address = Address.fromHexString(pendingTransactionString);
@@ -127,8 +124,7 @@ class EthGetTransactionCountTest {
@ParameterizedTest
@MethodSource("data")
void shouldReturnLatestWithHighNonce(
final AbstractPendingTransactionsSorter pendingTransactions) {
void shouldReturnLatestWithHighNonce(final PendingTransactions pendingTransactions) {
setup(pendingTransactions);
final Address address = Address.fromHexString(pendingTransactionString);
@@ -143,7 +139,7 @@ class EthGetTransactionCountTest {
assertThat(response.getResult()).isEqualTo("0xfffffffffffffffe");
}
private void setup(final AbstractPendingTransactionsSorter pendingTransactions) {
private void setup(final PendingTransactions pendingTransactions) {
ethGetTransactionCount = new EthGetTransactionCount(blockchainQueries, pendingTransactions);
}

View File

@@ -29,7 +29,7 @@ import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader;
import org.hyperledger.besu.ethereum.core.SealableBlockHeader;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.core.Withdrawal;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.AbstractBlockProcessor;
import org.hyperledger.besu.ethereum.mainnet.BodyValidation;
import org.hyperledger.besu.ethereum.mainnet.DifficultyCalculator;
@@ -72,7 +72,7 @@ public abstract class AbstractBlockCreator implements AsyncBlockCreator {
protected final Supplier<Optional<Long>> targetGasLimitSupplier;
private final ExtraDataCalculator extraDataCalculator;
private final AbstractPendingTransactionsSorter pendingTransactions;
private final PendingTransactions pendingTransactions;
protected final ProtocolContext protocolContext;
protected final ProtocolSchedule protocolSchedule;
protected final BlockHeaderFunctions blockHeaderFunctions;
@@ -88,7 +88,7 @@ public abstract class AbstractBlockCreator implements AsyncBlockCreator {
final MiningBeneficiaryCalculator miningBeneficiaryCalculator,
final Supplier<Optional<Long>> targetGasLimitSupplier,
final ExtraDataCalculator extraDataCalculator,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final Wei minTransactionGasPrice,

View File

@@ -21,7 +21,7 @@ import org.hyperledger.besu.ethereum.chain.MinedBlockObserver;
import org.hyperledger.besu.ethereum.chain.PoWObserver;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.MiningParameters;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.AbstractGasLimitSpecification;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import org.hyperledger.besu.util.Subscribers;
@@ -45,7 +45,7 @@ public abstract class AbstractMinerExecutor<M extends BlockMiner<? extends Abstr
private final ExecutorService executorService = Executors.newCachedThreadPool();
protected final ProtocolContext protocolContext;
protected final ProtocolSchedule protocolSchedule;
protected final AbstractPendingTransactionsSorter pendingTransactions;
protected final PendingTransactions pendingTransactions;
protected final AbstractBlockScheduler blockScheduler;
protected volatile Bytes extraData;
@@ -58,7 +58,7 @@ public abstract class AbstractMinerExecutor<M extends BlockMiner<? extends Abstr
protected AbstractMinerExecutor(
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final MiningParameters miningParams,
final AbstractBlockScheduler blockScheduler) {
this.protocolContext = protocolContext;

View File

@@ -23,8 +23,8 @@ import org.hyperledger.besu.ethereum.core.MutableWorldState;
import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.core.TransactionReceipt;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter.TransactionSelectionResult;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions.TransactionSelectionResult;
import org.hyperledger.besu.ethereum.mainnet.AbstractBlockProcessor;
import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor;
import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionValidator;
@@ -188,7 +188,7 @@ public class BlockTransactionSelector {
private final ProcessableBlockHeader processableBlockHeader;
private final Blockchain blockchain;
private final MutableWorldState worldState;
private final AbstractPendingTransactionsSorter pendingTransactions;
private final PendingTransactions pendingTransactions;
private final AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory;
private final Address miningBeneficiary;
private final FeeMarket feeMarket;
@@ -200,7 +200,7 @@ public class BlockTransactionSelector {
final MainnetTransactionProcessor transactionProcessor,
final Blockchain blockchain,
final MutableWorldState worldState,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final ProcessableBlockHeader processableBlockHeader,
final AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory,
final Wei minTransactionGasPrice,

View File

@@ -20,7 +20,7 @@ import org.hyperledger.besu.ethereum.ProtocolContext;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.BlockHeaderBuilder;
import org.hyperledger.besu.ethereum.core.SealableBlockHeader;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.EthHash;
import org.hyperledger.besu.ethereum.mainnet.PoWSolution;
import org.hyperledger.besu.ethereum.mainnet.PoWSolver;
@@ -43,7 +43,7 @@ public class PoWBlockCreator extends AbstractBlockCreator {
final Address coinbase,
final Supplier<Optional<Long>> targetGasLimitSupplier,
final ExtraDataCalculator extraDataCalculator,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final PoWSolver nonceSolver,

View File

@@ -20,7 +20,7 @@ import org.hyperledger.besu.ethereum.chain.MinedBlockObserver;
import org.hyperledger.besu.ethereum.chain.PoWObserver;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.MiningParameters;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.mainnet.EpochCalculator;
import org.hyperledger.besu.ethereum.mainnet.PoWSolver;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
@@ -42,7 +42,7 @@ public class PoWMinerExecutor extends AbstractMinerExecutor<PoWBlockMiner> {
public PoWMinerExecutor(
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final MiningParameters miningParams,
final AbstractBlockScheduler blockScheduler,
final EpochCalculator epochCalculator,

View File

@@ -40,7 +40,7 @@ import org.hyperledger.besu.ethereum.core.TransactionReceipt;
import org.hyperledger.besu.ethereum.core.TransactionTestFixture;
import org.hyperledger.besu.ethereum.difficulty.fixed.FixedDifficultyProtocolSchedule;
import org.hyperledger.besu.ethereum.eth.transactions.ImmutableTransactionPoolConfiguration;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.BaseFeePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor;
import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionValidator;
@@ -81,7 +81,7 @@ public abstract class AbstractBlockTransactionSelectorTest {
protected final MetricsSystem metricsSystem = new NoOpMetricsSystem();
protected final Blockchain blockchain = new ReferenceTestBlockchain();
protected AbstractPendingTransactionsSorter pendingTransactions;
protected PendingTransactions pendingTransactions;
protected MutableWorldState worldState;
@Mock protected MainnetTransactionProcessor transactionProcessor;
@Mock protected MainnetTransactionValidator transactionValidator;
@@ -89,12 +89,12 @@ public abstract class AbstractBlockTransactionSelectorTest {
@Before
public void setup() {
worldState = InMemoryKeyValueStorageProvider.createInMemoryWorldState();
pendingTransactions = createPendingTransactionsSorter();
pendingTransactions = createPendingTransactions();
when(transactionProcessor.getTransactionValidator()).thenReturn(transactionValidator);
when(transactionValidator.getGoQuorumCompatibilityMode()).thenReturn(true);
}
protected abstract AbstractPendingTransactionsSorter createPendingTransactionsSorter();
protected abstract PendingTransactions createPendingTransactions();
private Boolean isCancelled() {
return false;

View File

@@ -19,7 +19,7 @@ import static org.mockito.Mockito.when;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.eth.transactions.ImmutableTransactionPoolConfiguration;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.GasPricePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
import org.hyperledger.besu.testutil.TestClock;
@@ -31,7 +31,7 @@ public class LegacyFeeMarketBlockTransactionSelectorTest
extends AbstractBlockTransactionSelectorTest {
@Override
protected AbstractPendingTransactionsSorter createPendingTransactionsSorter() {
protected PendingTransactions createPendingTransactions() {
return new GasPricePendingTransactionsSorter(
ImmutableTransactionPoolConfiguration.builder()

View File

@@ -25,7 +25,7 @@ import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.eth.transactions.ImmutableTransactionPoolConfiguration;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.BaseFeePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
import org.hyperledger.besu.plugin.data.TransactionType;
@@ -42,7 +42,7 @@ public class LondonFeeMarketBlockTransactionSelectorTest
extends AbstractBlockTransactionSelectorTest {
@Override
protected AbstractPendingTransactionsSorter createPendingTransactionsSorter() {
protected PendingTransactions createPendingTransactions() {
return new BaseFeePendingTransactionsSorter(
ImmutableTransactionPoolConfiguration.builder()
.txPoolMaxSize(5)

View File

@@ -39,7 +39,7 @@ import org.hyperledger.besu.ethereum.core.SealableBlockHeader;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.core.TransactionTestFixture;
import org.hyperledger.besu.ethereum.eth.transactions.ImmutableTransactionPoolConfiguration;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.GasPricePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.mainnet.MainnetProtocolSchedule;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
@@ -84,7 +84,7 @@ public abstract class AbstractIsolationTests {
protected final GenesisState genesisState =
GenesisState.fromConfig(GenesisConfigFile.development(), protocolSchedule);
protected final MutableBlockchain blockchain = createInMemoryBlockchain(genesisState.getBlock());
protected final AbstractPendingTransactionsSorter sorter =
protected final PendingTransactions sorter =
new GasPricePendingTransactionsSorter(
ImmutableTransactionPoolConfiguration.builder().txPoolMaxSize(100).build(),
Clock.systemUTC(),
@@ -173,7 +173,7 @@ public abstract class AbstractIsolationTests {
final MiningBeneficiaryCalculator miningBeneficiaryCalculator,
final Supplier<Optional<Long>> targetGasLimitSupplier,
final ExtraDataCalculator extraDataCalculator,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final Wei minTransactionGasPrice,
@@ -196,7 +196,7 @@ public abstract class AbstractIsolationTests {
final BlockHeader parentHeader,
final ProtocolContext protocolContext,
final ProtocolSchedule protocolSchedule,
final AbstractPendingTransactionsSorter sorter) {
final PendingTransactions sorter) {
return new TestBlockCreator(
Address.ZERO,
__ -> Address.ZERO,

View File

@@ -0,0 +1,86 @@
/*
* Copyright Hyperledger Besu Contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.eth.transactions;
import org.hyperledger.besu.datatypes.Address;
import org.hyperledger.besu.datatypes.Hash;
import org.hyperledger.besu.ethereum.core.Block;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.evm.account.Account;
import java.util.List;
import java.util.Optional;
import java.util.OptionalLong;
import java.util.Set;
public interface PendingTransactions {
void reset();
void evictOldTransactions();
List<Transaction> getLocalTransactions();
TransactionAddedStatus addRemoteTransaction(
final Transaction transaction, final Optional<Account> maybeSenderAccount);
TransactionAddedStatus addLocalTransaction(
final Transaction transaction, final Optional<Account> maybeSenderAccount);
void removeTransaction(final Transaction transaction);
void transactionAddedToBlock(final Transaction transaction);
void selectTransactions(final TransactionSelector selector);
long maxSize();
int size();
boolean containsTransaction(final Hash transactionHash);
Optional<Transaction> getTransactionByHash(final Hash transactionHash);
Set<PendingTransaction> getPendingTransactions();
long subscribePendingTransactions(final PendingTransactionListener listener);
void unsubscribePendingTransactions(final long id);
long subscribeDroppedTransactions(final PendingTransactionDroppedListener listener);
void unsubscribeDroppedTransactions(final long id);
OptionalLong getNextNonceForSender(final Address sender);
void manageBlockAdded(final Block block);
String toTraceLog(final boolean withTransactionsBySender, final boolean withLowestInvalidNonce);
List<Transaction> signalInvalidAndGetDependentTransactions(final Transaction transaction);
boolean isLocalSender(final Address sender);
enum TransactionSelectionResult {
DELETE_TRANSACTION_AND_CONTINUE,
CONTINUE,
COMPLETE_OPERATION
}
@FunctionalInterface
interface TransactionSelector {
TransactionSelectionResult evaluateTransaction(final Transaction transaction);
}
}

View File

@@ -22,7 +22,6 @@ import org.hyperledger.besu.ethereum.eth.manager.EthContext;
import org.hyperledger.besu.ethereum.eth.manager.EthPeer;
import org.hyperledger.besu.ethereum.eth.messages.EthPV65;
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool.TransactionBatchAddedListener;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import java.util.ArrayList;
import java.util.Collections;
@@ -35,7 +34,7 @@ import org.slf4j.LoggerFactory;
public class TransactionBroadcaster implements TransactionBatchAddedListener {
private static final Logger LOG = LoggerFactory.getLogger(TransactionBroadcaster.class);
private final AbstractPendingTransactionsSorter pendingTransactions;
private final PendingTransactions pendingTransactions;
private final PeerTransactionTracker transactionTracker;
private final TransactionsMessageSender transactionsMessageSender;
private final NewPooledTransactionHashesMessageSender newPooledTransactionHashesMessageSender;
@@ -44,7 +43,7 @@ public class TransactionBroadcaster implements TransactionBatchAddedListener {
public TransactionBroadcaster(
final EthContext ethContext,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final PeerTransactionTracker transactionTracker,
final TransactionsMessageSender transactionsMessageSender,
final NewPooledTransactionHashesMessageSender newPooledTransactionHashesMessageSender) {

View File

@@ -34,7 +34,6 @@ import org.hyperledger.besu.ethereum.core.MiningParameters;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.eth.manager.EthContext;
import org.hyperledger.besu.ethereum.eth.manager.EthPeer;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionValidator;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams;
@@ -73,7 +72,7 @@ public class TransactionPool implements BlockAddedObserver {
private static final String REMOTE = "remote";
private static final String LOCAL = "local";
private final AbstractPendingTransactionsSorter pendingTransactions;
private final PendingTransactions pendingTransactions;
private final ProtocolSchedule protocolSchedule;
private final ProtocolContext protocolContext;
private final TransactionBroadcaster transactionBroadcaster;
@@ -83,7 +82,7 @@ public class TransactionPool implements BlockAddedObserver {
private final AtomicBoolean isPoolEnabled = new AtomicBoolean(true);
public TransactionPool(
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final ProtocolSchedule protocolSchedule,
final ProtocolContext protocolContext,
final TransactionBroadcaster transactionBroadcaster,
@@ -261,7 +260,7 @@ public class TransactionPool implements BlockAddedObserver {
.getTransactionValidator();
}
public AbstractPendingTransactionsSorter getPendingTransactions() {
public PendingTransactions getPendingTransactions() {
return pendingTransactions;
}

View File

@@ -20,7 +20,6 @@ import org.hyperledger.besu.ethereum.eth.manager.EthContext;
import org.hyperledger.besu.ethereum.eth.messages.EthPV62;
import org.hyperledger.besu.ethereum.eth.messages.EthPV65;
import org.hyperledger.besu.ethereum.eth.sync.state.SyncState;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.BaseFeePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.GasPricePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
@@ -47,8 +46,8 @@ public class TransactionPoolFactory {
final MiningParameters miningParameters,
final TransactionPoolConfiguration transactionPoolConfiguration) {
final AbstractPendingTransactionsSorter pendingTransactions =
createPendingTransactionsSorter(
final PendingTransactions pendingTransactions =
createPendingTransactions(
protocolSchedule, protocolContext, clock, metricsSystem, transactionPoolConfiguration);
final PeerTransactionTracker transactionTracker = new PeerTransactionTracker();
@@ -80,7 +79,7 @@ public class TransactionPoolFactory {
final SyncState syncState,
final MiningParameters miningParameters,
final TransactionPoolConfiguration transactionPoolConfiguration,
final AbstractPendingTransactionsSorter pendingTransactions,
final PendingTransactions pendingTransactions,
final PeerTransactionTracker transactionTracker,
final TransactionsMessageSender transactionsMessageSender,
final NewPooledTransactionHashesMessageSender newPooledTransactionHashesMessageSender) {
@@ -172,7 +171,7 @@ public class TransactionPoolFactory {
.subscribe(EthPV65.NEW_POOLED_TRANSACTION_HASHES, pooledTransactionsMessageHandler);
}
private static AbstractPendingTransactionsSorter createPendingTransactionsSorter(
private static PendingTransactions createPendingTransactions(
final ProtocolSchedule protocolSchedule,
final ProtocolContext protocolContext,
final Clock clock,

View File

@@ -1,5 +1,5 @@
/*
* Copyright ConsenSys AG.
* Copyright Hyperledger Besu Contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -30,6 +30,7 @@ import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactionDroppedListener;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactionListener;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.TransactionAddedStatus;
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration;
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolReplacementHandler;
@@ -68,7 +69,7 @@ import org.slf4j.LoggerFactory;
*
* <p>This class is safe for use across multiple threads.
*/
public abstract class AbstractPendingTransactionsSorter {
public abstract class AbstractPendingTransactionsSorter implements PendingTransactions {
private static final int DEFAULT_LOWEST_INVALID_KNOWN_NONCE_CACHE = 10_000;
private static final Logger LOG =
LoggerFactory.getLogger(AbstractPendingTransactionsSorter.class);
@@ -134,12 +135,14 @@ public abstract class AbstractPendingTransactionsSorter {
pendingTransactions::size);
}
@Override
public void reset() {
pendingTransactions.clear();
transactionsBySender.clear();
lowestInvalidKnownNonceCache.reset();
}
@Override
public void evictOldTransactions() {
final Instant removeTransactionsBefore =
clock.instant().minus(poolConfig.getPendingTxRetentionPeriod(), ChronoUnit.HOURS);
@@ -153,6 +156,7 @@ public abstract class AbstractPendingTransactionsSorter {
});
}
@Override
public List<Transaction> getLocalTransactions() {
return pendingTransactions.values().stream()
.filter(PendingTransaction::isReceivedFromLocalSource)
@@ -160,6 +164,7 @@ public abstract class AbstractPendingTransactionsSorter {
.collect(Collectors.toList());
}
@Override
public TransactionAddedStatus addRemoteTransaction(
final Transaction transaction, final Optional<Account> maybeSenderAccount) {
@@ -182,6 +187,7 @@ public abstract class AbstractPendingTransactionsSorter {
return transactionAddedStatus;
}
@Override
public TransactionAddedStatus addLocalTransaction(
final Transaction transaction, final Optional<Account> maybeSenderAccount) {
final TransactionAddedStatus transactionAdded =
@@ -194,11 +200,13 @@ public abstract class AbstractPendingTransactionsSorter {
return transactionAdded;
}
@Override
public void removeTransaction(final Transaction transaction) {
removeTransaction(transaction, false);
notifyTransactionDropped(transaction);
}
@Override
public void transactionAddedToBlock(final Transaction transaction) {
removeTransaction(transaction, true);
lowestInvalidKnownNonceCache.registerValidTransaction(transaction);
@@ -218,6 +226,7 @@ public abstract class AbstractPendingTransactionsSorter {
// block could end up with transactions of the new type.
// This seems like it would be very rare but worth it to document that we don't handle that case
// right now.
@Override
public void selectTransactions(final TransactionSelector selector) {
synchronized (lock) {
final Set<Transaction> transactionsToRemove = new HashSet<>();
@@ -328,43 +337,53 @@ public abstract class AbstractPendingTransactionsSorter {
transactionDroppedListeners.forEach(listener -> listener.onTransactionDropped(transaction));
}
@Override
public long maxSize() {
return poolConfig.getTxPoolMaxSize();
}
@Override
public int size() {
return pendingTransactions.size();
}
@Override
public boolean containsTransaction(final Hash transactionHash) {
return pendingTransactions.containsKey(transactionHash);
}
@Override
public Optional<Transaction> getTransactionByHash(final Hash transactionHash) {
return Optional.ofNullable(pendingTransactions.get(transactionHash))
.map(PendingTransaction::getTransaction);
}
@Override
public Set<PendingTransaction> getPendingTransactions() {
return new HashSet<>(pendingTransactions.values());
}
@Override
public long subscribePendingTransactions(final PendingTransactionListener listener) {
return pendingTransactionSubscribers.subscribe(listener);
}
@Override
public void unsubscribePendingTransactions(final long id) {
pendingTransactionSubscribers.unsubscribe(id);
}
@Override
public long subscribeDroppedTransactions(final PendingTransactionDroppedListener listener) {
return transactionDroppedListeners.subscribe(listener);
}
@Override
public void unsubscribeDroppedTransactions(final long id) {
transactionDroppedListeners.unsubscribe(id);
}
@Override
public OptionalLong getNextNonceForSender(final Address sender) {
final PendingTransactionsForSender pendingTransactionsForSender =
transactionsBySender.get(sender);
@@ -373,6 +392,7 @@ public abstract class AbstractPendingTransactionsSorter {
: pendingTransactionsForSender.maybeNextNonce();
}
@Override
public abstract void manageBlockAdded(final Block block);
private void removeTransaction(final Transaction transaction, final boolean addedToBlock) {
@@ -444,6 +464,7 @@ public abstract class AbstractPendingTransactionsSorter {
}
}
@Override
public String toTraceLog(
final boolean withTransactionsBySender, final boolean withLowestInvalidNonce) {
synchronized (lock) {
@@ -488,6 +509,7 @@ public abstract class AbstractPendingTransactionsSorter {
}
}
@Override
public List<Transaction> signalInvalidAndGetDependentTransactions(final Transaction transaction) {
final long invalidNonce = lowestInvalidKnownNonceCache.registerInvalidTransaction(transaction);
@@ -510,18 +532,8 @@ public abstract class AbstractPendingTransactionsSorter {
return List.of();
}
@Override
public boolean isLocalSender(final Address sender) {
return localSenders.contains(sender);
}
public enum TransactionSelectionResult {
DELETE_TRANSACTION_AND_CONTINUE,
CONTINUE,
COMPLETE_OPERATION
}
@FunctionalInterface
public interface TransactionSelector {
TransactionSelectionResult evaluateTransaction(final Transaction transaction);
}
}

View File

@@ -59,7 +59,6 @@ import org.hyperledger.besu.ethereum.eth.manager.EthProtocolManagerTestUtil;
import org.hyperledger.besu.ethereum.eth.manager.EthScheduler;
import org.hyperledger.besu.ethereum.eth.manager.RespondingEthPeer;
import org.hyperledger.besu.ethereum.eth.messages.EthPV65;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionValidator;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
@@ -108,7 +107,7 @@ public abstract class AbstractTransactionPoolTest {
protected MutableBlockchain blockchain;
private TransactionBroadcaster transactionBroadcaster;
protected AbstractPendingTransactionsSorter transactions;
protected PendingTransactions transactions;
private final Transaction transaction1 = createTransaction(1);
private final Transaction transaction2 = createTransaction(2);
@@ -122,7 +121,7 @@ public abstract class AbstractTransactionPoolTest {
private PeerTransactionTracker peerTransactionTracker;
private ArgumentCaptor<Runnable> syncTaskCapture;
protected abstract AbstractPendingTransactionsSorter createPendingTransactionsSorter();
protected abstract PendingTransactions createPendingTransactionsSorter();
protected abstract ExecutionContextTestFixture createExecutionContextTestFixture();

View File

@@ -33,7 +33,6 @@ import org.hyperledger.besu.ethereum.eth.manager.EthPeer;
import org.hyperledger.besu.ethereum.eth.manager.MockPeerConnection;
import org.hyperledger.besu.ethereum.eth.messages.EthPV65;
import org.hyperledger.besu.ethereum.eth.messages.NewPooledTransactionHashesMessage;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.BaseFeePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.GasPricePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.p2p.rlpx.wire.MessageData;
@@ -63,7 +62,7 @@ public class NewPooledTransactionHashesMessageSenderTest {
private final Transaction transaction2 = generator.transaction();
private final Transaction transaction3 = generator.transaction();
@Parameterized.Parameter public AbstractPendingTransactionsSorter pendingTransactions;
@Parameterized.Parameter public PendingTransactions pendingTransactions;
private PeerTransactionTracker transactionTracker;
private NewPooledTransactionHashesMessageSender messageSender;

View File

@@ -26,7 +26,7 @@ import org.hyperledger.besu.datatypes.Wei;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.core.TransactionTestFixture;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter.TransactionSelectionResult;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions.TransactionSelectionResult;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.BaseFeePendingTransactionsSorter;
import org.hyperledger.besu.metrics.StubMetricsSystem;
import org.hyperledger.besu.plugin.data.TransactionType;

View File

@@ -32,7 +32,6 @@ import org.hyperledger.besu.ethereum.eth.manager.EthPeer;
import org.hyperledger.besu.ethereum.eth.manager.EthPeers;
import org.hyperledger.besu.ethereum.eth.manager.EthScheduler;
import org.hyperledger.besu.ethereum.eth.messages.EthPV65;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import java.time.Instant;
import java.util.ArrayList;
@@ -56,7 +55,7 @@ public class TransactionBroadcasterTest {
@Mock private EthContext ethContext;
@Mock private EthPeers ethPeers;
@Mock private EthScheduler ethScheduler;
@Mock private AbstractPendingTransactionsSorter pendingTransactions;
@Mock private PendingTransactions pendingTransactions;
@Mock private PeerTransactionTracker transactionTracker;
@Mock private TransactionsMessageSender transactionsMessageSender;
@Mock private NewPooledTransactionHashesMessageSender newPooledTransactionHashesMessageSender;

View File

@@ -32,7 +32,6 @@ import org.hyperledger.besu.ethereum.core.ExecutionContextTestFixture;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.core.TransactionReceipt;
import org.hyperledger.besu.ethereum.core.TransactionTestFixture;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.GasPricePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
@@ -54,7 +53,7 @@ import org.mockito.junit.MockitoJUnitRunner;
public class TransactionPoolLegacyTest extends AbstractTransactionPoolTest {
@Override
protected AbstractPendingTransactionsSorter createPendingTransactionsSorter() {
protected PendingTransactions createPendingTransactionsSorter() {
return new GasPricePendingTransactionsSorter(
ImmutableTransactionPoolConfiguration.builder()

View File

@@ -33,7 +33,6 @@ import org.hyperledger.besu.ethereum.core.PrivacyParameters;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.core.TransactionReceipt;
import org.hyperledger.besu.ethereum.core.TransactionTestFixture;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.BaseFeePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderFunctions;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
@@ -50,7 +49,6 @@ import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import org.junit.Ignore;
import org.junit.Test;
public class TransactionPoolLondonTest extends AbstractTransactionPoolTest {
@@ -58,7 +56,7 @@ public class TransactionPoolLondonTest extends AbstractTransactionPoolTest {
private static final Wei BASE_FEE_FLOOR = Wei.of(7L);
@Override
protected AbstractPendingTransactionsSorter createPendingTransactionsSorter() {
protected PendingTransactions createPendingTransactionsSorter() {
return new BaseFeePendingTransactionsSorter(
ImmutableTransactionPoolConfiguration.builder()
@@ -269,13 +267,6 @@ public class TransactionPoolLondonTest extends AbstractTransactionPoolTest {
return transactions.size();
}
@Test
@Override
@Ignore
public void shouldRejectLocalTransactionIfFeeCapExceeded() {
// ignore since this is going to fail until the branch with the fix is released
}
private void whenBlockBaseFeeIs(final Wei baseFee) {
final BlockHeader header =
BlockHeaderBuilder.fromHeader(blockchain.getChainHeadHeader())

View File

@@ -12,15 +12,15 @@
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.eth.transactions;
package org.hyperledger.besu.ethereum.eth.transactions.sorter;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions.TransactionSelectionResult.COMPLETE_OPERATION;
import static org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions.TransactionSelectionResult.CONTINUE;
import static org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions.TransactionSelectionResult.DELETE_TRANSACTION_AND_CONTINUE;
import static org.hyperledger.besu.ethereum.eth.transactions.TransactionAddedStatus.ADDED;
import static org.hyperledger.besu.ethereum.eth.transactions.TransactionAddedStatus.ALREADY_KNOWN;
import static org.hyperledger.besu.ethereum.eth.transactions.TransactionAddedStatus.REJECTED_UNDERPRICED_REPLACEMENT;
import static org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter.TransactionSelectionResult.COMPLETE_OPERATION;
import static org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter.TransactionSelectionResult.CONTINUE;
import static org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter.TransactionSelectionResult.DELETE_TRANSACTION_AND_CONTINUE;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
@@ -37,7 +37,11 @@ import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.core.TransactionTestFixture;
import org.hyperledger.besu.ethereum.core.Util;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.ImmutableTransactionPoolConfiguration;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactionDroppedListener;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactionListener;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration;
import org.hyperledger.besu.evm.account.Account;
import org.hyperledger.besu.metrics.StubMetricsSystem;
import org.hyperledger.besu.testutil.TestClock;
@@ -72,8 +76,8 @@ public abstract class AbstractPendingTransactionsTestBase {
protected final TestClock clock = new TestClock();
protected final StubMetricsSystem metricsSystem = new StubMetricsSystem();
protected AbstractPendingTransactionsSorter transactions =
getSorter(
protected PendingTransactions transactions =
getPendingTransactions(
ImmutableTransactionPoolConfiguration.builder()
.txPoolMaxSize(MAX_TRANSACTIONS)
.txPoolLimitByAccountPercentage(1.0f)
@@ -84,8 +88,8 @@ public abstract class AbstractPendingTransactionsTestBase {
.txPoolMaxSize(MAX_TRANSACTIONS)
.txPoolLimitByAccountPercentage(LIMITED_TRANSACTIONS_BY_SENDER_PERCENTAGE)
.build();
protected AbstractPendingTransactionsSorter senderLimitedTransactions =
getSorter(senderLimitedConfig, Optional.empty());
protected PendingTransactions senderLimitedTransactions =
getPendingTransactions(senderLimitedConfig, Optional.empty());
protected final Transaction transaction1 = createTransaction(2);
protected final Transaction transaction2 = createTransaction(1);
@@ -96,7 +100,7 @@ public abstract class AbstractPendingTransactionsTestBase {
protected static final Address SENDER1 = Util.publicKeyToAddress(KEYS1.getPublicKey());
protected static final Address SENDER2 = Util.publicKeyToAddress(KEYS2.getPublicKey());
abstract AbstractPendingTransactionsSorter getSorter(
abstract PendingTransactions getPendingTransactions(
final TransactionPoolConfiguration poolConfig, Optional<Clock> clock);
@Test
@@ -611,8 +615,8 @@ public abstract class AbstractPendingTransactionsTestBase {
@Test
public void shouldEvictMultipleOldTransactions() {
final int maxTransactionRetentionHours = 1;
final AbstractPendingTransactionsSorter transactions =
getSorter(
final PendingTransactions transactions =
getPendingTransactions(
ImmutableTransactionPoolConfiguration.builder()
.pendingTxRetentionPeriod(maxTransactionRetentionHours)
.txPoolMaxSize(MAX_TRANSACTIONS)
@@ -633,8 +637,8 @@ public abstract class AbstractPendingTransactionsTestBase {
@Test
public void shouldEvictSingleOldTransaction() {
final AbstractPendingTransactionsSorter evictSingleTransactions =
getSorter(
final PendingTransactions evictSingleTransactions =
getPendingTransactions(
ImmutableTransactionPoolConfiguration.builder()
.pendingTxRetentionPeriod(1)
.txPoolMaxSize(MAX_TRANSACTIONS)
@@ -651,8 +655,8 @@ public abstract class AbstractPendingTransactionsTestBase {
@Test
public void shouldEvictExclusivelyOldTransactions() {
final AbstractPendingTransactionsSorter twoHourEvictionTransactionPool =
getSorter(
final PendingTransactions twoHourEvictionTransactionPool =
getPendingTransactions(
ImmutableTransactionPoolConfiguration.builder()
.pendingTxRetentionPeriod(2)
.txPoolMaxSize(MAX_TRANSACTIONS)
@@ -762,8 +766,7 @@ public abstract class AbstractPendingTransactionsTestBase {
addLocalTransactions(transactions, nonces);
}
protected void addLocalTransactions(
final AbstractPendingTransactionsSorter sorter, final long... nonces) {
protected void addLocalTransactions(final PendingTransactions sorter, final long... nonces) {
for (final long nonce : nonces) {
final Account sender = mock(Account.class);
when(sender.getNonce()).thenReturn(1L);

View File

@@ -12,13 +12,13 @@
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.eth.transactions;
package org.hyperledger.besu.ethereum.eth.transactions.sorter;
import org.hyperledger.besu.datatypes.Wei;
import org.hyperledger.besu.ethereum.core.Transaction;
import org.hyperledger.besu.ethereum.core.TransactionTestFixture;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.BaseFeePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration;
import org.hyperledger.besu.plugin.data.TransactionType;
import org.hyperledger.besu.testutil.TestClock;
@@ -30,7 +30,7 @@ import java.util.Random;
public class BaseFeePendingTransactionsTest extends AbstractPendingTransactionsTestBase {
@Override
AbstractPendingTransactionsSorter getSorter(
PendingTransactions getPendingTransactions(
final TransactionPoolConfiguration poolConfig, final Optional<Clock> clock) {
return new BaseFeePendingTransactionsSorter(
poolConfig,

View File

@@ -12,10 +12,10 @@
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.eth.transactions;
package org.hyperledger.besu.ethereum.eth.transactions.sorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.BaseFeePendingTransactionsSorter;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration;
import org.hyperledger.besu.testutil.TestClock;
import java.time.Clock;
@@ -25,7 +25,7 @@ import java.util.Optional;
public class GasPricePendingTransactionsTest extends AbstractPendingTransactionsTestBase {
@Override
AbstractPendingTransactionsSorter getSorter(
PendingTransactions getPendingTransactions(
final TransactionPoolConfiguration poolConfig, final Optional<Clock> clock) {
return new BaseFeePendingTransactionsSorter(
poolConfig,

View File

@@ -40,10 +40,10 @@ import org.hyperledger.besu.ethereum.eth.manager.EthPeers;
import org.hyperledger.besu.ethereum.eth.manager.EthScheduler;
import org.hyperledger.besu.ethereum.eth.sync.state.SyncState;
import org.hyperledger.besu.ethereum.eth.transactions.ImmutableTransactionPoolConfiguration;
import org.hyperledger.besu.ethereum.eth.transactions.PendingTransactions;
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool;
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration;
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolFactory;
import org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter;
import org.hyperledger.besu.ethereum.mainnet.EpochCalculator;
import org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode;
import org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderFunctions;
@@ -280,7 +280,7 @@ public class RetestethContext {
return transactionPool;
}
AbstractPendingTransactionsSorter getPendingTransactions() {
PendingTransactions getPendingTransactions() {
return transactionPool.getPendingTransactions();
}