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

txpool api: remove_invalid call improved #6661

Open
wants to merge 54 commits into
base: master
Choose a base branch
from

Conversation

michalkucharczyk
Copy link
Contributor

@michalkucharczyk michalkucharczyk commented Nov 26, 2024

Note

This PR depends on work done in #6647

Description

Currently the transaction which is reported as invalid by a block builder (or removed_invalid by other components) is silently skipped.

This PR improves this behavior. The transaction pool report_invalid function now accepts optional error associated with every reported transaction, and also the optional block hash which provides hints how reported transaction shall be handled. The following API change is proposed:

/// Reports invalid transactions to the transaction pool.
///
/// This function accepts an array of tuples, each containing a transaction hash and an
/// optional error encountered during the transaction execution at a specific (also optional)
/// block.
///
/// The transaction pool implementation decides which transactions to remove. Transactions
/// dependent on invalid ones will also be removed.
///
/// If the tuple's error is None, the transaction will be forcibly removed from the pool.
///
/// The optional `at` parameter provides additional context regarding the block where the error
/// occurred.
fn report_invalid(
&self,
at: Option<<Self::Block as BlockT>::Hash>,
invalid_tx_errors: &[(TxHash<Self>, Option<sp_blockchain::Error>)],
) -> Vec<Arc<Self::InPoolTransaction>>;

Depending on error, the transaction pool can decide if transaction shall be removed from the view only or entirely from the pool. Invalid event will be dispatched if required.

Notes for reviewers

  • Actual logic of removing invalid txs is impleneted in ViewStore::report_invalid. Method's doc explains the flow.
  • This PR changes HashMap to IndexMap in revalidation logic. This is to preserve the original order of transactions (mainly for purposes of unit tests).

fixes: #6008

&self,
at: Option<<Self::Block as BlockT>::Hash>,
invalid_tx_errors: &[(TxHash<Self>, Option<sp_blockchain::Error>)],
) -> Vec<Arc<Self::InPoolTransaction>>;
Copy link
Contributor Author

@michalkucharczyk michalkucharczyk Nov 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could also keep old function remove_invalid and add new one, with no optional error/block parameters. Really no strong opinion here.

Maybe triggering invalid event in case of removal the transaction via RPC call is (maybe) undesirable - so maybe we should have pure remove function (which would trigger Dropped, IMO it makes more sense). Any thoughts? (This could also be done as follow-up).

@michalkucharczyk michalkucharczyk changed the title txpool api: remove invalid call improved txpool api: remove invalid call improved Nov 26, 2024
@michalkucharczyk michalkucharczyk changed the title txpool api: remove invalid call improved txpool api: remove_invalid call improved Nov 27, 2024
@michalkucharczyk michalkucharczyk added R0-silent Changes should not be mentioned in any release notes T0-node This PR/Issue is related to the topic “node”. labels Jan 13, 2025
@michalkucharczyk
Copy link
Contributor Author

/cmd prdoc --bump minor --audience node_dev

prdoc/pr_6661.prdoc Outdated Show resolved Hide resolved
prdoc/pr_6661.prdoc Outdated Show resolved Hide resolved
prdoc/pr_6661.prdoc Outdated Show resolved Hide resolved
@michalkucharczyk
Copy link
Contributor Author

I'd like to force-push here to clean up commit history.
Is that fine for you (@skunert @iulianbarbu)?

@paritytech-workflow-stopper
Copy link

All GitHub workflows were cancelled due to failure one of the required jobs.
Failed workflow url: https://github.com/paritytech/polkadot-sdk/actions/runs/12772650851
Failed job name: test-linux-stable-no-try-runtime

Copy link
Contributor

@skunert skunert left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good.

@michalkucharczyk
Copy link
Contributor Author

michalkucharczyk commented Jan 17, 2025

I decided not to force push to preserve comments which could be deleted.

I added fatp_invalid.rs file, which focuses on handling widely understood invalid transactions (submit / revalidate and report).

Some tests are new, but some where just moved (and slightly updated, with no logic changes) from the original fatp.rs file.

I also reviewed these tests having in mind #5477.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
R0-silent Changes should not be mentioned in any release notes T0-node This PR/Issue is related to the topic “node”.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

fatxpool: transaction reported as invalid during block building shall be removed from the pool
2 participants