Skip to content
Snippets Groups Projects
  • thiolliere's avatar
    Implement cumulus StorageWeightReclaim as wrapping transaction extension +... · 63c73bf6
    thiolliere authored
    Implement cumulus StorageWeightReclaim as wrapping transaction extension + frame system ReclaimWeight (#6140)
    
    (rebasing of https://github.com/paritytech/polkadot-sdk/pull/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.
    
        ```rust
      /// 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>,
             ),
      >;
      ```
    
    ---------
    
    Co-authored-by: default avatarGitHub Action <action@github.com>
    Co-authored-by: default avatargeorgepisaltu <52418509+georgepisaltu@users.noreply.github.com>
    Co-authored-by: default avatarOliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
    Co-authored-by: default avatarSebastian Kunert <skunert49@gmail.com>
    Co-authored-by: command-bot <>
    Unverified
    63c73bf6
Code owners
Assign users and groups as approvers for specific file changes. Learn more.