-
Notifications
You must be signed in to change notification settings - Fork 128
feat(mempool): Block EVM mempool Select on legacypool reorg #867
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
base: feat/krakatoa
Are you sure you want to change the base?
Conversation
| } | ||
| queuedEvents[addr].Put(tx) | ||
|
|
||
| case <-pool.reorgSubscriptionCh: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added ability for arbitrary subscriptions to the completion of nextDone (when the "next" reorg loop will complete). This works by a a user pushing a request to subscribe onto this channel, then they must immediately listed on the pool.ReorgDoneCh. This loop will push nextDone onto that channel. The user can then wait on the closure of nextDone, which essentially broadcasts to all holders of this channel (subscribers to the next run of the reorg loop) that is has completed.
| case <-ctx.Done(): | ||
| return |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
likely a better way to handle this, but mempool.Select doesnt return an error, so if the context cancels during this call, then we potentially allow invalid txs to be selected, which will just be invalidated. If this happens we likely timeout propose. Not 100% sure what it means for the context to be cancelled here (is app shutting down?), based on what's actually happening panicing may be better. Likely this is a follow on to this, probably not important right now.
| for pool.latestReorgHeight.Load() < height { | ||
| // reorg loop has not run at the target height, subscribe to the | ||
| // outcome of the next reorg loop iteration to know when to check again | ||
| sub, err := pool.SubscribeToNextReorg() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if we have not run the reorg loop for the target height yet, we wait for the outcome of the next iteration of the loop. We are explicitly not telling the reorg loop to run here, since that would simply run it again, but not increment it to a new height (since we would need to pass the latest headers to it in order for that to happen). Also if we kick off a new run here and dont increment the latestReorgHeight, then we will continuously kick off new reorg loops until the txpool sees a new block and reorg runs on a new block, essentially doing lots of wasted work.
Description
Blocks
EVMExperimentalMempool.Selectuntillegacypool.Reset(the reorg loop) has been run for the height thatSelectis being called on. We do this to ensure that all txs in thependingpool are valid atSelectheightH. If we know that the reorg loop has been run at heightH, then we know that theanteHandlersfor all txs in thependingpool have passed at heightH, so they can be safely selected for a proposal.Closes: #XXXX
Author Checklist
All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.
I have...
mainbranch