erigon-pulse/cmd/txpool
Mark Holt b05ffc909d
Fixes for Bor Block Production Synchronization (#9162)
This PR contains 3 fixes for interaction between the Bor mining loop and
the TX pool which where causing the regular creation of blocks with zero
transactions.

* Mining/Tx pool block synchronization
The synchronization of the tx pool between the sync loop and the mining
loop has been changed so that both are triggered by the same event and
synchronized via a sync.Cond rather than a polling loop with a hard
coded loop limit. This means that mining now waits for the pool to be
updated from the previous block before it starts the mining process.
* Txpool Startup consolidated into its MainLoop
Previously the tx pool start process was dynamically triggered at
various points in the code. This has all now been moved to the start of
the main loop. This is necessary to avoid a timing hole which can leave
the mining loop hanging waiting for a previously block broadcast which
it missed due to its delay start.
* Mining listens for block broadcast to avoid duplicate mining
operations
The mining loop for bor has a recommit timer in case blocks re not
produced on time. However in the case of sprint transitions where the
seal publication is delayed this can lead to duplicate block production.
This is suppressed by introducing a `waiting` state which is exited upon
the block being broadcast from the sealing operation.
2024-01-10 17:12:15 +00:00
..
main.go Fixes for Bor Block Production Synchronization (#9162) 2024-01-10 17:12:15 +00:00
readme.md txpool: update cli flags (#7282) 2023-04-08 06:52:04 +00:00

TxPool v2

Transaction Pool - place where living "not-included-to-block-yet transactions". Erigon's TxPool can work inside Erigon (default) and as separated process.

Erigon's pool implementation is not fork of Geths, has Apache license - Design docs: https://github.com/ledgerwatch/erigon/wiki/Transaction-Pool-Design 95% of pool-related code (from p2p message parsing, to sorting logic) is inside this folder: https://github.com/ledgerwatch/erigon-lib/tree/main/txpool

Internal mode

It's default. No special flags required - just start Erigon. RPCDaemon - flags --private.api.addr and --txpool.api.addr must have same value in this case.

External mode

make txpool

# Add `--txpool.disable` flag to Erigon

# External TxPool require(!) external Sentry
./build/bin/sentry --sentry.api.addr=localhost:9091 --datadir=<your_datadir>

# Start TxPool service (it connects to Erigon and Sentry):
# --private.api.addr - connect to Erigon's grpc api
# --sentry.api.addr  - connect to Sentry's grpc api
# --txpool.api.addr  - other services to connect TxPool's grpc api
# Increase limits flags: --txpool.globalslots, --txpool.globalbasefeeslots, --txpool.globalqueue
# --txpool.trace.senders - print more logs about Txs with senders in this list 
./build/bin/txpool --private.api.addr=localhost:9090 --sentry.api.addr=localhost:9091 --txpool.api.addr=localhost:9094 --datadir=<your_datadir>

# Add flag `--txpool.api.addr` to RPCDaemon  

ToDo list

[] Hard-forks support (now TxPool require restart - after hard-fork happens) [] Add pool to docker-compose [] Add pool (db table) - where store recently mined txs - for faster unwind/reorg. [] Save history of local transactions - with 1 day expiration [] move tx.rlp field to separated map, to make tx immutable