Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Layered Transaction Pool #5290

Merged
merged 178 commits into from
May 9, 2023
Merged

Layered Transaction Pool #5290

merged 178 commits into from
May 9, 2023

Conversation

fab-10
Copy link
Contributor

@fab-10 fab-10 commented Mar 31, 2023

PR description

This implements a new transaction pool (txpool for brevity), with the main goal to better manage nonce gaps, i.e. the possibility that the list of transactions that we see for a sender could not be in order neither contiguous, that could happen just of the way there are broadcasted on the p2p network or intentionally to try to spam the txpool with non executable transactions (transactions that could not be included in a future block), so the goal is to try to keep in the pool transactions that could be selected for a future block proposal, and a the same time, without penalizing legitimate unordered transactions, that are only temporary non executable.

It is disabled by default, to enable use the option Xlayered-tx-pool=true

The main idea is to organize the txpool in an arbitrary number of layers, where each layer has specific rules and constraints that determine if a transaction belong or not to that layer and also the way transactions move across layers.

Some design choices that apply to all layers are that a transaction can only be in one layer at any time, and that layers are chained by priority, so the first layer has the transactions that are candidate for a block proposal, and the last layer basically is where transactions are dropped. Layers are meant to be added and removed in case of specific future needs.
When adding a new transaction, it is first tried on the first layer, if it is not accepted then the next one is tried and so on.
Layers could be limited by transaction number of by space, and when a layer if full, it overflow to the next one and so on, instead when some space is freed, usually when transactions are removed since confirmed in a block, transactions from the next layer are promoted until there is space.

The current implementation is based on 3 layers, plus the last one that just drop every transaction when the previous layers are full. The 3 layers are, in order:

  1. Prioritized
  2. Ready
  3. Sparse

Prioritized:

This is where candidate transactions are selected for creating a new block.
Transaction are ordered by the effective priority fee, and it is limited by size, 2000 by default, to reduce the overhead of the sorting and because that number is enough to fill any block, at the current gas limit.
Does not allow nonce gaps, and the first transaction for each sender must be the next one for that sender.
Eviction is done removing the transaction with the higher nonce for the sender of the less valuable transaction, to avoid creating nonce gaps, evicted transactions go into the next layer Ready.

Ready:

Similar to the Prioritized, it does not allow nonce gaps, and the first transaction for each sender must be the next one for that sender, but it is limited by space instead of count, thus allowing many more transactions, think about this layer like a buffer for the Prioritized.
Since it is meant to keep ten to hundred of thousand of transactions, it does not have a full ordering, like the previous, but only the first transaction for each sender is ordered using a stable value that is the max fee per gas.
Eviction is the same as the Prioritized, and evicted transaction go into the next layer Sparse.

Sparse:

This is the first layer where nonce gaps are allowed and where the first transaction for a sender could not be the next expected one for that sender.
The main purpose of this layer is to act as a purgatory for temporary unordered and/or non contiguous transactions, so that they could become ready asap the missing transactions arrive, or they are eventually evicted.
It also keep the less valuable ready transactions, that are evicted from the previous layer.
It is limited by space, and eviction select the oldest transaction first, that is sent to the End Layer that just drop it.
When promoting to the prev layer Ready, only transactions that will not create nonce gaps are selected, for that we need to keep track of the nonce distance for each sender. So we can say that is ordered by nonce distance for promotion.

Changes in Besu options

When layered txpool is enabled some existing options are ignored and new options have been added, basically due to the fact that there is no more a limit in the number of transactions that the pool can contain, but the limit is the estimated amount of memory used.

Ignored options

  • --tx-pool-max-size
  • --tx-pool-limit-by-account-percentage

New options

Note: these options and their default values are subject to change while in the experimental phase.

  • --Xlayered-tx-pool-layer-max-capacity the max amount of memory (in bytes) that a limited by space layer can use. Applies to Ready and Sparse layers. Default 50_000_000 bytes (50MB).
  • --Xlayered-tx-pool-max-prioritized the maximum number of transaction that the Prioritized layer can contain. This Layer is limited by size to reduce the work needed for sorting. Default is 2000, and has been chosen since it is more than enough to fill any block at the current gas limit.
  • --Xlayered-tx-pool-max-future-by-sender define the max difference between the incoming transaction nonce and the current sender nonce, for a transaction to be accepted in the txpool. This means that too far in the future transactions are ignored. Default is 200.

I have run it on mainnet and compared it against the current implementation, using mitmproxy plus this custom addon to simulate a block production every other FcU, and collected the result in this document Layered Transaction Pool metrics.ods, the results are good, and on average the Layered txpool produces with 12% more transactions in less time.

A bunch of new metrics have been added, that could be used to graph totals and details about each layer, in the official Besu Full dashboard
Screenshot 2023-06-05 at 15-07-51 Besu Full Layered TxPool - Besu - Dashboards - Grafana

…oritized transaction for the sender

Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
# Conflicts:
#	consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeBlockCreator.java
#	ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java
# Conflicts:
#	consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeReorgTest.java
#	ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/LatestNonceProviderTest.java
#	ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetTransactionCountTest.java
#	ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java
#	ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java
#	ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LondonFeeMarketBlockTransactionSelectorTest.java
#	ethereum/core/src/test/java/org/hyperledger/besu/ethereum/bonsai/AbstractIsolationTests.java
#	ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransactions.java
#	ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPool.java
#	ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactory.java
#	ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/AbstractPendingTransactionsSorter.java
#	ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/NewPooledTransactionHashesMessageSenderTest.java
#	ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/PendingMultiTypesTransactionsTest.java
#	ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/AbstractPendingTransactionsTestBase.java
#	ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/BaseFeePendingTransactionsTest.java
#	ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/GasPricePendingTransactionsTest.java
fab-10 and others added 14 commits April 28, 2023 18:07
…ive,

instead force a reorg of the sender txs

Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
# Conflicts:
#	CHANGELOG.md
#	besu/src/main/java/org/hyperledger/besu/cli/options/unstable/TransactionPoolOptions.java
#	besu/src/test/java/org/hyperledger/besu/cli/options/TransactionPoolOptionsTest.java
#	ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/TransactionTestFixture.java
#	ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPool.java
#	ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolConfiguration.java
Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>
@fab-10
Copy link
Contributor Author

fab-10 commented May 9, 2023

I am going to merge this today since there are no more comments in the last weeks, the running instances are doing fine and the results are good. There are some improvements that can be done, but to avoid making this PR even bigger, I will create small PRs for them.

@fab-10 fab-10 merged commit 423fe1d into hyperledger:main May 9, 2023
@fab-10 fab-10 deleted the layered-txpool branch May 9, 2023 12:39
@hanniabu
Copy link

hanniabu commented Jun 1, 2023

Are there any benchmarks for difference in fee revenue?

@fab-10
Copy link
Contributor Author

fab-10 commented Jun 1, 2023

@RogerHKW
Copy link

RogerHKW commented Jun 5, 2023

  1. What is the effect of --tx-pool-limit-by-account-percentage when the layered pool is running? Does it count the transactions from one account over the whole pool or does it apply the percentage to each layer independently ?

  2. What is the size of the second and third layers by default ? Your text talks about a hundred of thousands transactions in the second layer but your screenshot shows only 14k transactions in each layer with 2 millions transactions removed.

  3. I would like to reach one hundred of thousands as advertised. Is there an option allowing me to customise their size ?

  4. When an executable transaction with fees higher than the last transaction of the first layer reaches the client, is it inserted in the first layer immediately (thus shifting the rest of the layer and pushing the last transaction to the second layer) ?

  5. If so, it has not been confronted to the sort by fee/gas values of the second layer, making it possibly suboptimal. As I expect it to happen quite often, I'm afraid that the first layer is in general very far from optimality. Do I misunderstand something?

Thanks 🙂

@fab-10
Copy link
Contributor Author

fab-10 commented Jun 5, 2023

Hi @RogerHKW, and thanks for checking out the layered txpool, feedback is important, and I found that the description was lacking documentation of changed options, so I added the Changes in Besu options section.
Moreover this is the first release of the new txpool, and there are more ideas for optimization that could be worth implementing if confirmed by the data collected.

What is the effect of --tx-pool-limit-by-account-percentage when the layered pool is running? Does it count the transactions from one account over the whole pool or does it apply the percentage to each layer independently ?

This option has no effect (there is warning in the log if you use it with the layered txpool) since there is no more a fixed max number of transactions, but this number constantly changes, so instead of using a percentage a fixed number is used and it can be specified by --Xlayered-tx-pool-max-future-by-sender options, see the description for more.

What is the size of the second and third layers by default ? Your text talks about a hundred of thousands transactions in the second layer but your screenshot shows only 14k transactions in each layer with 2 millions transactions removed.
I would like to reach one hundred of thousands as advertised. Is there an option allowing me to customise their size ?

By default the max memory these 2 layers can use is 50MB (now I have documented how to change this) and I did also tests with 100GB, and updated the screenshot with the metrics from that test. I have not found issues increasing that value to 100GB, but haven't tried with more, so if you want to push the limit, please report any issue, and also check the memory related metrics to see if they to be tuned.
In the next few days I will publish an updated Grafana dashboard with these new metrics included.

When an executable transaction with fees higher than the last transaction of the first layer reaches the client, is it inserted in the first layer immediately (thus shifting the rest of the layer and pushing the last transaction to the second layer) ?

correct

If so, it has not been confronted to the sort by fee/gas values of the second layer, making it possibly suboptimal. As I expect it to happen quite often, I'm afraid that the first layer is in general very far from optimality. Do I misunderstand something?

The way demoting and promotions between the Prioritized and the Ready layers work, should prevent this, because always the least priority tx(1) is moved to Ready, so ideally Ready only has txs that are lower in value that Prioritized(2), and as soon as there is space in Prioritized (usually when a new block arrives and confirmed txs are removed), most valuable Ready txs are promoted(2).
I hope this answer your doubt, otherwise if you still see there is flaw in my reasoning, please let me know, so I can review if I missed something in the approach.

(1) Specifically the last tx for the sender of the least priority tx, to avoid nonce gaps
(2) This is approximated to avoid a full ordering of all the txs in the large ready layers, and only the first tx for each sender is sorted, and the sort is static, so there could be cases where a following tx is better than some in the Prioritized layer, but it also means that the sender is doing strange things with his transactions pricing

@RogerHKW
Copy link

RogerHKW commented Jun 6, 2023

This is a great answer and big help, thanks!
(sorry for the previous version of this message. I'm discovering the functioning of Ethereum)

If I understand it right, the transactions in the first layer are sorted by tip per gas unit and will be taken in descending order when filling a block ? The transactions in the second layer are sorted by max fee per gas unit?

@fab-10
Copy link
Contributor Author

fab-10 commented Jun 7, 2023

This is a great answer and big help, thanks! (sorry for the previous version of this message. I'm discovering the functioning of Ethereum)

No problem, glad you are studying this, the feedback is also useful to make the code and the doc easier to understand.

If I understand it right, the transactions in the first layer are sorted by tip per gas unit and will be taken in descending order when filling a block ? The transactions in the second layer are sorted by max fee per gas unit?

Correct, the goal is to produce a block with the highest reward possible for the staker, in general this is a complex optimization problem, but in our case we take some shortcuts, since the blocks are seldomly full and so in the normal case we just need to put all the pending txs that are executable in that moment in the block, so the focus is more on which txs we keep in the pool for the future that could make the difference.

elenduuche pushed a commit to elenduuche/besu that referenced this pull request Aug 16, 2023
* Introduce experimental layered transaction pool

Signed-off-by: Fabio Di Fabio <[email protected]>

* new Xlayered-tx-pool flag to enabled the new tx pool

Signed-off-by: Fabio Di Fabio <[email protected]>

* Move pending transaction sorter tests in the sorter folder

Signed-off-by: Fabio Di Fabio <[email protected]>

* Unit tests for new and old transaction pool

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: do not decrease size when promoting ready txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: remove tx from orderByFee when replaced

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: decrease size when removing confirmed txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: always recreate orderByFee for London fee market

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: transaction removal counter when txs added to block

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: update expected nonce when demoting a prioritized transaction

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: correctly remove expected nonce entry when removing the last prioritized transaction for the sender
Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix NullPointerException when the replaced tx is not prioritized

Signed-off-by: Fabio Di Fabio <[email protected]>

* Replace postponed with spare transactions

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix merge from main

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fixed most tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix more tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Rename and reorg some classes

Signed-off-by: Fabio Di Fabio <[email protected]>

* More renaming and code clean up

Signed-off-by: Fabio Di Fabio <[email protected]>

* Refactor transaction pool metrics

Signed-off-by: Fabio Di Fabio <[email protected]>

* Stats log refined

Signed-off-by: Fabio Di Fabio <[email protected]>

* Cleanup unit tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Improve stats log

Signed-off-by: Fabio Di Fabio <[email protected]>

* Remove unnecessary test parameters

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix unit test

Signed-off-by: Fabio Di Fabio <[email protected]>

# Conflicts:
#	ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java
#	ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidator.java

* Cancel older block creation tasks upon receiving a new one

Signed-off-by: Simon Dudley <[email protected]>

* Fixes to expected next nonce for sender

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix promotion filter and use synchronized methods instead of blocks

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix metrics concurrent access issue

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fixes

Signed-off-by: Fabio Di Fabio <[email protected]>

* Configuration options for the layered txpool

Signed-off-by: Fabio Di Fabio <[email protected]>

* Use long instead of Instant for PendingTransaction add time

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fixes

Signed-off-by: Fabio Di Fabio <[email protected]>

* Move layered txpool clasess in a dedicated package

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fixes

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP

Signed-off-by: Fabio Di Fabio <[email protected]>

* Remove confirmed transaction from sparse set too

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fill gap on added tx

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix eviction on sparse layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix remove from ready layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix remove from sparse layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix for block added and confirmed txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fixes to sparse layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix the filling of the gap when adding transactions

Signed-off-by: Fabio Di Fabio <[email protected]>

* Layered pending transactions test and fixes

Signed-off-by: Fabio Di Fabio <[email protected]>

* Distinguish between layer and comulative space used

Signed-off-by: Fabio Di Fabio <[email protected]>

* unit tests for expected next nonce for sender

Signed-off-by: Fabio Di Fabio <[email protected]>

* Adding test for transaction selection

Signed-off-by: Fabio Di Fabio <[email protected]>

* Re-enable prioritized transaction tests and more fixes

Signed-off-by: Fabio Di Fabio <[email protected]>

* log stats

Signed-off-by: Fabio Di Fabio <[email protected]>

* syncronized some methods, metrics update and dump transactions for replay

Signed-off-by: Fabio Di Fabio <[email protected]>

* Test that replay tx and fix for tx replacement across layers

Signed-off-by: Fabio Di Fabio <[email protected]>

* Add missing copyright and fix replay test

Signed-off-by: Fabio Di Fabio <[email protected]>

* Add consistency check asserts

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix ready internalRemove

Signed-off-by: Fabio Di Fabio <[email protected]>

* Metrics tests improvements

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP: Transaction memory size estimation

Signed-off-by: Fabio Di Fabio <[email protected]>

* Complete pending transaction memory used computation

Signed-off-by: Fabio Di Fabio <[email protected]>

* Improve metrics

Signed-off-by: Fabio Di Fabio <[email protected]>

* Rename to specify that the limit is per layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Update metric names in tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Adjust tx layer max capacity according to new tx memory size calculation

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix legacy transaction expiration tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix IndexOutOfBoundsException in sparse layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Unique senders metric

Signed-off-by: Fabio Di Fabio <[email protected]>

* Ignore ReplayTest by default, fix logging of stats

Signed-off-by: Fabio Di Fabio <[email protected]>

* Log for replay renamings

Signed-off-by: Fabio Di Fabio <[email protected]>

* Document howto generate txpool replay

Signed-off-by: Fabio Di Fabio <[email protected]>

* Reduce max layer capacity

Signed-off-by: Fabio Di Fabio <[email protected]>

* exclude transaction replay resource

Signed-off-by: Fabio Di Fabio <[email protected]>

* Improve compareByFee when effectivePriorityFee is 0

Signed-off-by: Fabio Di Fabio <[email protected]>

* More debug logs during transaction selection for a block

Signed-off-by: Fabio Di Fabio <[email protected]>

* Use only one thread for building blocks so there is no risk of overlapping

Signed-off-by: Fabio Di Fabio <[email protected]>

* Improve transaction trace log making wei human readable

Signed-off-by: Fabio Di Fabio <[email protected]>

* Use List instead of Set when getting all pending transactions

Signed-off-by: Fabio Di Fabio <[email protected]>

* More detailed log on adding remote txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Execute transaction broadcast aysnc after adding them to the txpool

Signed-off-by: Fabio Di Fabio <[email protected]>

* Log time taken to add remote txs before their broadcast

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix test

Signed-off-by: Fabio Di Fabio <[email protected]>

* Add missing header

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix unit tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Add CHANGELOG entry

Signed-off-by: Fabio Di Fabio <[email protected]>

* Delete unneeded file

Signed-off-by: Fabio Di Fabio <[email protected]>

* Rename some layered txpool metrics to avoid conflict with existing metrics
Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix pushing to next layers txs following an invalid one

Signed-off-by: Fabio Di Fabio <[email protected]>

* In case of an unexpected error, log more data and do a consistency check

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix null check on wrong var

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix some codeql alerts

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix sparse gap calculation when invalidating

Signed-off-by: Fabio Di Fabio <[email protected]>

* Apply suggestions from doce review

Signed-off-by: Fabio Di Fabio <[email protected]>

* Only trigger consistency check if trace log is enable in case of unexpected error

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix replay of blocks with no transactions

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix for negative gap when there is a reorg

Signed-off-by: Fabio Di Fabio <[email protected]>

* Implement code review suggestions

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix for a case when deleting tx with zero gap in sparse layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Delete redoundant tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Update CHANGELOG.md

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

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

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolMetrics.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/ReadyTransactions.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/layered/AbstractPrioritizedTransactionsTestBase.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/SparseTransactions.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update besu/src/main/java/org/hyperledger/besu/cli/options/unstable/TransactionPoolOptions.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update besu/src/main/java/org/hyperledger/besu/cli/options/unstable/TransactionPoolOptions.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Address code review suggestions

Signed-off-by: Fabio Di Fabio <[email protected]>

* Improve logSender when there are no sparse txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix off by one error

Signed-off-by: Fabio Di Fabio <[email protected]>

* Update ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/TransactionsLayer.java

Co-authored-by: Simon Dudley <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Address code review suggestions

Signed-off-by: Fabio Di Fabio <[email protected]>

* Rename fix

Signed-off-by: Fabio Di Fabio <[email protected]>

* Simplify the way reorgs are handled, by detecting a negative gap and deleting and readding all the txs for that sender

Signed-off-by: Fabio Di Fabio <[email protected]>

* Do not run consistency check on internal error since it is too expensive,
instead force a reorg of the sender txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Remove invalid txs after the selection is complete to avoid ConcurrentModificationException

Signed-off-by: Fabio Di Fabio <[email protected]>

* Update txpool defaults

Signed-off-by: Fabio Di Fabio <[email protected]>

* Tune default

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix merge

Signed-off-by: Fabio Di Fabio <[email protected]>

---------

Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Simon Dudley <[email protected]>
Co-authored-by: Simon Dudley <[email protected]>
Co-authored-by: Sally MacFarlane <[email protected]>
Co-authored-by: garyschulte <[email protected]>
eum602 pushed a commit to lacchain/besu that referenced this pull request Nov 3, 2023
* Introduce experimental layered transaction pool

Signed-off-by: Fabio Di Fabio <[email protected]>

* new Xlayered-tx-pool flag to enabled the new tx pool

Signed-off-by: Fabio Di Fabio <[email protected]>

* Move pending transaction sorter tests in the sorter folder

Signed-off-by: Fabio Di Fabio <[email protected]>

* Unit tests for new and old transaction pool

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: do not decrease size when promoting ready txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: remove tx from orderByFee when replaced

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: decrease size when removing confirmed txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: always recreate orderByFee for London fee market

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: transaction removal counter when txs added to block

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: update expected nonce when demoting a prioritized transaction

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix: correctly remove expected nonce entry when removing the last prioritized transaction for the sender
Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix NullPointerException when the replaced tx is not prioritized

Signed-off-by: Fabio Di Fabio <[email protected]>

* Replace postponed with spare transactions

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix merge from main

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fixed most tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix more tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Rename and reorg some classes

Signed-off-by: Fabio Di Fabio <[email protected]>

* More renaming and code clean up

Signed-off-by: Fabio Di Fabio <[email protected]>

* Refactor transaction pool metrics

Signed-off-by: Fabio Di Fabio <[email protected]>

* Stats log refined

Signed-off-by: Fabio Di Fabio <[email protected]>

* Cleanup unit tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Improve stats log

Signed-off-by: Fabio Di Fabio <[email protected]>

* Remove unnecessary test parameters

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix unit test

Signed-off-by: Fabio Di Fabio <[email protected]>

# Conflicts:
#	ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java
#	ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidator.java

* Cancel older block creation tasks upon receiving a new one

Signed-off-by: Simon Dudley <[email protected]>

* Fixes to expected next nonce for sender

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix promotion filter and use synchronized methods instead of blocks

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix metrics concurrent access issue

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fixes

Signed-off-by: Fabio Di Fabio <[email protected]>

* Configuration options for the layered txpool

Signed-off-by: Fabio Di Fabio <[email protected]>

* Use long instead of Instant for PendingTransaction add time

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fixes

Signed-off-by: Fabio Di Fabio <[email protected]>

* Move layered txpool clasess in a dedicated package

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fixes

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP

Signed-off-by: Fabio Di Fabio <[email protected]>

* Remove confirmed transaction from sparse set too

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fill gap on added tx

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix eviction on sparse layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix remove from ready layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix remove from sparse layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix for block added and confirmed txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fixes to sparse layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix the filling of the gap when adding transactions

Signed-off-by: Fabio Di Fabio <[email protected]>

* Layered pending transactions test and fixes

Signed-off-by: Fabio Di Fabio <[email protected]>

* Distinguish between layer and comulative space used

Signed-off-by: Fabio Di Fabio <[email protected]>

* unit tests for expected next nonce for sender

Signed-off-by: Fabio Di Fabio <[email protected]>

* Adding test for transaction selection

Signed-off-by: Fabio Di Fabio <[email protected]>

* Re-enable prioritized transaction tests and more fixes

Signed-off-by: Fabio Di Fabio <[email protected]>

* log stats

Signed-off-by: Fabio Di Fabio <[email protected]>

* syncronized some methods, metrics update and dump transactions for replay

Signed-off-by: Fabio Di Fabio <[email protected]>

* Test that replay tx and fix for tx replacement across layers

Signed-off-by: Fabio Di Fabio <[email protected]>

* Add missing copyright and fix replay test

Signed-off-by: Fabio Di Fabio <[email protected]>

* Add consistency check asserts

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix ready internalRemove

Signed-off-by: Fabio Di Fabio <[email protected]>

* Metrics tests improvements

Signed-off-by: Fabio Di Fabio <[email protected]>

* WIP: Transaction memory size estimation

Signed-off-by: Fabio Di Fabio <[email protected]>

* Complete pending transaction memory used computation

Signed-off-by: Fabio Di Fabio <[email protected]>

* Improve metrics

Signed-off-by: Fabio Di Fabio <[email protected]>

* Rename to specify that the limit is per layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Update metric names in tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Adjust tx layer max capacity according to new tx memory size calculation

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix legacy transaction expiration tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix IndexOutOfBoundsException in sparse layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Unique senders metric

Signed-off-by: Fabio Di Fabio <[email protected]>

* Ignore ReplayTest by default, fix logging of stats

Signed-off-by: Fabio Di Fabio <[email protected]>

* Log for replay renamings

Signed-off-by: Fabio Di Fabio <[email protected]>

* Document howto generate txpool replay

Signed-off-by: Fabio Di Fabio <[email protected]>

* Reduce max layer capacity

Signed-off-by: Fabio Di Fabio <[email protected]>

* exclude transaction replay resource

Signed-off-by: Fabio Di Fabio <[email protected]>

* Improve compareByFee when effectivePriorityFee is 0

Signed-off-by: Fabio Di Fabio <[email protected]>

* More debug logs during transaction selection for a block

Signed-off-by: Fabio Di Fabio <[email protected]>

* Use only one thread for building blocks so there is no risk of overlapping

Signed-off-by: Fabio Di Fabio <[email protected]>

* Improve transaction trace log making wei human readable

Signed-off-by: Fabio Di Fabio <[email protected]>

* Use List instead of Set when getting all pending transactions

Signed-off-by: Fabio Di Fabio <[email protected]>

* More detailed log on adding remote txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Execute transaction broadcast aysnc after adding them to the txpool

Signed-off-by: Fabio Di Fabio <[email protected]>

* Log time taken to add remote txs before their broadcast

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix test

Signed-off-by: Fabio Di Fabio <[email protected]>

* Add missing header

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix unit tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Add CHANGELOG entry

Signed-off-by: Fabio Di Fabio <[email protected]>

* Delete unneeded file

Signed-off-by: Fabio Di Fabio <[email protected]>

* Rename some layered txpool metrics to avoid conflict with existing metrics
Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix pushing to next layers txs following an invalid one

Signed-off-by: Fabio Di Fabio <[email protected]>

* In case of an unexpected error, log more data and do a consistency check

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix null check on wrong var

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix some codeql alerts

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix sparse gap calculation when invalidating

Signed-off-by: Fabio Di Fabio <[email protected]>

* Apply suggestions from doce review

Signed-off-by: Fabio Di Fabio <[email protected]>

* Only trigger consistency check if trace log is enable in case of unexpected error

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix replay of blocks with no transactions

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix for negative gap when there is a reorg

Signed-off-by: Fabio Di Fabio <[email protected]>

* Implement code review suggestions

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix for a case when deleting tx with zero gap in sparse layer

Signed-off-by: Fabio Di Fabio <[email protected]>

* Delete redoundant tests

Signed-off-by: Fabio Di Fabio <[email protected]>

* Update CHANGELOG.md

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

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

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolMetrics.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/ReadyTransactions.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/layered/AbstractPrioritizedTransactionsTestBase.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/SparseTransactions.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update besu/src/main/java/org/hyperledger/besu/cli/options/unstable/TransactionPoolOptions.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Update besu/src/main/java/org/hyperledger/besu/cli/options/unstable/TransactionPoolOptions.java

Co-authored-by: Sally MacFarlane <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Address code review suggestions

Signed-off-by: Fabio Di Fabio <[email protected]>

* Improve logSender when there are no sparse txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix off by one error

Signed-off-by: Fabio Di Fabio <[email protected]>

* Update ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/TransactionsLayer.java

Co-authored-by: Simon Dudley <[email protected]>
Signed-off-by: Fabio Di Fabio <[email protected]>

* Address code review suggestions

Signed-off-by: Fabio Di Fabio <[email protected]>

* Rename fix

Signed-off-by: Fabio Di Fabio <[email protected]>

* Simplify the way reorgs are handled, by detecting a negative gap and deleting and readding all the txs for that sender

Signed-off-by: Fabio Di Fabio <[email protected]>

* Do not run consistency check on internal error since it is too expensive,
instead force a reorg of the sender txs

Signed-off-by: Fabio Di Fabio <[email protected]>

* Remove invalid txs after the selection is complete to avoid ConcurrentModificationException

Signed-off-by: Fabio Di Fabio <[email protected]>

* Update txpool defaults

Signed-off-by: Fabio Di Fabio <[email protected]>

* Tune default

Signed-off-by: Fabio Di Fabio <[email protected]>

* Fix merge

Signed-off-by: Fabio Di Fabio <[email protected]>

---------

Signed-off-by: Fabio Di Fabio <[email protected]>
Signed-off-by: Simon Dudley <[email protected]>
Co-authored-by: Simon Dudley <[email protected]>
Co-authored-by: Sally MacFarlane <[email protected]>
Co-authored-by: garyschulte <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants