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

Implement cumulus StorageWeightReclaim as wrapping transaction extension + frame system ReclaimWeight #6140

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

Conversation

gui1117
Copy link
Contributor

@gui1117 gui1117 commented Oct 19, 2024

(rebasing of #5234)

Issues:

  • Transaction extensions have weights and refund weight. So the reclaiming of unused weight must happen last in the transaction extension pipeline. Currently it is inside CheckWeight.
  • cumulus storage weight reclaim transaction extension misses the proof size of logic happening prior to itself.

Done:

  • a new storage ExtrinsicWeightReclaimed in frame-system. Any logic which attempts to do some reclaim must use this storage to avoid double reclaim.

  • a new function reclaim_weight in frame-system pallet: info and post info in arguments, read the already reclaimed weight, calculate the new unused weight from info and post info. do the more accurate reclaim if higher.

  • CheckWeight is unchanged and still reclaim the weight in post dispatch

  • ReclaimWeight is a new transaction extension in frame system. For solo chains it must be used last in the transactino extension pipeline. It does the final most accurate reclaim

  • StorageWeightReclaim is moved from cumulus primitives into its own pallet (in order to define benchmark) and is changed into a wrapping transaction extension.
    It does the recording of proof size and does the reclaim using this recording and the info and post info. So parachains don't need to use ReclaimWeight. But also if they use it, there is no bug.

    /// The TransactionExtension to the basic transaction logic.
    pub type TxExtension = cumulus_pallet_weight_reclaim::StorageWeightReclaim<
         Runtime,
         (
                 frame_system::CheckNonZeroSender<Runtime>,
                 frame_system::CheckSpecVersion<Runtime>,
                 frame_system::CheckTxVersion<Runtime>,
                 frame_system::CheckGenesis<Runtime>,
                 frame_system::CheckEra<Runtime>,
                 frame_system::CheckNonce<Runtime>,
                 frame_system::CheckWeight<Runtime>,
                 pallet_transaction_payment::ChargeTransactionPayment<Runtime>,
                 BridgeRejectObsoleteHeadersAndMessages,
                 (bridge_to_rococo_config::OnBridgeHubWestendRefundBridgeHubRococoMessages,),
                 frame_metadata_hash_extension::CheckMetadataHash<Runtime>,
         ),
    >;

@gui1117 gui1117 added T9-cumulus This PR/Issue is related to cumulus. T2-pallets This PR/Issue is related to a particular pallet. labels Oct 19, 2024
@bkchr
Copy link
Member

bkchr commented Oct 20, 2024

Anyway this doesn't have any vulnerability, it just wastes resources, but people should put the CheckWeight last in the pipeline.

I would say it depends. When you are required to put CheckWeight as the latest extension, it also means that you are missing a cheap, early return.

@georgepisaltu
Copy link
Contributor

you are missing a cheap, early return

Going through the pipeline should be cheap anyway. It's just extensions which are pretty light and the "wasted" work for overweight transactions should be done off-chain when validators are building their blocks.

Because the weight check isn't hardcoded and users can build whatever extension they like to handle it, we need to have some sort of convention when we introduce other weight related logic. I skimmed through the PR and I like the approach, but I won't formally approve because I didn't review thoroughly.

@gui1117
Copy link
Contributor Author

gui1117 commented Oct 21, 2024

Anyway this doesn't have any vulnerability, it just wastes resources, but people should put the CheckWeight last in the pipeline.

I would say it depends. When you are required to put CheckWeight as the latest extension, it also means that you are missing a cheap, early return.

Maybe it is time to split this transaction extension into CheckWeight and RefundWeight.

EDIT: or we can do the RefundWeight in note_applied_extrinsic.

EDIT: or we can use a storage to store the weight refunded by CheckWeight, then StorageWeightReclaim will just take this value instead of trying to guess it incorrectly.

EDIT: I decided to with a new storage ExtrinsicWeight or ExtrinsicWeightRefunded, CheckWeight will register its refund there, then StorageWeightReclaim will undo the CheckWeight operation and do the correct refund.

Later we can introduce another RefundWeight for solo-chains or parachains that doesn't want to use StorageWeightReclaim. RefundWeight can be placed at the end of the pipeline, and CheckWeight is unchanged and not breaking.

@gui1117 gui1117 requested a review from a team as a code owner October 24, 2024 08:50
@paritytech paritytech deleted a comment from github-actions bot Oct 25, 2024
@paritytech paritytech deleted a comment from github-actions bot Oct 25, 2024
@paritytech paritytech deleted a comment from github-actions bot Oct 25, 2024
@paritytech paritytech deleted a comment from github-actions bot Oct 25, 2024
@paritytech paritytech deleted a comment from github-actions bot Oct 25, 2024
@github-actions github-actions bot deleted a comment from gui1117 Oct 25, 2024
@github-actions github-actions bot deleted a comment from gui1117 Oct 25, 2024
…d bridge-hub-rococo bridge-hub-westend collectives-westend contracts-rococo coretime-rococo coretime-westend people-rococo people-westend --pallet cumulus_pallet_weight_reclaim'
@paritytech paritytech deleted a comment from github-actions bot Oct 25, 2024
@github-actions github-actions bot deleted a comment from gui1117 Oct 30, 2024
@gui1117 gui1117 requested review from a team as code owners October 31, 2024 00:34
@github-actions github-actions bot deleted a comment from gui1117 Oct 31, 2024
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024
//! HOSTNAME: `697235d969a1`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
//! WASM-EXECUTION: `Compiled`, CHAIN: `None`, DB CACHE: 1024
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I used /cmd bench --pallet frame_system_extensions to run this benchmark.
Somehow this doesn't give a chain anymore.
Is there some specific settings where giving a chain would change the result of the benchmarks?

Copy link
Contributor

@mordamax mordamax Oct 31, 2024

Choose a reason for hiding this comment

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

afair it's expected behavior for frame-omni-bencher
right, @ggwpez ?

btw, for now it's still better to use old command bot, as this one we still test/tweak - Here's docs for old one https://command-bot.parity-prod.parity.io/static/docs/latest.html?repo=polkadot-sdk, but maybe you can leave these results if they look fine

Once it's tested we'll notify everyone on forum about new bot

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Great to know, also the new /cmd seems to have missed coretime-rococo, coretime-westend, people-rococo, people-westend when I wrote /cmd bench --pallet frame_system_extensions. (I might mistaken)

Copy link
Member

Choose a reason for hiding this comment

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

Hm I think this is since we use the --runtime argument, and it is not extracting the chain spec name. But it should, good find: #6320

@gui1117 gui1117 requested a review from a team as a code owner October 31, 2024 07:54
@gui1117
Copy link
Contributor Author

gui1117 commented Oct 31, 2024

PR should be ready for review, I updated the description

@paritytech paritytech deleted a comment from github-actions bot Oct 31, 2024
@paritytech paritytech deleted a comment from github-actions bot Oct 31, 2024
@gui1117 gui1117 changed the title Implement StorageWeightReclaim as wrapping transaction extension Implement cumulus StorageWeightReclaim as wrapping transaction extension + frame system ReclaimWeight Nov 1, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
T2-pallets This PR/Issue is related to a particular pallet. T9-cumulus This PR/Issue is related to cumulus.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants