refactor(worker): order L1 messages by queue index #512
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
1. Purpose or design rationale of this PR
TransactionsByPriceAndNonce
is a data structure used to order transactions by gas price and nonce. The idea is that we can process transactions from one account following their nonce order, and we can simply skip all transactions from an account if one in the middle is not executed. If all gas prices and nonces are equal, then it will order transactions based on their timestamp.We currently reuse
TransactionsByPriceAndNonce
for processing L1 messages. However, L1 messages are ordered by theirQueueIndex
. Gas prices and nonces for L1 messages are0
, and theworker
ensures that the timestamps follow theQueueIndex
order so this all happens to work.However, this is hacky and error prone for multiple reasons:
TestTransactionTimeSort
to verify this behaviour.Pop()
on an L1 message set. In other words, we should only skip a single L1 message and never skip all L1 messages from the same sender account. Otherwise we might skip L1 messages unnecessarily.This PR improves this by introducing a new interface
OrderedTransactionSet
.worker.commitTransactions
will now receive this interface. It has two implementations:TransactionsByPriceAndNonce
(used for L2 transactions) andL1MessagesByQueueIndex
(used for L1 message transactions).2. PR title
Your PR title must follow conventional commits (as we are doing squash merge for each PR), so it must start with one of the following types:
3. Deployment tag versioning
Has the version in
params/version.go
been updated?4. Breaking change label
Does this PR have the
breaking-change
label?