mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-28 09:47:56 +00:00
FRAME: Create TransactionExtension as a replacement for SignedExtension (#2280)
Closes #2160 First part of [Extrinsic Horizon](https://github.com/paritytech/polkadot-sdk/issues/2415) Introduces a new trait `TransactionExtension` to replace `SignedExtension`. Introduce the idea of transactions which obey the runtime's extensions and have according Extension data (né Extra data) yet do not have hard-coded signatures. Deprecate the terminology of "Unsigned" when used for transactions/extrinsics owing to there now being "proper" unsigned transactions which obey the extension framework and "old-style" unsigned which do not. Instead we have __*General*__ for the former and __*Bare*__ for the latter. (Ultimately, the latter will be phased out as a type of transaction, and Bare will only be used for Inherents.) Types of extrinsic are now therefore: - Bare (no hardcoded signature, no Extra data; used to be known as "Unsigned") - Bare transactions (deprecated): Gossiped, validated with `ValidateUnsigned` (deprecated) and the `_bare_compat` bits of `TransactionExtension` (deprecated). - Inherents: Not gossiped, validated with `ProvideInherent`. - Extended (Extra data): Gossiped, validated via `TransactionExtension`. - Signed transactions (with a hardcoded signature). - General transactions (without a hardcoded signature). `TransactionExtension` differs from `SignedExtension` because: - A signature on the underlying transaction may validly not be present. - It may alter the origin during validation. - `pre_dispatch` is renamed to `prepare` and need not contain the checks present in `validate`. - `validate` and `prepare` is passed an `Origin` rather than a `AccountId`. - `validate` may pass arbitrary information into `prepare` via a new user-specifiable type `Val`. - `AdditionalSigned`/`additional_signed` is renamed to `Implicit`/`implicit`. It is encoded *for the entire transaction* and passed in to each extension as a new argument to `validate`. This facilitates the ability of extensions to acts as underlying crypto. There is a new `DispatchTransaction` trait which contains only default function impls and is impl'ed for any `TransactionExtension` impler. It provides several utility functions which reduce some of the tedium from using `TransactionExtension` (indeed, none of its regular functions should now need to be called directly). Three transaction version discriminator ("versions") are now permissible: - 0b000000100: Bare (used to be called "Unsigned"): contains Signature or Extra (extension data). After bare transactions are no longer supported, this will strictly identify an Inherents only. - 0b100000100: Old-school "Signed" Transaction: contains Signature and Extra (extension data). - 0b010000100: New-school "General" Transaction: contains Extra (extension data), but no Signature. For the New-school General Transaction, it becomes trivial for authors to publish extensions to the mechanism for authorizing an Origin, e.g. through new kinds of key-signing schemes, ZK proofs, pallet state, mutations over pre-authenticated origins or any combination of the above. ## Code Migration ### NOW: Getting it to build Wrap your `SignedExtension`s in `AsTransactionExtension`. This should be accompanied by renaming your aggregate type in line with the new terminology. E.g. Before: ```rust /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( /* snip */ MySpecialSignedExtension, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>; ``` After: ```rust /// The extension to the basic transaction logic. pub type TxExtension = ( /* snip */ AsTransactionExtension<MySpecialSignedExtension>, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>; ``` You'll also need to alter any transaction building logic to add a `.into()` to make the conversion happen. E.g. Before: ```rust fn construct_extrinsic( /* snip */ ) -> UncheckedExtrinsic { let extra: SignedExtra = ( /* snip */ MySpecialSignedExtension::new(/* snip */), ); let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap(); let signature = payload.using_encoded(|e| sender.sign(e)); UncheckedExtrinsic::new_signed( /* snip */ Signature::Sr25519(signature), extra, ) } ``` After: ```rust fn construct_extrinsic( /* snip */ ) -> UncheckedExtrinsic { let tx_ext: TxExtension = ( /* snip */ MySpecialSignedExtension::new(/* snip */).into(), ); let payload = SignedPayload::new(call.clone(), tx_ext.clone()).unwrap(); let signature = payload.using_encoded(|e| sender.sign(e)); UncheckedExtrinsic::new_signed( /* snip */ Signature::Sr25519(signature), tx_ext, ) } ``` ### SOON: Migrating to `TransactionExtension` Most `SignedExtension`s can be trivially converted to become a `TransactionExtension`. There are a few things to know. - Instead of a single trait like `SignedExtension`, you should now implement two traits individually: `TransactionExtensionBase` and `TransactionExtension`. - Weights are now a thing and must be provided via the new function `fn weight`. #### `TransactionExtensionBase` This trait takes care of anything which is not dependent on types specific to your runtime, most notably `Call`. - `AdditionalSigned`/`additional_signed` is renamed to `Implicit`/`implicit`. - Weight must be returned by implementing the `weight` function. If your extension is associated with a pallet, you'll probably want to do this via the pallet's existing benchmarking infrastructure. #### `TransactionExtension` Generally: - `pre_dispatch` is now `prepare` and you *should not reexecute the `validate` functionality in there*! - You don't get an account ID any more; you get an origin instead. If you need to presume an account ID, then you can use the trait function `AsSystemOriginSigner::as_system_origin_signer`. - You get an additional ticket, similar to `Pre`, called `Val`. This defines data which is passed from `validate` into `prepare`. This is important since you should not be duplicating logic from `validate` to `prepare`, you need a way of passing your working from the former into the latter. This is it. - This trait takes two type parameters: `Call` and `Context`. `Call` is the runtime call type which used to be an associated type; you can just move it to become a type parameter for your trait impl. `Context` is not currently used and you can safely implement over it as an unbounded type. - There's no `AccountId` associated type any more. Just remove it. Regarding `validate`: - You get three new parameters in `validate`; all can be ignored when migrating from `SignedExtension`. - `validate` returns a tuple on success; the second item in the tuple is the new ticket type `Self::Val` which gets passed in to `prepare`. If you use any information extracted during `validate` (off-chain and on-chain, non-mutating) in `prepare` (on-chain, mutating) then you can pass it through with this. For the tuple's last item, just return the `origin` argument. Regarding `prepare`: - This is renamed from `pre_dispatch`, but there is one change: - FUNCTIONALITY TO VALIDATE THE TRANSACTION NEED NOT BE DUPLICATED FROM `validate`!! - (This is different to `SignedExtension` which was required to run the same checks in `pre_dispatch` as in `validate`.) Regarding `post_dispatch`: - Since there are no unsigned transactions handled by `TransactionExtension`, `Pre` is always defined, so the first parameter is `Self::Pre` rather than `Option<Self::Pre>`. If you make use of `SignedExtension::validate_unsigned` or `SignedExtension::pre_dispatch_unsigned`, then: - Just use the regular versions of these functions instead. - Have your logic execute in the case that the `origin` is `None`. - Ensure your transaction creation logic creates a General Transaction rather than a Bare Transaction; this means having to include all `TransactionExtension`s' data. - `ValidateUnsigned` can still be used (for now) if you need to be able to construct transactions which contain none of the extension data, however these will be phased out in stage 2 of the Transactions Horizon, so you should consider moving to an extension-centric design. ## TODO - [x] Introduce `CheckSignature` impl of `TransactionExtension` to ensure it's possible to have crypto be done wholly in a `TransactionExtension`. - [x] Deprecate `SignedExtension` and move all uses in codebase to `TransactionExtension`. - [x] `ChargeTransactionPayment` - [x] `DummyExtension` - [x] `ChargeAssetTxPayment` (asset-tx-payment) - [x] `ChargeAssetTxPayment` (asset-conversion-tx-payment) - [x] `CheckWeight` - [x] `CheckTxVersion` - [x] `CheckSpecVersion` - [x] `CheckNonce` - [x] `CheckNonZeroSender` - [x] `CheckMortality` - [x] `CheckGenesis` - [x] `CheckOnlySudoAccount` - [x] `WatchDummy` - [x] `PrevalidateAttests` - [x] `GenericSignedExtension` - [x] `SignedExtension` (chain-polkadot-bulletin) - [x] `RefundSignedExtensionAdapter` - [x] Implement `fn weight` across the board. - [ ] Go through all pre-existing extensions which assume an account signer and explicitly handle the possibility of another kind of origin. - [x] `CheckNonce` should probably succeed in the case of a non-account origin. - [x] `CheckNonZeroSender` should succeed in the case of a non-account origin. - [x] `ChargeTransactionPayment` and family should fail in the case of a non-account origin. - [ ] - [x] Fix any broken tests. --------- Signed-off-by: georgepisaltu <george.pisaltu@parity.io> Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Signed-off-by: Alexandru Gheorghe <alexandru.gheorghe@parity.io> Signed-off-by: Andrei Sandu <andrei-mihail@parity.io> Co-authored-by: Nikhil Gupta <17176722+gupnik@users.noreply.github.com> Co-authored-by: georgepisaltu <52418509+georgepisaltu@users.noreply.github.com> Co-authored-by: Chevdor <chevdor@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: Maciej <maciej.zyszkiewicz@parity.io> Co-authored-by: Javier Viola <javier@parity.io> Co-authored-by: Marcin S. <marcin@realemail.net> Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> Co-authored-by: Javier Bullrich <javier@bullrich.dev> Co-authored-by: Koute <koute@users.noreply.github.com> Co-authored-by: Adrian Catangiu <adrian@parity.io> Co-authored-by: Vladimir Istyufeev <vladimir@parity.io> Co-authored-by: Ross Bulat <ross@parity.io> Co-authored-by: Gonçalo Pestana <g6pestana@gmail.com> Co-authored-by: Liam Aharon <liam.aharon@hotmail.com> Co-authored-by: Svyatoslav Nikolsky <svyatonik@gmail.com> Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Co-authored-by: ordian <write@reusable.software> Co-authored-by: Sebastian Kunert <skunert49@gmail.com> Co-authored-by: Aaro Altonen <48052676+altonen@users.noreply.github.com> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Co-authored-by: Julian Eager <eagr@tutanota.com> Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Co-authored-by: Davide Galassi <davxy@datawok.net> Co-authored-by: Dónal Murray <donal.murray@parity.io> Co-authored-by: yjh <yjh465402634@gmail.com> Co-authored-by: Tom Mi <tommi@niemi.lol> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Will | Paradox | ParaNodes.io <79228812+paradox-tt@users.noreply.github.com> Co-authored-by: Bastian Köcher <info@kchr.de> Co-authored-by: Joshy Orndorff <JoshOrndorff@users.noreply.github.com> Co-authored-by: Joshy Orndorff <git-user-email.h0ly5@simplelogin.com> Co-authored-by: PG Herveou <pgherveou@gmail.com> Co-authored-by: Alexander Theißen <alex.theissen@me.com> Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: Juan Girini <juangirini@gmail.com> Co-authored-by: bader y <ibnbassem@gmail.com> Co-authored-by: James Wilson <james@jsdw.me> Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: asynchronous rob <rphmeier@gmail.com> Co-authored-by: Parth <desaiparth08@gmail.com> Co-authored-by: Andrew Jones <ascjones@gmail.com> Co-authored-by: Jonathan Udd <jonathan@dwellir.com> Co-authored-by: Serban Iorga <serban@parity.io> Co-authored-by: Egor_P <egor@parity.io> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: Evgeny Snitko <evgeny@parity.io> Co-authored-by: Just van Stam <vstam1@users.noreply.github.com> Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com> Co-authored-by: gupnik <nikhilgupta.iitk@gmail.com> Co-authored-by: dzmitry-lahoda <dzmitry@lahoda.pro> Co-authored-by: zhiqiangxu <652732310@qq.com> Co-authored-by: Nazar Mokrynskyi <nazar@mokrynskyi.com> Co-authored-by: Anwesh <anweshknayak@gmail.com> Co-authored-by: cheme <emericchevalier.pro@gmail.com> Co-authored-by: Sam Johnson <sam@durosoft.com> Co-authored-by: kianenigma <kian@parity.io> Co-authored-by: Jegor Sidorenko <5252494+jsidorenko@users.noreply.github.com> Co-authored-by: Muharem <ismailov.m.h@gmail.com> Co-authored-by: joepetrowski <joe@parity.io> Co-authored-by: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Co-authored-by: Gabriel Facco de Arruda <arrudagates@gmail.com> Co-authored-by: Squirrel <gilescope@gmail.com> Co-authored-by: Andrei Sandu <54316454+sandreim@users.noreply.github.com> Co-authored-by: georgepisaltu <george.pisaltu@parity.io> Co-authored-by: command-bot <>
This commit is contained in:
Generated
+23
-12
@@ -4070,11 +4070,13 @@ dependencies = [
|
||||
"cumulus-primitives-proof-size-hostfunction",
|
||||
"cumulus-test-runtime",
|
||||
"docify 0.2.7",
|
||||
"frame-benchmarking",
|
||||
"frame-support",
|
||||
"frame-system",
|
||||
"log",
|
||||
"parity-scale-codec",
|
||||
"scale-info",
|
||||
"sp-core",
|
||||
"sp-io",
|
||||
"sp-runtime",
|
||||
"sp-std 14.0.0",
|
||||
@@ -5938,7 +5940,7 @@ version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29f9df8a11882c4e3335eb2d18a0137c505d9ca927470b0cac9c6f0ae07d28f7"
|
||||
dependencies = [
|
||||
"rustix 0.38.21",
|
||||
"rustix 0.38.25",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
@@ -6827,7 +6829,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
|
||||
dependencies = [
|
||||
"hermit-abi 0.3.2",
|
||||
"rustix 0.38.21",
|
||||
"rustix 0.38.25",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
@@ -7834,9 +7836,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.4.10"
|
||||
version = "0.4.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f"
|
||||
checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829"
|
||||
|
||||
[[package]]
|
||||
name = "lioness"
|
||||
@@ -9177,6 +9179,7 @@ dependencies = [
|
||||
name = "pallet-asset-conversion-tx-payment"
|
||||
version = "10.0.0"
|
||||
dependencies = [
|
||||
"frame-benchmarking",
|
||||
"frame-support",
|
||||
"frame-system",
|
||||
"pallet-asset-conversion",
|
||||
@@ -11119,6 +11122,7 @@ dependencies = [
|
||||
name = "pallet-transaction-payment"
|
||||
version = "28.0.0"
|
||||
dependencies = [
|
||||
"frame-benchmarking",
|
||||
"frame-support",
|
||||
"frame-system",
|
||||
"pallet-balances",
|
||||
@@ -14333,7 +14337,7 @@ dependencies = [
|
||||
"hex",
|
||||
"lazy_static",
|
||||
"procfs-core",
|
||||
"rustix 0.38.21",
|
||||
"rustix 0.38.25",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -15458,14 +15462,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "0.38.21"
|
||||
version = "0.38.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3"
|
||||
checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e"
|
||||
dependencies = [
|
||||
"bitflags 2.4.0",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys 0.4.10",
|
||||
"linux-raw-sys 0.4.11",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
@@ -18721,7 +18725,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "sp-crypto-ec-utils"
|
||||
version = "0.4.1"
|
||||
source = "git+https://github.com/paritytech/polkadot-sdk#82912acb33a9030c0ef3bf590a34fca09b72dc5f"
|
||||
source = "git+https://github.com/paritytech/polkadot-sdk#838a534da874cf6071fba1df07643c6c5b033ae0"
|
||||
dependencies = [
|
||||
"ark-bls12-377",
|
||||
"ark-bls12-377-ext",
|
||||
@@ -19026,6 +19030,7 @@ dependencies = [
|
||||
"sp-tracing 16.0.0",
|
||||
"sp-weights",
|
||||
"substrate-test-runtime-client",
|
||||
"tuplex",
|
||||
"zstd 0.12.4",
|
||||
]
|
||||
|
||||
@@ -19074,7 +19079,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "sp-runtime-interface-proc-macro"
|
||||
version = "11.0.0"
|
||||
source = "git+https://github.com/paritytech/polkadot-sdk#82912acb33a9030c0ef3bf590a34fca09b72dc5f"
|
||||
source = "git+https://github.com/paritytech/polkadot-sdk#838a534da874cf6071fba1df07643c6c5b033ae0"
|
||||
dependencies = [
|
||||
"Inflector",
|
||||
"proc-macro-crate 1.3.1",
|
||||
@@ -20293,7 +20298,7 @@ dependencies = [
|
||||
"cfg-if",
|
||||
"fastrand 2.0.0",
|
||||
"redox_syscall 0.4.1",
|
||||
"rustix 0.38.21",
|
||||
"rustix 0.38.25",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
@@ -20312,7 +20317,7 @@ version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7"
|
||||
dependencies = [
|
||||
"rustix 0.38.21",
|
||||
"rustix 0.38.25",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
@@ -21158,6 +21163,12 @@ dependencies = [
|
||||
"utf-8",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tuplex"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "676ac81d5454c4dcf37955d34fa8626ede3490f744b86ca14a7b90168d2a08aa"
|
||||
|
||||
[[package]]
|
||||
name = "twox-hash"
|
||||
version = "1.6.3"
|
||||
|
||||
@@ -93,6 +93,7 @@ runtime-benchmarks = [
|
||||
"pallet-bridge-messages/runtime-benchmarks",
|
||||
"pallet-bridge-parachains/runtime-benchmarks",
|
||||
"pallet-bridge-relayers/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"sp-runtime/runtime-benchmarks",
|
||||
"xcm-builder/runtime-benchmarks",
|
||||
|
||||
@@ -105,43 +105,48 @@ macro_rules! generate_bridge_reject_obsolete_headers_and_messages {
|
||||
($call:ty, $account_id:ty, $($filter_call:ty),*) => {
|
||||
#[derive(Clone, codec::Decode, Default, codec::Encode, Eq, PartialEq, sp_runtime::RuntimeDebug, scale_info::TypeInfo)]
|
||||
pub struct BridgeRejectObsoleteHeadersAndMessages;
|
||||
impl sp_runtime::traits::SignedExtension for BridgeRejectObsoleteHeadersAndMessages {
|
||||
impl sp_runtime::traits::TransactionExtensionBase for BridgeRejectObsoleteHeadersAndMessages {
|
||||
const IDENTIFIER: &'static str = "BridgeRejectObsoleteHeadersAndMessages";
|
||||
type AccountId = $account_id;
|
||||
type Call = $call;
|
||||
type AdditionalSigned = ();
|
||||
type Implicit = ();
|
||||
}
|
||||
impl<Context> sp_runtime::traits::TransactionExtension<$call, Context> for BridgeRejectObsoleteHeadersAndMessages {
|
||||
type Pre = ();
|
||||
|
||||
fn additional_signed(&self) -> sp_std::result::Result<
|
||||
(),
|
||||
sp_runtime::transaction_validity::TransactionValidityError,
|
||||
> {
|
||||
Ok(())
|
||||
}
|
||||
type Val = ();
|
||||
|
||||
fn validate(
|
||||
&self,
|
||||
_who: &Self::AccountId,
|
||||
call: &Self::Call,
|
||||
_info: &sp_runtime::traits::DispatchInfoOf<Self::Call>,
|
||||
origin: <$call as sp_runtime::traits::Dispatchable>::RuntimeOrigin,
|
||||
call: &$call,
|
||||
_info: &sp_runtime::traits::DispatchInfoOf<$call>,
|
||||
_len: usize,
|
||||
) -> sp_runtime::transaction_validity::TransactionValidity {
|
||||
let valid = sp_runtime::transaction_validity::ValidTransaction::default();
|
||||
_context: &mut Context,
|
||||
_self_implicit: Self::Implicit,
|
||||
_inherited_implication: &impl codec::Encode,
|
||||
) -> Result<
|
||||
(
|
||||
sp_runtime::transaction_validity::ValidTransaction,
|
||||
Self::Val,
|
||||
<$call as sp_runtime::traits::Dispatchable>::RuntimeOrigin,
|
||||
), sp_runtime::transaction_validity::TransactionValidityError
|
||||
> {
|
||||
let tx_validity = sp_runtime::transaction_validity::ValidTransaction::default();
|
||||
$(
|
||||
let valid = valid
|
||||
.combine_with(<$filter_call as $crate::BridgeRuntimeFilterCall<$call>>::validate(call)?);
|
||||
let call_filter_validity = <$filter_call as $crate::BridgeRuntimeFilterCall<$call>>::validate(call)?;
|
||||
let tx_validity = tx_validity.combine_with(call_filter_validity);
|
||||
)*
|
||||
Ok(valid)
|
||||
Ok((tx_validity, (), origin))
|
||||
}
|
||||
|
||||
fn pre_dispatch(
|
||||
fn prepare(
|
||||
self,
|
||||
who: &Self::AccountId,
|
||||
call: &Self::Call,
|
||||
info: &sp_runtime::traits::DispatchInfoOf<Self::Call>,
|
||||
len: usize,
|
||||
_val: Self::Val,
|
||||
_origin: &<$call as sp_runtime::traits::Dispatchable>::RuntimeOrigin,
|
||||
_call: &$call,
|
||||
_info: &sp_runtime::traits::DispatchInfoOf<$call>,
|
||||
_len: usize,
|
||||
_context: &Context,
|
||||
) -> Result<Self::Pre, sp_runtime::transaction_validity::TransactionValidityError> {
|
||||
self.validate(who, call, info, len).map(drop)
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -150,12 +155,14 @@ macro_rules! generate_bridge_reject_obsolete_headers_and_messages {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::BridgeRuntimeFilterCall;
|
||||
use frame_support::{assert_err, assert_ok};
|
||||
use codec::Encode;
|
||||
use frame_support::assert_err;
|
||||
use sp_runtime::{
|
||||
traits::SignedExtension,
|
||||
traits::DispatchTransaction,
|
||||
transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction},
|
||||
};
|
||||
|
||||
#[derive(Encode)]
|
||||
pub struct MockCall {
|
||||
data: u32,
|
||||
}
|
||||
@@ -206,17 +213,20 @@ mod tests {
|
||||
);
|
||||
|
||||
assert_err!(
|
||||
BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 1 }, &(), 0),
|
||||
BridgeRejectObsoleteHeadersAndMessages.validate_only((), &MockCall { data: 1 }, &(), 0),
|
||||
InvalidTransaction::Custom(1)
|
||||
);
|
||||
|
||||
assert_err!(
|
||||
BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 2 }, &(), 0),
|
||||
BridgeRejectObsoleteHeadersAndMessages.validate_only((), &MockCall { data: 2 }, &(), 0),
|
||||
InvalidTransaction::Custom(2)
|
||||
);
|
||||
|
||||
assert_ok!(
|
||||
BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 3 }, &(), 0),
|
||||
assert_eq!(
|
||||
BridgeRejectObsoleteHeadersAndMessages
|
||||
.validate_only((), &MockCall { data: 3 }, &(), 0)
|
||||
.unwrap()
|
||||
.0,
|
||||
ValidTransaction { priority: 3, ..Default::default() }
|
||||
)
|
||||
}
|
||||
|
||||
@@ -164,6 +164,7 @@ impl pallet_balances::Config for TestRuntime {
|
||||
type AccountStore = System;
|
||||
}
|
||||
|
||||
#[derive_impl(pallet_transaction_payment::config_preludes::TestDefaultConfig as pallet_transaction_payment::DefaultConfig)]
|
||||
impl pallet_transaction_payment::Config for TestRuntime {
|
||||
type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter<Balances, ()>;
|
||||
type OperationalFeeMultiplier = ConstU8<5>;
|
||||
@@ -176,7 +177,6 @@ impl pallet_transaction_payment::Config for TestRuntime {
|
||||
MinimumMultiplier,
|
||||
MaximumMultiplier,
|
||||
>;
|
||||
type RuntimeEvent = RuntimeEvent;
|
||||
}
|
||||
|
||||
impl pallet_bridge_grandpa::Config for TestRuntime {
|
||||
|
||||
@@ -169,12 +169,15 @@ mod integrity_tests {
|
||||
// nodes to the proof (x0.5 because we expect some nodes to be reused)
|
||||
let estimated_message_size = 512;
|
||||
// let's say all our messages have the same dispatch weight
|
||||
let estimated_message_dispatch_weight =
|
||||
Runtime::WeightInfo::message_dispatch_weight(estimated_message_size);
|
||||
let estimated_message_dispatch_weight = <Runtime as pallet_bridge_messages::Config<
|
||||
MessagesInstance,
|
||||
>>::WeightInfo::message_dispatch_weight(
|
||||
estimated_message_size
|
||||
);
|
||||
// messages proof argument size is (for every message) messages size + some additional
|
||||
// trie nodes. Some of them are reused by different messages, so let's take 2/3 of default
|
||||
// "overhead" constant
|
||||
let messages_proof_size = Runtime::WeightInfo::expected_extra_storage_proof_size()
|
||||
let messages_proof_size = <Runtime as pallet_bridge_messages::Config<MessagesInstance>>::WeightInfo::expected_extra_storage_proof_size()
|
||||
.saturating_mul(2)
|
||||
.saturating_div(3)
|
||||
.saturating_add(estimated_message_size)
|
||||
@@ -182,7 +185,7 @@ mod integrity_tests {
|
||||
|
||||
// finally we are able to estimate transaction size and weight
|
||||
let transaction_size = base_tx_size.saturating_add(messages_proof_size);
|
||||
let transaction_weight = Runtime::WeightInfo::receive_messages_proof_weight(
|
||||
let transaction_weight = <Runtime as pallet_bridge_messages::Config<MessagesInstance>>::WeightInfo::receive_messages_proof_weight(
|
||||
&PreComputedSize(transaction_size as _),
|
||||
messages as _,
|
||||
estimated_message_dispatch_weight.saturating_mul(messages),
|
||||
|
||||
@@ -48,9 +48,12 @@ use pallet_transaction_payment::{Config as TransactionPaymentConfig, OnChargeTra
|
||||
use pallet_utility::{Call as UtilityCall, Config as UtilityConfig, Pallet as UtilityPallet};
|
||||
use scale_info::TypeInfo;
|
||||
use sp_runtime::{
|
||||
traits::{DispatchInfoOf, Dispatchable, Get, PostDispatchInfoOf, SignedExtension, Zero},
|
||||
traits::{
|
||||
AsSystemOriginSigner, DispatchInfoOf, Dispatchable, Get, PostDispatchInfoOf,
|
||||
TransactionExtension, TransactionExtensionBase, ValidateResult, Zero,
|
||||
},
|
||||
transaction_validity::{
|
||||
TransactionPriority, TransactionValidity, TransactionValidityError, ValidTransactionBuilder,
|
||||
InvalidTransaction, TransactionPriority, TransactionValidityError, ValidTransactionBuilder,
|
||||
},
|
||||
DispatchResult, FixedPointOperand, RuntimeDebug,
|
||||
};
|
||||
@@ -239,8 +242,8 @@ pub enum RelayerAccountAction<AccountId, Reward> {
|
||||
Slash(AccountId, RewardsAccountParams),
|
||||
}
|
||||
|
||||
/// Everything common among our refund signed extensions.
|
||||
pub trait RefundSignedExtension:
|
||||
/// Everything common among our refund transaction extensions.
|
||||
pub trait RefundTransactionExtension:
|
||||
'static + Clone + Codec + sp_std::fmt::Debug + Default + Eq + PartialEq + Send + Sync + TypeInfo
|
||||
where
|
||||
<Self::Runtime as GrandpaConfig<Self::GrandpaInstance>>::BridgedChain:
|
||||
@@ -456,8 +459,8 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
/// Adapter that allow implementing `sp_runtime::traits::SignedExtension` for any
|
||||
/// `RefundSignedExtension`.
|
||||
/// Adapter that allow implementing `sp_runtime::traits::TransactionExtension` for any
|
||||
/// `RefundTransactionExtension`.
|
||||
#[derive(
|
||||
DefaultNoBound,
|
||||
CloneNoBound,
|
||||
@@ -468,12 +471,13 @@ where
|
||||
RuntimeDebugNoBound,
|
||||
TypeInfo,
|
||||
)]
|
||||
pub struct RefundSignedExtensionAdapter<T: RefundSignedExtension>(T)
|
||||
pub struct RefundTransactionExtensionAdapter<T: RefundTransactionExtension>(T)
|
||||
where
|
||||
<T::Runtime as GrandpaConfig<T::GrandpaInstance>>::BridgedChain:
|
||||
Chain<BlockNumber = RelayBlockNumber>;
|
||||
|
||||
impl<T: RefundSignedExtension> SignedExtension for RefundSignedExtensionAdapter<T>
|
||||
impl<T: RefundTransactionExtension> TransactionExtensionBase
|
||||
for RefundTransactionExtensionAdapter<T>
|
||||
where
|
||||
<T::Runtime as GrandpaConfig<T::GrandpaInstance>>::BridgedChain:
|
||||
Chain<BlockNumber = RelayBlockNumber>,
|
||||
@@ -483,22 +487,35 @@ where
|
||||
+ MessagesCallSubType<T::Runtime, <T::Msgs as RefundableMessagesLaneId>::Instance>,
|
||||
{
|
||||
const IDENTIFIER: &'static str = T::Id::STR;
|
||||
type AccountId = AccountIdOf<T::Runtime>;
|
||||
type Call = CallOf<T::Runtime>;
|
||||
type AdditionalSigned = ();
|
||||
type Pre = Option<PreDispatchData<AccountIdOf<T::Runtime>>>;
|
||||
type Implicit = ();
|
||||
}
|
||||
|
||||
fn additional_signed(&self) -> Result<(), TransactionValidityError> {
|
||||
Ok(())
|
||||
}
|
||||
impl<T: RefundTransactionExtension, Context> TransactionExtension<CallOf<T::Runtime>, Context>
|
||||
for RefundTransactionExtensionAdapter<T>
|
||||
where
|
||||
<T::Runtime as GrandpaConfig<T::GrandpaInstance>>::BridgedChain:
|
||||
Chain<BlockNumber = RelayBlockNumber>,
|
||||
CallOf<T::Runtime>: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo>
|
||||
+ IsSubType<CallableCallFor<UtilityPallet<T::Runtime>, T::Runtime>>
|
||||
+ GrandpaCallSubType<T::Runtime, T::GrandpaInstance>
|
||||
+ MessagesCallSubType<T::Runtime, <T::Msgs as RefundableMessagesLaneId>::Instance>,
|
||||
<CallOf<T::Runtime> as Dispatchable>::RuntimeOrigin:
|
||||
AsSystemOriginSigner<AccountIdOf<T::Runtime>> + Clone,
|
||||
{
|
||||
type Pre = Option<PreDispatchData<AccountIdOf<T::Runtime>>>;
|
||||
type Val = Option<CallInfo>;
|
||||
|
||||
fn validate(
|
||||
&self,
|
||||
who: &Self::AccountId,
|
||||
call: &Self::Call,
|
||||
_info: &DispatchInfoOf<Self::Call>,
|
||||
origin: <CallOf<T::Runtime> as Dispatchable>::RuntimeOrigin,
|
||||
call: &CallOf<T::Runtime>,
|
||||
_info: &DispatchInfoOf<CallOf<T::Runtime>>,
|
||||
_len: usize,
|
||||
) -> TransactionValidity {
|
||||
_context: &mut Context,
|
||||
_self_implicit: Self::Implicit,
|
||||
_inherited_implication: &impl Encode,
|
||||
) -> ValidateResult<Self::Val, CallOf<T::Runtime>> {
|
||||
let who = origin.as_system_origin_signer().ok_or(InvalidTransaction::BadSigner)?;
|
||||
// this is the only relevant line of code for the `pre_dispatch`
|
||||
//
|
||||
// we're not calling `validate` from `pre_dispatch` directly because of performance
|
||||
@@ -511,12 +528,12 @@ where
|
||||
// we only boost priority of presumably correct message delivery transactions
|
||||
let bundled_messages = match T::bundled_messages_for_priority_boost(parsed_call.as_ref()) {
|
||||
Some(bundled_messages) => bundled_messages,
|
||||
None => return Ok(Default::default()),
|
||||
None => return Ok((Default::default(), parsed_call, origin)),
|
||||
};
|
||||
|
||||
// we only boost priority if relayer has staked required balance
|
||||
if !RelayersPallet::<T::Runtime>::is_registration_active(who) {
|
||||
return Ok(Default::default())
|
||||
return Ok((Default::default(), parsed_call, origin))
|
||||
}
|
||||
|
||||
// compute priority boost
|
||||
@@ -535,20 +552,21 @@ where
|
||||
priority_boost,
|
||||
);
|
||||
|
||||
valid_transaction.build()
|
||||
let validity = valid_transaction.build()?;
|
||||
Ok((validity, parsed_call, origin))
|
||||
}
|
||||
|
||||
fn pre_dispatch(
|
||||
fn prepare(
|
||||
self,
|
||||
who: &Self::AccountId,
|
||||
call: &Self::Call,
|
||||
_info: &DispatchInfoOf<Self::Call>,
|
||||
val: Self::Val,
|
||||
origin: &<CallOf<T::Runtime> as Dispatchable>::RuntimeOrigin,
|
||||
_call: &CallOf<T::Runtime>,
|
||||
_info: &DispatchInfoOf<CallOf<T::Runtime>>,
|
||||
_len: usize,
|
||||
_context: &Context,
|
||||
) -> Result<Self::Pre, TransactionValidityError> {
|
||||
// this is a relevant piece of `validate` that we need here (in `pre_dispatch`)
|
||||
let parsed_call = T::parse_and_check_for_obsolete_call(call)?;
|
||||
|
||||
Ok(parsed_call.map(|call_info| {
|
||||
let who = origin.as_system_origin_signer().ok_or(InvalidTransaction::BadSigner)?;
|
||||
Ok(val.map(|call_info| {
|
||||
log::trace!(
|
||||
target: "runtime::bridge",
|
||||
"{} via {:?} parsed bridge transaction in pre-dispatch: {:?}",
|
||||
@@ -561,13 +579,14 @@ where
|
||||
}
|
||||
|
||||
fn post_dispatch(
|
||||
pre: Option<Self::Pre>,
|
||||
info: &DispatchInfoOf<Self::Call>,
|
||||
post_info: &PostDispatchInfoOf<Self::Call>,
|
||||
pre: Self::Pre,
|
||||
info: &DispatchInfoOf<CallOf<T::Runtime>>,
|
||||
post_info: &PostDispatchInfoOf<CallOf<T::Runtime>>,
|
||||
len: usize,
|
||||
result: &DispatchResult,
|
||||
_context: &Context,
|
||||
) -> Result<(), TransactionValidityError> {
|
||||
let call_result = T::analyze_call_result(pre, info, post_info, len, result);
|
||||
let call_result = T::analyze_call_result(Some(pre), info, post_info, len, result);
|
||||
|
||||
match call_result {
|
||||
RelayerAccountAction::None => (),
|
||||
@@ -595,7 +614,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
/// Signed extension that refunds a relayer for new messages coming from a parachain.
|
||||
/// Transaction extension that refunds a relayer for new messages coming from a parachain.
|
||||
///
|
||||
/// Also refunds relayer for successful finality delivery if it comes in batch (`utility.batchAll`)
|
||||
/// with message delivery transaction. Batch may deliver either both relay chain header and
|
||||
@@ -636,7 +655,7 @@ pub struct RefundBridgedParachainMessages<Runtime, Para, Msgs, Refund, Priority,
|
||||
)>,
|
||||
);
|
||||
|
||||
impl<Runtime, Para, Msgs, Refund, Priority, Id> RefundSignedExtension
|
||||
impl<Runtime, Para, Msgs, Refund, Priority, Id> RefundTransactionExtension
|
||||
for RefundBridgedParachainMessages<Runtime, Para, Msgs, Refund, Priority, Id>
|
||||
where
|
||||
Self: 'static + Send + Sync,
|
||||
@@ -730,13 +749,13 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
/// Signed extension that refunds a relayer for new messages coming from a standalone (GRANDPA)
|
||||
/// Transaction extension that refunds a relayer for new messages coming from a standalone (GRANDPA)
|
||||
/// chain.
|
||||
///
|
||||
/// Also refunds relayer for successful finality delivery if it comes in batch (`utility.batchAll`)
|
||||
/// with message delivery transaction. Batch may deliver either both relay chain header and
|
||||
/// parachain head, or just parachain head. Corresponding headers must be used in messages
|
||||
/// proof verification.
|
||||
/// parachain head, or just parachain head. Corresponding headers must be used in messages proof
|
||||
/// verification.
|
||||
///
|
||||
/// Extension does not refund transaction tip due to security reasons.
|
||||
#[derive(
|
||||
@@ -771,7 +790,7 @@ pub struct RefundBridgedGrandpaMessages<Runtime, GrandpaInstance, Msgs, Refund,
|
||||
)>,
|
||||
);
|
||||
|
||||
impl<Runtime, GrandpaInstance, Msgs, Refund, Priority, Id> RefundSignedExtension
|
||||
impl<Runtime, GrandpaInstance, Msgs, Refund, Priority, Id> RefundTransactionExtension
|
||||
for RefundBridgedGrandpaMessages<Runtime, GrandpaInstance, Msgs, Refund, Priority, Id>
|
||||
where
|
||||
Self: 'static + Send + Sync,
|
||||
@@ -869,8 +888,8 @@ mod tests {
|
||||
Call as ParachainsCall, Pallet as ParachainsPallet, RelayBlockHash,
|
||||
};
|
||||
use sp_runtime::{
|
||||
traits::{ConstU64, Header as HeaderT},
|
||||
transaction_validity::{InvalidTransaction, ValidTransaction},
|
||||
traits::{ConstU64, DispatchTransaction, Header as HeaderT},
|
||||
transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction},
|
||||
DispatchError,
|
||||
};
|
||||
|
||||
@@ -899,7 +918,7 @@ mod tests {
|
||||
ConstU64<1>,
|
||||
StrTestExtension,
|
||||
>;
|
||||
type TestGrandpaExtension = RefundSignedExtensionAdapter<TestGrandpaExtensionProvider>;
|
||||
type TestGrandpaExtension = RefundTransactionExtensionAdapter<TestGrandpaExtensionProvider>;
|
||||
type TestExtensionProvider = RefundBridgedParachainMessages<
|
||||
TestRuntime,
|
||||
DefaultRefundableParachainId<(), TestParachain>,
|
||||
@@ -908,7 +927,7 @@ mod tests {
|
||||
ConstU64<1>,
|
||||
StrTestExtension,
|
||||
>;
|
||||
type TestExtension = RefundSignedExtensionAdapter<TestExtensionProvider>;
|
||||
type TestExtension = RefundTransactionExtensionAdapter<TestExtensionProvider>;
|
||||
|
||||
fn initial_balance_of_relayer_account_at_this_chain() -> ThisChainBalance {
|
||||
let test_stake: ThisChainBalance = TestStake::get();
|
||||
@@ -1407,14 +1426,28 @@ mod tests {
|
||||
|
||||
fn run_validate(call: RuntimeCall) -> TransactionValidity {
|
||||
let extension: TestExtension =
|
||||
RefundSignedExtensionAdapter(RefundBridgedParachainMessages(PhantomData));
|
||||
extension.validate(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0)
|
||||
RefundTransactionExtensionAdapter(RefundBridgedParachainMessages(PhantomData));
|
||||
extension
|
||||
.validate_only(
|
||||
Some(relayer_account_at_this_chain()).into(),
|
||||
&call,
|
||||
&DispatchInfo::default(),
|
||||
0,
|
||||
)
|
||||
.map(|res| res.0)
|
||||
}
|
||||
|
||||
fn run_grandpa_validate(call: RuntimeCall) -> TransactionValidity {
|
||||
let extension: TestGrandpaExtension =
|
||||
RefundSignedExtensionAdapter(RefundBridgedGrandpaMessages(PhantomData));
|
||||
extension.validate(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0)
|
||||
RefundTransactionExtensionAdapter(RefundBridgedGrandpaMessages(PhantomData));
|
||||
extension
|
||||
.validate_only(
|
||||
Some(relayer_account_at_this_chain()).into(),
|
||||
&call,
|
||||
&DispatchInfo::default(),
|
||||
0,
|
||||
)
|
||||
.map(|res| res.0)
|
||||
}
|
||||
|
||||
fn run_validate_ignore_priority(call: RuntimeCall) -> TransactionValidity {
|
||||
@@ -1428,16 +1461,30 @@ mod tests {
|
||||
call: RuntimeCall,
|
||||
) -> Result<Option<PreDispatchData<ThisChainAccountId>>, TransactionValidityError> {
|
||||
let extension: TestExtension =
|
||||
RefundSignedExtensionAdapter(RefundBridgedParachainMessages(PhantomData));
|
||||
extension.pre_dispatch(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0)
|
||||
RefundTransactionExtensionAdapter(RefundBridgedParachainMessages(PhantomData));
|
||||
extension
|
||||
.validate_and_prepare(
|
||||
Some(relayer_account_at_this_chain()).into(),
|
||||
&call,
|
||||
&DispatchInfo::default(),
|
||||
0,
|
||||
)
|
||||
.map(|(pre, _)| pre)
|
||||
}
|
||||
|
||||
fn run_grandpa_pre_dispatch(
|
||||
call: RuntimeCall,
|
||||
) -> Result<Option<PreDispatchData<ThisChainAccountId>>, TransactionValidityError> {
|
||||
let extension: TestGrandpaExtension =
|
||||
RefundSignedExtensionAdapter(RefundBridgedGrandpaMessages(PhantomData));
|
||||
extension.pre_dispatch(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0)
|
||||
RefundTransactionExtensionAdapter(RefundBridgedGrandpaMessages(PhantomData));
|
||||
extension
|
||||
.validate_and_prepare(
|
||||
Some(relayer_account_at_this_chain()).into(),
|
||||
&call,
|
||||
&DispatchInfo::default(),
|
||||
0,
|
||||
)
|
||||
.map(|(pre, _)| pre)
|
||||
}
|
||||
|
||||
fn dispatch_info() -> DispatchInfo {
|
||||
@@ -1460,11 +1507,12 @@ mod tests {
|
||||
dispatch_result: DispatchResult,
|
||||
) {
|
||||
let post_dispatch_result = TestExtension::post_dispatch(
|
||||
Some(pre_dispatch_data),
|
||||
pre_dispatch_data,
|
||||
&dispatch_info(),
|
||||
&post_dispatch_info(),
|
||||
1024,
|
||||
&dispatch_result,
|
||||
&(),
|
||||
);
|
||||
assert_eq!(post_dispatch_result, Ok(()));
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ pub use bp_polkadot_core::{
|
||||
};
|
||||
|
||||
use bp_messages::*;
|
||||
use bp_polkadot_core::SuffixedCommonSignedExtension;
|
||||
use bp_polkadot_core::SuffixedCommonTransactionExtension;
|
||||
use bp_runtime::extensions::{
|
||||
BridgeRejectObsoleteHeadersAndMessages, RefundBridgedParachainMessagesSchema,
|
||||
};
|
||||
@@ -164,7 +164,7 @@ pub const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 1024;
|
||||
pub const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 4096;
|
||||
|
||||
/// Signed extension that is used by all bridge hubs.
|
||||
pub type SignedExtension = SuffixedCommonSignedExtension<(
|
||||
pub type TransactionExtension = SuffixedCommonTransactionExtension<(
|
||||
BridgeRejectObsoleteHeadersAndMessages,
|
||||
RefundBridgedParachainMessagesSchema,
|
||||
)>;
|
||||
|
||||
@@ -107,5 +107,5 @@ frame_support::parameter_types! {
|
||||
|
||||
/// Transaction fee that is paid at the Rococo BridgeHub for delivering single outbound message confirmation.
|
||||
/// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_complex_message_confirmation_transaction` + `33%`)
|
||||
pub const BridgeHubRococoBaseConfirmationFeeInRocs: u128 = 5_380_829_647;
|
||||
pub const BridgeHubRococoBaseConfirmationFeeInRocs: u128 = 5_380_904_835;
|
||||
}
|
||||
|
||||
@@ -59,8 +59,8 @@ impl ChainWithGrandpa for Kusama {
|
||||
const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE;
|
||||
}
|
||||
|
||||
// The SignedExtension used by Kusama.
|
||||
pub use bp_polkadot_core::CommonSignedExtension as SignedExtension;
|
||||
// The TransactionExtension used by Kusama.
|
||||
pub use bp_polkadot_core::CommonTransactionExtension as TransactionExtension;
|
||||
|
||||
/// Name of the parachains pallet in the Kusama runtime.
|
||||
pub const PARAS_PALLET_NAME: &str = "Paras";
|
||||
|
||||
@@ -25,7 +25,7 @@ use bp_runtime::{
|
||||
decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis,
|
||||
extensions::{
|
||||
CheckEra, CheckGenesis, CheckNonZeroSender, CheckNonce, CheckSpecVersion, CheckTxVersion,
|
||||
CheckWeight, GenericSignedExtension, GenericSignedExtensionSchema,
|
||||
CheckWeight, GenericTransactionExtension, GenericTransactionExtensionSchema,
|
||||
},
|
||||
Chain, ChainId, TransactionEra,
|
||||
};
|
||||
@@ -37,7 +37,12 @@ use frame_support::{
|
||||
};
|
||||
use frame_system::limits;
|
||||
use scale_info::TypeInfo;
|
||||
use sp_runtime::{traits::DispatchInfoOf, transaction_validity::TransactionValidityError, Perbill};
|
||||
use sp_runtime::{
|
||||
impl_tx_ext_default,
|
||||
traits::{Dispatchable, TransactionExtensionBase},
|
||||
transaction_validity::TransactionValidityError,
|
||||
Perbill,
|
||||
};
|
||||
|
||||
// This chain reuses most of Polkadot primitives.
|
||||
pub use bp_polkadot_core::{
|
||||
@@ -71,10 +76,10 @@ pub const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 1024;
|
||||
pub const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 4096;
|
||||
|
||||
/// This signed extension is used to ensure that the chain transactions are signed by proper
|
||||
pub type ValidateSigned = GenericSignedExtensionSchema<(), ()>;
|
||||
pub type ValidateSigned = GenericTransactionExtensionSchema<(), ()>;
|
||||
|
||||
/// Signed extension schema, used by Polkadot Bulletin.
|
||||
pub type SignedExtensionSchema = GenericSignedExtension<(
|
||||
pub type TransactionExtensionSchema = GenericTransactionExtension<(
|
||||
(
|
||||
CheckNonZeroSender,
|
||||
CheckSpecVersion,
|
||||
@@ -87,34 +92,30 @@ pub type SignedExtensionSchema = GenericSignedExtension<(
|
||||
ValidateSigned,
|
||||
)>;
|
||||
|
||||
/// Signed extension, used by Polkadot Bulletin.
|
||||
/// Transaction extension, used by Polkadot Bulletin.
|
||||
#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)]
|
||||
pub struct SignedExtension(SignedExtensionSchema);
|
||||
pub struct TransactionExtension(TransactionExtensionSchema);
|
||||
|
||||
impl sp_runtime::traits::SignedExtension for SignedExtension {
|
||||
impl TransactionExtensionBase for TransactionExtension {
|
||||
const IDENTIFIER: &'static str = "Not needed.";
|
||||
type AccountId = ();
|
||||
type Call = ();
|
||||
type AdditionalSigned =
|
||||
<SignedExtensionSchema as sp_runtime::traits::SignedExtension>::AdditionalSigned;
|
||||
type Pre = ();
|
||||
type Implicit = <TransactionExtensionSchema as TransactionExtensionBase>::Implicit;
|
||||
|
||||
fn additional_signed(&self) -> Result<Self::AdditionalSigned, TransactionValidityError> {
|
||||
self.0.additional_signed()
|
||||
}
|
||||
|
||||
fn pre_dispatch(
|
||||
self,
|
||||
_who: &Self::AccountId,
|
||||
_call: &Self::Call,
|
||||
_info: &DispatchInfoOf<Self::Call>,
|
||||
_len: usize,
|
||||
) -> Result<Self::Pre, TransactionValidityError> {
|
||||
Ok(())
|
||||
fn implicit(&self) -> Result<Self::Implicit, TransactionValidityError> {
|
||||
<TransactionExtensionSchema as TransactionExtensionBase>::implicit(&self.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl SignedExtension {
|
||||
impl<C, Context> sp_runtime::traits::TransactionExtension<C, Context> for TransactionExtension
|
||||
where
|
||||
C: Dispatchable,
|
||||
{
|
||||
type Pre = ();
|
||||
type Val = ();
|
||||
|
||||
impl_tx_ext_default!(C; Context; validate prepare);
|
||||
}
|
||||
|
||||
impl TransactionExtension {
|
||||
/// Create signed extension from its components.
|
||||
pub fn from_params(
|
||||
spec_version: u32,
|
||||
@@ -123,7 +124,7 @@ impl SignedExtension {
|
||||
genesis_hash: Hash,
|
||||
nonce: Nonce,
|
||||
) -> Self {
|
||||
Self(GenericSignedExtension::new(
|
||||
Self(GenericTransactionExtension::new(
|
||||
(
|
||||
(
|
||||
(), // non-zero sender
|
||||
|
||||
@@ -61,8 +61,8 @@ impl ChainWithGrandpa for Polkadot {
|
||||
const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE;
|
||||
}
|
||||
|
||||
/// The SignedExtension used by Polkadot.
|
||||
pub type SignedExtension = SuffixedCommonSignedExtension<PrevalidateAttests>;
|
||||
/// The TransactionExtension used by Polkadot.
|
||||
pub type TransactionExtension = SuffixedCommonTransactionExtension<PrevalidateAttests>;
|
||||
|
||||
/// Name of the parachains pallet in the Polkadot runtime.
|
||||
pub const PARAS_PALLET_NAME: &str = "Paras";
|
||||
|
||||
@@ -59,8 +59,8 @@ impl ChainWithGrandpa for Rococo {
|
||||
const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE;
|
||||
}
|
||||
|
||||
// The SignedExtension used by Rococo.
|
||||
pub use bp_polkadot_core::CommonSignedExtension as SignedExtension;
|
||||
// The TransactionExtension used by Rococo.
|
||||
pub use bp_polkadot_core::CommonTransactionExtension as TransactionExtension;
|
||||
|
||||
/// Name of the parachains pallet in the Rococo runtime.
|
||||
pub const PARAS_PALLET_NAME: &str = "Paras";
|
||||
|
||||
@@ -59,8 +59,8 @@ impl ChainWithGrandpa for Westend {
|
||||
const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE;
|
||||
}
|
||||
|
||||
// The SignedExtension used by Westend.
|
||||
pub use bp_polkadot_core::CommonSignedExtension as SignedExtension;
|
||||
// The TransactionExtension used by Westend.
|
||||
pub use bp_polkadot_core::CommonTransactionExtension as TransactionExtension;
|
||||
|
||||
/// Name of the parachains pallet in the Rococo runtime.
|
||||
pub const PARAS_PALLET_NAME: &str = "Paras";
|
||||
|
||||
@@ -24,8 +24,8 @@ use bp_runtime::{
|
||||
self,
|
||||
extensions::{
|
||||
ChargeTransactionPayment, CheckEra, CheckGenesis, CheckNonZeroSender, CheckNonce,
|
||||
CheckSpecVersion, CheckTxVersion, CheckWeight, GenericSignedExtension,
|
||||
SignedExtensionSchema,
|
||||
CheckSpecVersion, CheckTxVersion, CheckWeight, GenericTransactionExtension,
|
||||
TransactionExtensionSchema,
|
||||
},
|
||||
EncodedOrDecodedCall, StorageMapKeyProvider, TransactionEra,
|
||||
};
|
||||
@@ -229,8 +229,12 @@ pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
pub type Balance = u128;
|
||||
|
||||
/// Unchecked Extrinsic type.
|
||||
pub type UncheckedExtrinsic<Call, SignedExt> =
|
||||
generic::UncheckedExtrinsic<AccountAddress, EncodedOrDecodedCall<Call>, Signature, SignedExt>;
|
||||
pub type UncheckedExtrinsic<Call, TransactionExt> = generic::UncheckedExtrinsic<
|
||||
AccountAddress,
|
||||
EncodedOrDecodedCall<Call>,
|
||||
Signature,
|
||||
TransactionExt,
|
||||
>;
|
||||
|
||||
/// Account address, used by the Polkadot-like chain.
|
||||
pub type Address = MultiAddress<AccountId, ()>;
|
||||
@@ -275,7 +279,7 @@ impl AccountInfoStorageMapKeyProvider {
|
||||
}
|
||||
|
||||
/// Extra signed extension data that is used by most chains.
|
||||
pub type CommonSignedExtra = (
|
||||
pub type CommonTransactionExtra = (
|
||||
CheckNonZeroSender,
|
||||
CheckSpecVersion,
|
||||
CheckTxVersion,
|
||||
@@ -286,12 +290,12 @@ pub type CommonSignedExtra = (
|
||||
ChargeTransactionPayment<Balance>,
|
||||
);
|
||||
|
||||
/// Extra signed extension data that starts with `CommonSignedExtra`.
|
||||
pub type SuffixedCommonSignedExtension<Suffix> =
|
||||
GenericSignedExtension<(CommonSignedExtra, Suffix)>;
|
||||
/// Extra transaction extension data that starts with `CommonTransactionExtra`.
|
||||
pub type SuffixedCommonTransactionExtension<Suffix> =
|
||||
GenericTransactionExtension<(CommonTransactionExtra, Suffix)>;
|
||||
|
||||
/// Helper trait to define some extra methods on `SuffixedCommonSignedExtension`.
|
||||
pub trait SuffixedCommonSignedExtensionExt<Suffix: SignedExtensionSchema> {
|
||||
/// Helper trait to define some extra methods on `SuffixedCommonTransactionExtension`.
|
||||
pub trait SuffixedCommonTransactionExtensionExt<Suffix: TransactionExtensionSchema> {
|
||||
/// Create signed extension from its components.
|
||||
fn from_params(
|
||||
spec_version: u32,
|
||||
@@ -300,7 +304,7 @@ pub trait SuffixedCommonSignedExtensionExt<Suffix: SignedExtensionSchema> {
|
||||
genesis_hash: Hash,
|
||||
nonce: Nonce,
|
||||
tip: Balance,
|
||||
extra: (Suffix::Payload, Suffix::AdditionalSigned),
|
||||
extra: (Suffix::Payload, Suffix::Implicit),
|
||||
) -> Self;
|
||||
|
||||
/// Return transaction nonce.
|
||||
@@ -310,9 +314,10 @@ pub trait SuffixedCommonSignedExtensionExt<Suffix: SignedExtensionSchema> {
|
||||
fn tip(&self) -> Balance;
|
||||
}
|
||||
|
||||
impl<Suffix> SuffixedCommonSignedExtensionExt<Suffix> for SuffixedCommonSignedExtension<Suffix>
|
||||
impl<Suffix> SuffixedCommonTransactionExtensionExt<Suffix>
|
||||
for SuffixedCommonTransactionExtension<Suffix>
|
||||
where
|
||||
Suffix: SignedExtensionSchema,
|
||||
Suffix: TransactionExtensionSchema,
|
||||
{
|
||||
fn from_params(
|
||||
spec_version: u32,
|
||||
@@ -321,9 +326,9 @@ where
|
||||
genesis_hash: Hash,
|
||||
nonce: Nonce,
|
||||
tip: Balance,
|
||||
extra: (Suffix::Payload, Suffix::AdditionalSigned),
|
||||
extra: (Suffix::Payload, Suffix::Implicit),
|
||||
) -> Self {
|
||||
GenericSignedExtension::new(
|
||||
GenericTransactionExtension::new(
|
||||
(
|
||||
(
|
||||
(), // non-zero sender
|
||||
@@ -365,7 +370,7 @@ where
|
||||
}
|
||||
|
||||
/// Signed extension that is used by most chains.
|
||||
pub type CommonSignedExtension = SuffixedCommonSignedExtension<()>;
|
||||
pub type CommonTransactionExtension = SuffixedCommonTransactionExtension<()>;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
|
||||
@@ -20,135 +20,138 @@ use codec::{Compact, Decode, Encode};
|
||||
use impl_trait_for_tuples::impl_for_tuples;
|
||||
use scale_info::{StaticTypeInfo, TypeInfo};
|
||||
use sp_runtime::{
|
||||
traits::{DispatchInfoOf, SignedExtension},
|
||||
impl_tx_ext_default,
|
||||
traits::{Dispatchable, TransactionExtension, TransactionExtensionBase},
|
||||
transaction_validity::TransactionValidityError,
|
||||
};
|
||||
use sp_std::{fmt::Debug, marker::PhantomData};
|
||||
|
||||
/// Trait that describes some properties of a `SignedExtension` that are needed in order to send a
|
||||
/// transaction to the chain.
|
||||
pub trait SignedExtensionSchema: Encode + Decode + Debug + Eq + Clone + StaticTypeInfo {
|
||||
/// Trait that describes some properties of a `TransactionExtension` that are needed in order to
|
||||
/// send a transaction to the chain.
|
||||
pub trait TransactionExtensionSchema:
|
||||
Encode + Decode + Debug + Eq + Clone + StaticTypeInfo
|
||||
{
|
||||
/// A type of the data encoded as part of the transaction.
|
||||
type Payload: Encode + Decode + Debug + Eq + Clone + StaticTypeInfo;
|
||||
/// Parameters which are part of the payload used to produce transaction signature,
|
||||
/// but don't end up in the transaction itself (i.e. inherent part of the runtime).
|
||||
type AdditionalSigned: Encode + Debug + Eq + Clone + StaticTypeInfo;
|
||||
type Implicit: Encode + Decode + Debug + Eq + Clone + StaticTypeInfo;
|
||||
}
|
||||
|
||||
impl SignedExtensionSchema for () {
|
||||
impl TransactionExtensionSchema for () {
|
||||
type Payload = ();
|
||||
type AdditionalSigned = ();
|
||||
type Implicit = ();
|
||||
}
|
||||
|
||||
/// An implementation of `SignedExtensionSchema` using generic params.
|
||||
/// An implementation of `TransactionExtensionSchema` using generic params.
|
||||
#[derive(Encode, Decode, Clone, Debug, PartialEq, Eq, TypeInfo)]
|
||||
pub struct GenericSignedExtensionSchema<P, S>(PhantomData<(P, S)>);
|
||||
pub struct GenericTransactionExtensionSchema<P, S>(PhantomData<(P, S)>);
|
||||
|
||||
impl<P, S> SignedExtensionSchema for GenericSignedExtensionSchema<P, S>
|
||||
impl<P, S> TransactionExtensionSchema for GenericTransactionExtensionSchema<P, S>
|
||||
where
|
||||
P: Encode + Decode + Debug + Eq + Clone + StaticTypeInfo,
|
||||
S: Encode + Debug + Eq + Clone + StaticTypeInfo,
|
||||
S: Encode + Decode + Debug + Eq + Clone + StaticTypeInfo,
|
||||
{
|
||||
type Payload = P;
|
||||
type AdditionalSigned = S;
|
||||
type Implicit = S;
|
||||
}
|
||||
|
||||
/// The `SignedExtensionSchema` for `frame_system::CheckNonZeroSender`.
|
||||
pub type CheckNonZeroSender = GenericSignedExtensionSchema<(), ()>;
|
||||
/// The `TransactionExtensionSchema` for `frame_system::CheckNonZeroSender`.
|
||||
pub type CheckNonZeroSender = GenericTransactionExtensionSchema<(), ()>;
|
||||
|
||||
/// The `SignedExtensionSchema` for `frame_system::CheckSpecVersion`.
|
||||
pub type CheckSpecVersion = GenericSignedExtensionSchema<(), u32>;
|
||||
/// The `TransactionExtensionSchema` for `frame_system::CheckSpecVersion`.
|
||||
pub type CheckSpecVersion = GenericTransactionExtensionSchema<(), u32>;
|
||||
|
||||
/// The `SignedExtensionSchema` for `frame_system::CheckTxVersion`.
|
||||
pub type CheckTxVersion = GenericSignedExtensionSchema<(), u32>;
|
||||
/// The `TransactionExtensionSchema` for `frame_system::CheckTxVersion`.
|
||||
pub type CheckTxVersion = GenericTransactionExtensionSchema<(), u32>;
|
||||
|
||||
/// The `SignedExtensionSchema` for `frame_system::CheckGenesis`.
|
||||
pub type CheckGenesis<Hash> = GenericSignedExtensionSchema<(), Hash>;
|
||||
/// The `TransactionExtensionSchema` for `frame_system::CheckGenesis`.
|
||||
pub type CheckGenesis<Hash> = GenericTransactionExtensionSchema<(), Hash>;
|
||||
|
||||
/// The `SignedExtensionSchema` for `frame_system::CheckEra`.
|
||||
pub type CheckEra<Hash> = GenericSignedExtensionSchema<sp_runtime::generic::Era, Hash>;
|
||||
/// The `TransactionExtensionSchema` for `frame_system::CheckEra`.
|
||||
pub type CheckEra<Hash> = GenericTransactionExtensionSchema<sp_runtime::generic::Era, Hash>;
|
||||
|
||||
/// The `SignedExtensionSchema` for `frame_system::CheckNonce`.
|
||||
pub type CheckNonce<TxNonce> = GenericSignedExtensionSchema<Compact<TxNonce>, ()>;
|
||||
/// The `TransactionExtensionSchema` for `frame_system::CheckNonce`.
|
||||
pub type CheckNonce<TxNonce> = GenericTransactionExtensionSchema<Compact<TxNonce>, ()>;
|
||||
|
||||
/// The `SignedExtensionSchema` for `frame_system::CheckWeight`.
|
||||
pub type CheckWeight = GenericSignedExtensionSchema<(), ()>;
|
||||
/// The `TransactionExtensionSchema` for `frame_system::CheckWeight`.
|
||||
pub type CheckWeight = GenericTransactionExtensionSchema<(), ()>;
|
||||
|
||||
/// The `SignedExtensionSchema` for `pallet_transaction_payment::ChargeTransactionPayment`.
|
||||
pub type ChargeTransactionPayment<Balance> = GenericSignedExtensionSchema<Compact<Balance>, ()>;
|
||||
/// The `TransactionExtensionSchema` for `pallet_transaction_payment::ChargeTransactionPayment`.
|
||||
pub type ChargeTransactionPayment<Balance> =
|
||||
GenericTransactionExtensionSchema<Compact<Balance>, ()>;
|
||||
|
||||
/// The `SignedExtensionSchema` for `polkadot-runtime-common::PrevalidateAttests`.
|
||||
pub type PrevalidateAttests = GenericSignedExtensionSchema<(), ()>;
|
||||
/// The `TransactionExtensionSchema` for `polkadot-runtime-common::PrevalidateAttests`.
|
||||
pub type PrevalidateAttests = GenericTransactionExtensionSchema<(), ()>;
|
||||
|
||||
/// The `SignedExtensionSchema` for `BridgeRejectObsoleteHeadersAndMessages`.
|
||||
pub type BridgeRejectObsoleteHeadersAndMessages = GenericSignedExtensionSchema<(), ()>;
|
||||
/// The `TransactionExtensionSchema` for `BridgeRejectObsoleteHeadersAndMessages`.
|
||||
pub type BridgeRejectObsoleteHeadersAndMessages = GenericTransactionExtensionSchema<(), ()>;
|
||||
|
||||
/// The `SignedExtensionSchema` for `RefundBridgedParachainMessages`.
|
||||
/// The `TransactionExtensionSchema` for `RefundBridgedParachainMessages`.
|
||||
/// This schema is dedicated for `RefundBridgedParachainMessages` signed extension as
|
||||
/// wildcard/placeholder, which relies on the scale encoding for `()` or `((), ())`, or `((), (),
|
||||
/// ())` is the same. So runtime can contains any kind of tuple:
|
||||
/// `(BridgeRefundBridgeHubRococoMessages)`
|
||||
/// `(BridgeRefundBridgeHubRococoMessages, BridgeRefundBridgeHubWestendMessages)`
|
||||
/// `(BridgeRefundParachainMessages1, ..., BridgeRefundParachainMessagesN)`
|
||||
pub type RefundBridgedParachainMessagesSchema = GenericSignedExtensionSchema<(), ()>;
|
||||
pub type RefundBridgedParachainMessagesSchema = GenericTransactionExtensionSchema<(), ()>;
|
||||
|
||||
#[impl_for_tuples(1, 12)]
|
||||
impl SignedExtensionSchema for Tuple {
|
||||
impl TransactionExtensionSchema for Tuple {
|
||||
for_tuples!( type Payload = ( #( Tuple::Payload ),* ); );
|
||||
for_tuples!( type AdditionalSigned = ( #( Tuple::AdditionalSigned ),* ); );
|
||||
for_tuples!( type Implicit = ( #( Tuple::Implicit ),* ); );
|
||||
}
|
||||
|
||||
/// A simplified version of signed extensions meant for producing signed transactions
|
||||
/// and signed payloads in the client code.
|
||||
#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)]
|
||||
pub struct GenericSignedExtension<S: SignedExtensionSchema> {
|
||||
pub struct GenericTransactionExtension<S: TransactionExtensionSchema> {
|
||||
/// A payload that is included in the transaction.
|
||||
pub payload: S::Payload,
|
||||
#[codec(skip)]
|
||||
// It may be set to `None` if extensions are decoded. We are never reconstructing transactions
|
||||
// (and it makes no sense to do that) => decoded version of `SignedExtensions` is only used to
|
||||
// read fields of the `payload`. And when resigning transaction, we're reconstructing
|
||||
// `SignedExtensions` from scratch.
|
||||
additional_signed: Option<S::AdditionalSigned>,
|
||||
// (and it makes no sense to do that) => decoded version of `TransactionExtensions` is only
|
||||
// used to read fields of the `payload`. And when resigning transaction, we're reconstructing
|
||||
// `TransactionExtensions` from scratch.
|
||||
implicit: Option<S::Implicit>,
|
||||
}
|
||||
|
||||
impl<S: SignedExtensionSchema> GenericSignedExtension<S> {
|
||||
/// Create new `GenericSignedExtension` object.
|
||||
pub fn new(payload: S::Payload, additional_signed: Option<S::AdditionalSigned>) -> Self {
|
||||
Self { payload, additional_signed }
|
||||
impl<S: TransactionExtensionSchema> GenericTransactionExtension<S> {
|
||||
/// Create new `GenericTransactionExtension` object.
|
||||
pub fn new(payload: S::Payload, implicit: Option<S::Implicit>) -> Self {
|
||||
Self { payload, implicit }
|
||||
}
|
||||
}
|
||||
|
||||
impl<S> SignedExtension for GenericSignedExtension<S>
|
||||
impl<S> TransactionExtensionBase for GenericTransactionExtension<S>
|
||||
where
|
||||
S: SignedExtensionSchema,
|
||||
S: TransactionExtensionSchema,
|
||||
S::Payload: Send + Sync,
|
||||
S::AdditionalSigned: Send + Sync,
|
||||
S::Implicit: Send + Sync,
|
||||
{
|
||||
const IDENTIFIER: &'static str = "Not needed.";
|
||||
type AccountId = ();
|
||||
type Call = ();
|
||||
type AdditionalSigned = S::AdditionalSigned;
|
||||
type Pre = ();
|
||||
type Implicit = S::Implicit;
|
||||
|
||||
fn additional_signed(&self) -> Result<Self::AdditionalSigned, TransactionValidityError> {
|
||||
fn implicit(&self) -> Result<Self::Implicit, TransactionValidityError> {
|
||||
// we shall not ever see this error in relay, because we are never signing decoded
|
||||
// transactions. Instead we're constructing and signing new transactions. So the error code
|
||||
// is kinda random here
|
||||
self.additional_signed.clone().ok_or(
|
||||
frame_support::unsigned::TransactionValidityError::Unknown(
|
||||
self.implicit
|
||||
.clone()
|
||||
.ok_or(frame_support::unsigned::TransactionValidityError::Unknown(
|
||||
frame_support::unsigned::UnknownTransaction::Custom(0xFF),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
fn pre_dispatch(
|
||||
self,
|
||||
_who: &Self::AccountId,
|
||||
_call: &Self::Call,
|
||||
_info: &DispatchInfoOf<Self::Call>,
|
||||
_len: usize,
|
||||
) -> Result<Self::Pre, TransactionValidityError> {
|
||||
Ok(())
|
||||
))
|
||||
}
|
||||
}
|
||||
impl<S, C, Context> TransactionExtension<C, Context> for GenericTransactionExtension<S>
|
||||
where
|
||||
C: Dispatchable,
|
||||
S: TransactionExtensionSchema,
|
||||
S::Payload: Send + Sync,
|
||||
S::Implicit: Send + Sync,
|
||||
{
|
||||
type Pre = ();
|
||||
type Val = ();
|
||||
|
||||
impl_tx_ext_default!(C; Context; validate prepare);
|
||||
}
|
||||
|
||||
@@ -181,6 +181,7 @@ runtime-benchmarks = [
|
||||
"pallet-message-queue/runtime-benchmarks",
|
||||
"pallet-multisig/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"pallet-xcm-benchmarks/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
|
||||
@@ -138,6 +138,7 @@ runtime-benchmarks = [
|
||||
"cumulus-pallet-session-benchmarking/runtime-benchmarks",
|
||||
"cumulus-pallet-xcmp-queue/runtime-benchmarks",
|
||||
"cumulus-primitives-core/runtime-benchmarks",
|
||||
"cumulus-primitives-storage-weight-reclaim/runtime-benchmarks",
|
||||
"cumulus-primitives-utility/runtime-benchmarks",
|
||||
"frame-benchmarking/runtime-benchmarks",
|
||||
"frame-support/runtime-benchmarks",
|
||||
@@ -150,6 +151,7 @@ runtime-benchmarks = [
|
||||
"pallet-parachain-template/runtime-benchmarks",
|
||||
"pallet-sudo/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
"parachains-common/runtime-benchmarks",
|
||||
"polkadot-parachain-primitives/runtime-benchmarks",
|
||||
|
||||
@@ -97,8 +97,8 @@ pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The extension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -112,7 +112,7 @@ pub type SignedExtra = (
|
||||
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
|
||||
/// Executive: handles dispatch to the various modules.
|
||||
pub type Executive = frame_executive::Executive<
|
||||
@@ -353,6 +353,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type OperationalFeeMultiplier = ConstU8<5>;
|
||||
type WeightInfo = ();
|
||||
}
|
||||
|
||||
impl pallet_sudo::Config for Runtime {
|
||||
@@ -529,6 +530,7 @@ construct_runtime!(
|
||||
mod benches {
|
||||
frame_benchmarking::define_benchmarks!(
|
||||
[frame_system, SystemBench::<Runtime>]
|
||||
[frame_system_extensions, SystemExtensionsBench::<Runtime>]
|
||||
[pallet_balances, Balances]
|
||||
[pallet_session, SessionBench::<Runtime>]
|
||||
[pallet_timestamp, Timestamp]
|
||||
@@ -712,6 +714,7 @@ impl_runtime_apis! {
|
||||
use frame_benchmarking::{Benchmarking, BenchmarkList};
|
||||
use frame_support::traits::StorageInfoTrait;
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
use cumulus_pallet_session_benchmarking::Pallet as SessionBench;
|
||||
|
||||
let mut list = Vec::<BenchmarkList>::new();
|
||||
@@ -727,6 +730,7 @@ impl_runtime_apis! {
|
||||
use frame_benchmarking::{BenchmarkError, Benchmarking, BenchmarkBatch};
|
||||
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
impl frame_system_benchmarking::Config for Runtime {
|
||||
fn setup_set_code_requirements(code: &sp_std::vec::Vec<u8>) -> Result<(), BenchmarkError> {
|
||||
ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32);
|
||||
|
||||
@@ -119,6 +119,7 @@ runtime-benchmarks = [
|
||||
"frame-support/runtime-benchmarks",
|
||||
"frame-system-benchmarking/runtime-benchmarks",
|
||||
"frame-system/runtime-benchmarks",
|
||||
"pallet-asset-conversion-tx-payment/runtime-benchmarks",
|
||||
"pallet-asset-conversion/runtime-benchmarks",
|
||||
"pallet-assets/runtime-benchmarks",
|
||||
"pallet-balances/runtime-benchmarks",
|
||||
@@ -130,6 +131,7 @@ runtime-benchmarks = [
|
||||
"pallet-proxy/runtime-benchmarks",
|
||||
"pallet-state-trie-migration/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-uniques/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"pallet-xcm-benchmarks/runtime-benchmarks",
|
||||
|
||||
@@ -178,6 +178,7 @@ impl frame_system::Config for Runtime {
|
||||
type Version = Version;
|
||||
type AccountData = pallet_balances::AccountData<Balance>;
|
||||
type SystemWeightInfo = weights::frame_system::WeightInfo<Runtime>;
|
||||
type ExtensionsWeightInfo = weights::frame_system_extensions::WeightInfo<Runtime>;
|
||||
type SS58Prefix = SS58Prefix;
|
||||
type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;
|
||||
type MaxConsumers = frame_support::traits::ConstU32<16>;
|
||||
@@ -234,6 +235,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type OperationalFeeMultiplier = ConstU8<5>;
|
||||
type WeightInfo = weights::pallet_transaction_payment::WeightInfo<Runtime>;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
@@ -761,6 +763,9 @@ impl pallet_asset_conversion_tx_payment::Config for Runtime {
|
||||
type Fungibles = LocalAndForeignAssets;
|
||||
type OnChargeAssetTransaction =
|
||||
AssetConversionAdapter<Balances, AssetConversion, TokenLocationV3>;
|
||||
type WeightInfo = weights::pallet_asset_conversion_tx_payment::WeightInfo<Runtime>;
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
type BenchmarkHelper = AssetConversionTxHelper;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
@@ -948,8 +953,8 @@ pub type Block = generic::Block<Header, UncheckedExtrinsic>;
|
||||
pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The extension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -961,7 +966,7 @@ pub type SignedExtra = (
|
||||
);
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
/// Migrations to apply on runtime upgrade.
|
||||
pub type Migrations = (
|
||||
pallet_collator_selection::migration::v1::MigrateToV1<Runtime>,
|
||||
@@ -1034,14 +1039,77 @@ pub type Executive = frame_executive::Executive<
|
||||
Migrations,
|
||||
>;
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
pub struct AssetConversionTxHelper;
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
impl
|
||||
pallet_asset_conversion_tx_payment::BenchmarkHelperTrait<
|
||||
AccountId,
|
||||
xcm::v3::MultiLocation,
|
||||
xcm::v3::MultiLocation,
|
||||
> for AssetConversionTxHelper
|
||||
{
|
||||
fn create_asset_id_parameter(seed: u32) -> (xcm::v3::MultiLocation, xcm::v3::MultiLocation) {
|
||||
// Use a different parachain' foreign assets pallet so that the asset is indeed foreign.
|
||||
let asset_id = xcm::v3::MultiLocation::new(
|
||||
1,
|
||||
xcm::v3::Junctions::X3(
|
||||
xcm::v3::Junction::Parachain(3000),
|
||||
xcm::v3::Junction::PalletInstance(53),
|
||||
xcm::v3::Junction::GeneralIndex(seed.into()),
|
||||
),
|
||||
);
|
||||
(asset_id, asset_id)
|
||||
}
|
||||
|
||||
fn setup_balances_and_pool(asset_id: xcm::v3::MultiLocation, account: AccountId) {
|
||||
use frame_support::{assert_ok, traits::fungibles::Mutate};
|
||||
assert_ok!(ForeignAssets::force_create(
|
||||
RuntimeOrigin::root(),
|
||||
asset_id.into(),
|
||||
account.clone().into(), /* owner */
|
||||
true, /* is_sufficient */
|
||||
1,
|
||||
));
|
||||
|
||||
let lp_provider = account.clone();
|
||||
use frame_support::traits::Currency;
|
||||
let _ = Balances::deposit_creating(&lp_provider, u64::MAX.into());
|
||||
assert_ok!(ForeignAssets::mint_into(asset_id.into(), &lp_provider, u64::MAX.into()));
|
||||
|
||||
let token_native = Box::new(TokenLocationV3::get());
|
||||
let token_second = Box::new(asset_id);
|
||||
|
||||
assert_ok!(AssetConversion::create_pool(
|
||||
RuntimeOrigin::signed(lp_provider.clone()),
|
||||
token_native.clone(),
|
||||
token_second.clone()
|
||||
));
|
||||
|
||||
assert_ok!(AssetConversion::add_liquidity(
|
||||
RuntimeOrigin::signed(lp_provider.clone()),
|
||||
token_native,
|
||||
token_second,
|
||||
(u32::MAX / 8).into(), // 1 desired
|
||||
u32::MAX.into(), // 2 desired
|
||||
1, // 1 min
|
||||
1, // 2 min
|
||||
lp_provider,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
mod benches {
|
||||
frame_benchmarking::define_benchmarks!(
|
||||
[frame_system, SystemBench::<Runtime>]
|
||||
[frame_system_extensions, SystemExtensionsBench::<Runtime>]
|
||||
[pallet_assets, Local]
|
||||
[pallet_assets, Foreign]
|
||||
[pallet_assets, Pool]
|
||||
[pallet_asset_conversion, AssetConversion]
|
||||
[pallet_asset_conversion_tx_payment, AssetTxPayment]
|
||||
[pallet_balances, Balances]
|
||||
[pallet_message_queue, MessageQueue]
|
||||
[pallet_multisig, Multisig]
|
||||
@@ -1052,6 +1120,7 @@ mod benches {
|
||||
[pallet_uniques, Uniques]
|
||||
[pallet_utility, Utility]
|
||||
[pallet_timestamp, Timestamp]
|
||||
[pallet_transaction_payment, TransactionPayment]
|
||||
[pallet_collator_selection, CollatorSelection]
|
||||
[cumulus_pallet_parachain_system, ParachainSystem]
|
||||
[cumulus_pallet_xcmp_queue, XcmpQueue]
|
||||
@@ -1302,6 +1371,7 @@ impl_runtime_apis! {
|
||||
use frame_benchmarking::{Benchmarking, BenchmarkList};
|
||||
use frame_support::traits::StorageInfoTrait;
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
use cumulus_pallet_session_benchmarking::Pallet as SessionBench;
|
||||
use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark;
|
||||
use pallet_xcm_bridge_hub_router::benchmarking::Pallet as XcmBridgeHubRouterBench;
|
||||
@@ -1336,6 +1406,7 @@ impl_runtime_apis! {
|
||||
use sp_storage::TrackedStorageKey;
|
||||
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
impl frame_system_benchmarking::Config for Runtime {
|
||||
fn setup_set_code_requirements(code: &sp_std::vec::Vec<u8>) -> Result<(), BenchmarkError> {
|
||||
ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32);
|
||||
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `frame_system_extensions`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-rococo-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=frame_system_extensions
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/
|
||||
// --chain=asset-hub-rococo-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `frame_system_extensions`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> frame_system::ExtensionsWeightInfo for WeightInfo<T> {
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_genesis() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `54`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 3_637_000 picoseconds.
|
||||
Weight::from_parts(6_382_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_mortality() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `92`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 5_841_000 picoseconds.
|
||||
Weight::from_parts(8_776_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
fn check_non_zero_sender() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 561_000 picoseconds.
|
||||
Weight::from_parts(2_705_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_nonce() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 3_316_000 picoseconds.
|
||||
Weight::from_parts(5_771_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_spec_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 511_000 picoseconds.
|
||||
Weight::from_parts(2_575_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_tx_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 501_000 picoseconds.
|
||||
Weight::from_parts(2_595_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `System::AllExtrinsicsLen` (r:1 w:1)
|
||||
/// Proof: `System::AllExtrinsicsLen` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::BlockWeight` (r:1 w:1)
|
||||
/// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`)
|
||||
fn check_weight() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `24`
|
||||
// Estimated: `1533`
|
||||
// Minimum execution time: 3_687_000 picoseconds.
|
||||
Weight::from_parts(6_192_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 1533))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(2))
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,9 @@ pub mod cumulus_pallet_parachain_system;
|
||||
pub mod cumulus_pallet_xcmp_queue;
|
||||
pub mod extrinsic_weights;
|
||||
pub mod frame_system;
|
||||
pub mod frame_system_extensions;
|
||||
pub mod pallet_asset_conversion;
|
||||
pub mod pallet_asset_conversion_tx_payment;
|
||||
pub mod pallet_assets_foreign;
|
||||
pub mod pallet_assets_local;
|
||||
pub mod pallet_assets_pool;
|
||||
@@ -32,6 +34,7 @@ pub mod pallet_nfts;
|
||||
pub mod pallet_proxy;
|
||||
pub mod pallet_session;
|
||||
pub mod pallet_timestamp;
|
||||
pub mod pallet_transaction_payment;
|
||||
pub mod pallet_uniques;
|
||||
pub mod pallet_utility;
|
||||
pub mod pallet_xcm;
|
||||
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `pallet_asset_conversion_tx_payment`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2024-01-04, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `Georges-MacBook-Pro.local`, CPU: `<UNKNOWN>`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-rococo-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/debug/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=pallet_asset_conversion_tx_payment
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/
|
||||
// --chain=asset-hub-rococo-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `pallet_asset_conversion_tx_payment`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> pallet_asset_conversion_tx_payment::WeightInfo for WeightInfo<T> {
|
||||
fn charge_asset_tx_payment_zero() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 7_000_000 picoseconds.
|
||||
Weight::from_parts(10_000_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:1 w:0)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_asset_tx_payment_native() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `4`
|
||||
// Estimated: `3593`
|
||||
// Minimum execution time: 209_000_000 picoseconds.
|
||||
Weight::from_parts(212_000_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3593))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
}
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `ForeignAssets::Asset` (r:1 w:1)
|
||||
/// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`)
|
||||
/// Storage: `ForeignAssets::Account` (r:2 w:2)
|
||||
/// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:2 w:1)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_asset_tx_payment_asset() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `631`
|
||||
// Estimated: `7404`
|
||||
// Minimum execution time: 1_228_000_000 picoseconds.
|
||||
Weight::from_parts(1_268_000_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 7404))
|
||||
.saturating_add(T::DbWeight::get().reads(6))
|
||||
.saturating_add(T::DbWeight::get().writes(4))
|
||||
}
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `pallet_transaction_payment`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-rococo-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=pallet_transaction_payment
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/
|
||||
// --chain=asset-hub-rococo-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `pallet_transaction_payment`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> pallet_transaction_payment::WeightInfo for WeightInfo<T> {
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:1 w:1)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_transaction_payment() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `4`
|
||||
// Estimated: `3593`
|
||||
// Minimum execution time: 33_363_000 picoseconds.
|
||||
Weight::from_parts(38_793_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3593))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(1))
|
||||
}
|
||||
}
|
||||
@@ -110,6 +110,7 @@ runtime-benchmarks = [
|
||||
"frame-system-benchmarking/runtime-benchmarks",
|
||||
"frame-system/runtime-benchmarks",
|
||||
"hex-literal",
|
||||
"pallet-asset-conversion-tx-payment/runtime-benchmarks",
|
||||
"pallet-asset-conversion/runtime-benchmarks",
|
||||
"pallet-assets/runtime-benchmarks",
|
||||
"pallet-balances/runtime-benchmarks",
|
||||
@@ -120,6 +121,7 @@ runtime-benchmarks = [
|
||||
"pallet-nfts/runtime-benchmarks",
|
||||
"pallet-proxy/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-uniques/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"pallet-xcm-benchmarks/runtime-benchmarks",
|
||||
|
||||
@@ -162,6 +162,7 @@ impl frame_system::Config for Runtime {
|
||||
type Version = Version;
|
||||
type AccountData = pallet_balances::AccountData<Balance>;
|
||||
type SystemWeightInfo = weights::frame_system::WeightInfo<Runtime>;
|
||||
type ExtensionsWeightInfo = weights::frame_system_extensions::WeightInfo<Runtime>;
|
||||
type SS58Prefix = SS58Prefix;
|
||||
type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;
|
||||
type MaxConsumers = frame_support::traits::ConstU32<16>;
|
||||
@@ -218,6 +219,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type OperationalFeeMultiplier = ConstU8<5>;
|
||||
type WeightInfo = weights::pallet_transaction_payment::WeightInfo<Runtime>;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
@@ -735,6 +737,9 @@ impl pallet_asset_conversion_tx_payment::Config for Runtime {
|
||||
type Fungibles = LocalAndForeignAssets;
|
||||
type OnChargeAssetTransaction =
|
||||
AssetConversionAdapter<Balances, AssetConversion, WestendLocationV3>;
|
||||
type WeightInfo = weights::pallet_asset_conversion_tx_payment::WeightInfo<Runtime>;
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
type BenchmarkHelper = AssetConversionTxHelper;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
@@ -920,8 +925,8 @@ pub type Block = generic::Block<Header, UncheckedExtrinsic>;
|
||||
pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The extension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -933,7 +938,7 @@ pub type SignedExtra = (
|
||||
);
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
|
||||
/// Migrations to apply on runtime upgrade.
|
||||
pub type Migrations = (
|
||||
@@ -1065,14 +1070,77 @@ pub type Executive = frame_executive::Executive<
|
||||
Migrations,
|
||||
>;
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
pub struct AssetConversionTxHelper;
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
impl
|
||||
pallet_asset_conversion_tx_payment::BenchmarkHelperTrait<
|
||||
AccountId,
|
||||
xcm::v3::MultiLocation,
|
||||
xcm::v3::MultiLocation,
|
||||
> for AssetConversionTxHelper
|
||||
{
|
||||
fn create_asset_id_parameter(seed: u32) -> (xcm::v3::MultiLocation, xcm::v3::MultiLocation) {
|
||||
// Use a different parachain' foreign assets pallet so that the asset is indeed foreign.
|
||||
let asset_id = xcm::v3::MultiLocation::new(
|
||||
1,
|
||||
xcm::v3::Junctions::X3(
|
||||
xcm::v3::Junction::Parachain(3000),
|
||||
xcm::v3::Junction::PalletInstance(53),
|
||||
xcm::v3::Junction::GeneralIndex(seed.into()),
|
||||
),
|
||||
);
|
||||
(asset_id, asset_id)
|
||||
}
|
||||
|
||||
fn setup_balances_and_pool(asset_id: xcm::v3::MultiLocation, account: AccountId) {
|
||||
use frame_support::{assert_ok, traits::fungibles::Mutate};
|
||||
assert_ok!(ForeignAssets::force_create(
|
||||
RuntimeOrigin::root(),
|
||||
asset_id.into(),
|
||||
account.clone().into(), /* owner */
|
||||
true, /* is_sufficient */
|
||||
1,
|
||||
));
|
||||
|
||||
let lp_provider = account.clone();
|
||||
use frame_support::traits::Currency;
|
||||
let _ = Balances::deposit_creating(&lp_provider, u64::MAX.into());
|
||||
assert_ok!(ForeignAssets::mint_into(asset_id.into(), &lp_provider, u64::MAX.into()));
|
||||
|
||||
let token_native = Box::new(xcm::v3::MultiLocation::new(1, xcm::v3::Junctions::Here));
|
||||
let token_second = Box::new(asset_id);
|
||||
|
||||
assert_ok!(AssetConversion::create_pool(
|
||||
RuntimeOrigin::signed(lp_provider.clone()),
|
||||
token_native.clone(),
|
||||
token_second.clone()
|
||||
));
|
||||
|
||||
assert_ok!(AssetConversion::add_liquidity(
|
||||
RuntimeOrigin::signed(lp_provider.clone()),
|
||||
token_native,
|
||||
token_second,
|
||||
(u32::MAX / 2).into(), // 1 desired
|
||||
u32::MAX.into(), // 2 desired
|
||||
1, // 1 min
|
||||
1, // 2 min
|
||||
lp_provider,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
mod benches {
|
||||
frame_benchmarking::define_benchmarks!(
|
||||
[frame_system, SystemBench::<Runtime>]
|
||||
[frame_system_extensions, SystemExtensionsBench::<Runtime>]
|
||||
[pallet_assets, Local]
|
||||
[pallet_assets, Foreign]
|
||||
[pallet_assets, Pool]
|
||||
[pallet_asset_conversion, AssetConversion]
|
||||
[pallet_asset_conversion_tx_payment, AssetTxPayment]
|
||||
[pallet_balances, Balances]
|
||||
[pallet_message_queue, MessageQueue]
|
||||
[pallet_multisig, Multisig]
|
||||
@@ -1083,6 +1151,7 @@ mod benches {
|
||||
[pallet_uniques, Uniques]
|
||||
[pallet_utility, Utility]
|
||||
[pallet_timestamp, Timestamp]
|
||||
[pallet_transaction_payment, TransactionPayment]
|
||||
[pallet_collator_selection, CollatorSelection]
|
||||
[cumulus_pallet_parachain_system, ParachainSystem]
|
||||
[cumulus_pallet_xcmp_queue, XcmpQueue]
|
||||
@@ -1379,6 +1448,7 @@ impl_runtime_apis! {
|
||||
use frame_benchmarking::{Benchmarking, BenchmarkList};
|
||||
use frame_support::traits::StorageInfoTrait;
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
use cumulus_pallet_session_benchmarking::Pallet as SessionBench;
|
||||
use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark;
|
||||
use pallet_xcm_bridge_hub_router::benchmarking::Pallet as XcmBridgeHubRouterBench;
|
||||
@@ -1413,6 +1483,7 @@ impl_runtime_apis! {
|
||||
use sp_storage::TrackedStorageKey;
|
||||
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
impl frame_system_benchmarking::Config for Runtime {
|
||||
fn setup_set_code_requirements(code: &sp_std::vec::Vec<u8>) -> Result<(), BenchmarkError> {
|
||||
ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32);
|
||||
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `frame_system_extensions`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=frame_system_extensions
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/
|
||||
// --chain=asset-hub-westend-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `frame_system_extensions`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> frame_system::ExtensionsWeightInfo for WeightInfo<T> {
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_genesis() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `54`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 3_206_000 picoseconds.
|
||||
Weight::from_parts(6_212_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_mortality() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `92`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 5_851_000 picoseconds.
|
||||
Weight::from_parts(8_847_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
fn check_non_zero_sender() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 631_000 picoseconds.
|
||||
Weight::from_parts(3_086_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_nonce() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 3_446_000 picoseconds.
|
||||
Weight::from_parts(5_911_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_spec_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 481_000 picoseconds.
|
||||
Weight::from_parts(2_916_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_tx_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 501_000 picoseconds.
|
||||
Weight::from_parts(2_595_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `System::AllExtrinsicsLen` (r:1 w:1)
|
||||
/// Proof: `System::AllExtrinsicsLen` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::BlockWeight` (r:1 w:1)
|
||||
/// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`)
|
||||
fn check_weight() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `24`
|
||||
// Estimated: `1533`
|
||||
// Minimum execution time: 3_927_000 picoseconds.
|
||||
Weight::from_parts(6_613_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 1533))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(2))
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,9 @@ pub mod cumulus_pallet_parachain_system;
|
||||
pub mod cumulus_pallet_xcmp_queue;
|
||||
pub mod extrinsic_weights;
|
||||
pub mod frame_system;
|
||||
pub mod frame_system_extensions;
|
||||
pub mod pallet_asset_conversion;
|
||||
pub mod pallet_asset_conversion_tx_payment;
|
||||
pub mod pallet_assets_foreign;
|
||||
pub mod pallet_assets_local;
|
||||
pub mod pallet_assets_pool;
|
||||
@@ -31,6 +33,7 @@ pub mod pallet_nfts;
|
||||
pub mod pallet_proxy;
|
||||
pub mod pallet_session;
|
||||
pub mod pallet_timestamp;
|
||||
pub mod pallet_transaction_payment;
|
||||
pub mod pallet_uniques;
|
||||
pub mod pallet_utility;
|
||||
pub mod pallet_xcm;
|
||||
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `pallet_asset_conversion_tx_payment`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2024-01-04, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `Georges-MacBook-Pro.local`, CPU: `<UNKNOWN>`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/debug/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=pallet_asset_conversion_tx_payment
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/
|
||||
// --chain=asset-hub-westend-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `pallet_asset_conversion_tx_payment`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> pallet_asset_conversion_tx_payment::WeightInfo for WeightInfo<T> {
|
||||
fn charge_asset_tx_payment_zero() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 8_000_000 picoseconds.
|
||||
Weight::from_parts(9_000_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:1 w:0)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_asset_tx_payment_native() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `4`
|
||||
// Estimated: `3593`
|
||||
// Minimum execution time: 214_000_000 picoseconds.
|
||||
Weight::from_parts(219_000_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3593))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
}
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `ForeignAssets::Asset` (r:1 w:1)
|
||||
/// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`)
|
||||
/// Storage: `ForeignAssets::Account` (r:2 w:2)
|
||||
/// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:2 w:1)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_asset_tx_payment_asset() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `631`
|
||||
// Estimated: `7404`
|
||||
// Minimum execution time: 1_211_000_000 picoseconds.
|
||||
Weight::from_parts(1_243_000_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 7404))
|
||||
.saturating_add(T::DbWeight::get().reads(6))
|
||||
.saturating_add(T::DbWeight::get().writes(4))
|
||||
}
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `pallet_transaction_payment`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=pallet_transaction_payment
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/
|
||||
// --chain=asset-hub-westend-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `pallet_transaction_payment`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> pallet_transaction_payment::WeightInfo for WeightInfo<T> {
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:1 w:1)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_transaction_payment() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `4`
|
||||
// Estimated: `3593`
|
||||
// Minimum execution time: 40_847_000 picoseconds.
|
||||
Weight::from_parts(49_674_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3593))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(1))
|
||||
}
|
||||
}
|
||||
@@ -242,6 +242,7 @@ runtime-benchmarks = [
|
||||
"pallet-message-queue/runtime-benchmarks",
|
||||
"pallet-multisig/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"pallet-xcm-benchmarks/runtime-benchmarks",
|
||||
"pallet-xcm-bridge-hub/runtime-benchmarks",
|
||||
|
||||
+2
-2
@@ -40,7 +40,7 @@ use bridge_runtime_common::{
|
||||
XcmBlobMessageDispatch, XcmVersionOfDestAndRemoteBridge,
|
||||
},
|
||||
refund_relayer_extension::{
|
||||
ActualFeeRefund, RefundBridgedGrandpaMessages, RefundSignedExtensionAdapter,
|
||||
ActualFeeRefund, RefundBridgedGrandpaMessages, RefundTransactionExtensionAdapter,
|
||||
RefundableMessagesLane,
|
||||
},
|
||||
};
|
||||
@@ -168,7 +168,7 @@ impl messages::BridgedChainWithMessages for RococoBulletin {}
|
||||
|
||||
/// Signed extension that refunds relayers that are delivering messages from the Rococo Bulletin
|
||||
/// chain.
|
||||
pub type OnBridgeHubRococoRefundRococoBulletinMessages = RefundSignedExtensionAdapter<
|
||||
pub type OnBridgeHubRococoRefundRococoBulletinMessages = RefundTransactionExtensionAdapter<
|
||||
RefundBridgedGrandpaMessages<
|
||||
Runtime,
|
||||
BridgeGrandpaRococoBulletinInstance,
|
||||
|
||||
+2
-2
@@ -39,7 +39,7 @@ use bridge_runtime_common::{
|
||||
XcmBlobMessageDispatch, XcmVersionOfDestAndRemoteBridge,
|
||||
},
|
||||
refund_relayer_extension::{
|
||||
ActualFeeRefund, RefundBridgedParachainMessages, RefundSignedExtensionAdapter,
|
||||
ActualFeeRefund, RefundBridgedParachainMessages, RefundTransactionExtensionAdapter,
|
||||
RefundableMessagesLane, RefundableParachain,
|
||||
},
|
||||
};
|
||||
@@ -173,7 +173,7 @@ impl UnderlyingChainProvider for BridgeHubWestend {
|
||||
impl messages::BridgedChainWithMessages for BridgeHubWestend {}
|
||||
|
||||
/// Signed extension that refunds relayers that are delivering messages from the Westend parachain.
|
||||
pub type OnBridgeHubRococoRefundBridgeHubWestendMessages = RefundSignedExtensionAdapter<
|
||||
pub type OnBridgeHubRococoRefundBridgeHubWestendMessages = RefundTransactionExtensionAdapter<
|
||||
RefundBridgedParachainMessages<
|
||||
Runtime,
|
||||
RefundableParachain<
|
||||
|
||||
@@ -115,8 +115,8 @@ pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The TransactionExtension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -134,7 +134,7 @@ pub type SignedExtra = (
|
||||
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
|
||||
/// Migrations to apply on runtime upgrade.
|
||||
pub type Migrations = (
|
||||
@@ -262,6 +262,8 @@ impl frame_system::Config for Runtime {
|
||||
type DbWeight = RocksDbWeight;
|
||||
/// Weight information for the extrinsics of this pallet.
|
||||
type SystemWeightInfo = weights::frame_system::WeightInfo<Runtime>;
|
||||
/// Weight information for the extensions of this pallet.
|
||||
type ExtensionsWeightInfo = weights::frame_system_extensions::WeightInfo<Runtime>;
|
||||
/// Block & extrinsics weights: base values and limits.
|
||||
type BlockWeights = RuntimeBlockWeights;
|
||||
/// The maximum length of a block (in bytes).
|
||||
@@ -324,6 +326,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type WeightToFee = WeightToFee;
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type WeightInfo = weights::pallet_transaction_payment::WeightInfo<Runtime>;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
@@ -759,12 +762,14 @@ bridge_runtime_common::generate_bridge_reject_obsolete_headers_and_messages! {
|
||||
mod benches {
|
||||
frame_benchmarking::define_benchmarks!(
|
||||
[frame_system, SystemBench::<Runtime>]
|
||||
[frame_system_extensions, SystemExtensionsBench::<Runtime>]
|
||||
[pallet_balances, Balances]
|
||||
[pallet_message_queue, MessageQueue]
|
||||
[pallet_multisig, Multisig]
|
||||
[pallet_session, SessionBench::<Runtime>]
|
||||
[pallet_utility, Utility]
|
||||
[pallet_timestamp, Timestamp]
|
||||
[pallet_transaction_payment, TransactionPayment]
|
||||
[pallet_collator_selection, CollatorSelection]
|
||||
[cumulus_pallet_parachain_system, ParachainSystem]
|
||||
[cumulus_pallet_xcmp_queue, XcmpQueue]
|
||||
@@ -1065,6 +1070,7 @@ impl_runtime_apis! {
|
||||
use frame_benchmarking::{Benchmarking, BenchmarkList};
|
||||
use frame_support::traits::StorageInfoTrait;
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
use cumulus_pallet_session_benchmarking::Pallet as SessionBench;
|
||||
use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark;
|
||||
|
||||
@@ -1095,6 +1101,7 @@ impl_runtime_apis! {
|
||||
use sp_storage::TrackedStorageKey;
|
||||
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
impl frame_system_benchmarking::Config for Runtime {
|
||||
fn setup_set_code_requirements(code: &sp_std::vec::Vec<u8>) -> Result<(), BenchmarkError> {
|
||||
ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32);
|
||||
@@ -1478,16 +1485,16 @@ mod tests {
|
||||
use codec::Encode;
|
||||
use sp_runtime::{
|
||||
generic::Era,
|
||||
traits::{SignedExtension, Zero},
|
||||
traits::{TransactionExtensionBase, Zero},
|
||||
};
|
||||
|
||||
#[test]
|
||||
fn ensure_signed_extension_definition_is_compatible_with_relay() {
|
||||
use bp_polkadot_core::SuffixedCommonSignedExtensionExt;
|
||||
use bp_polkadot_core::SuffixedCommonTransactionExtensionExt;
|
||||
|
||||
sp_io::TestExternalities::default().execute_with(|| {
|
||||
frame_system::BlockHash::<Runtime>::insert(BlockNumber::zero(), Hash::default());
|
||||
let payload: SignedExtra = (
|
||||
let payload: TxExtension = (
|
||||
frame_system::CheckNonZeroSender::new(),
|
||||
frame_system::CheckSpecVersion::new(),
|
||||
frame_system::CheckTxVersion::new(),
|
||||
@@ -1501,11 +1508,11 @@ mod tests {
|
||||
bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages::default(),
|
||||
bridge_to_bulletin_config::OnBridgeHubRococoRefundRococoBulletinMessages::default(),
|
||||
)
|
||||
);
|
||||
).into();
|
||||
|
||||
// for BridgeHubRococo
|
||||
{
|
||||
let bhr_indirect_payload = bp_bridge_hub_rococo::SignedExtension::from_params(
|
||||
let bhr_indirect_payload = bp_bridge_hub_rococo::TransactionExtension::from_params(
|
||||
VERSION.spec_version,
|
||||
VERSION.transaction_version,
|
||||
bp_runtime::TransactionEra::Immortal,
|
||||
@@ -1516,8 +1523,8 @@ mod tests {
|
||||
);
|
||||
assert_eq!(payload.encode(), bhr_indirect_payload.encode());
|
||||
assert_eq!(
|
||||
payload.additional_signed().unwrap().encode(),
|
||||
bhr_indirect_payload.additional_signed().unwrap().encode()
|
||||
payload.implicit().unwrap().encode(),
|
||||
bhr_indirect_payload.implicit().unwrap().encode()
|
||||
)
|
||||
}
|
||||
});
|
||||
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `frame_system_extensions`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=frame_system_extensions
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/
|
||||
// --chain=bridge-hub-rococo-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `frame_system_extensions`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> frame_system::ExtensionsWeightInfo for WeightInfo<T> {
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_genesis() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `54`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 3_136_000 picoseconds.
|
||||
Weight::from_parts(5_842_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_mortality() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `92`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 5_771_000 picoseconds.
|
||||
Weight::from_parts(8_857_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
fn check_non_zero_sender() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 732_000 picoseconds.
|
||||
Weight::from_parts(2_875_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_nonce() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 3_627_000 picoseconds.
|
||||
Weight::from_parts(6_322_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_spec_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 471_000 picoseconds.
|
||||
Weight::from_parts(2_455_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_tx_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 491_000 picoseconds.
|
||||
Weight::from_parts(2_916_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `System::AllExtrinsicsLen` (r:1 w:1)
|
||||
/// Proof: `System::AllExtrinsicsLen` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::BlockWeight` (r:1 w:1)
|
||||
/// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`)
|
||||
fn check_weight() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `24`
|
||||
// Estimated: `1533`
|
||||
// Minimum execution time: 3_798_000 picoseconds.
|
||||
Weight::from_parts(6_272_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 1533))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(2))
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,7 @@ pub mod cumulus_pallet_parachain_system;
|
||||
pub mod cumulus_pallet_xcmp_queue;
|
||||
pub mod extrinsic_weights;
|
||||
pub mod frame_system;
|
||||
pub mod frame_system_extensions;
|
||||
pub mod pallet_balances;
|
||||
pub mod pallet_bridge_grandpa;
|
||||
pub mod pallet_bridge_messages_rococo_to_rococo_bulletin;
|
||||
@@ -36,6 +37,7 @@ pub mod pallet_message_queue;
|
||||
pub mod pallet_multisig;
|
||||
pub mod pallet_session;
|
||||
pub mod pallet_timestamp;
|
||||
pub mod pallet_transaction_payment;
|
||||
pub mod pallet_utility;
|
||||
pub mod pallet_xcm;
|
||||
pub mod paritydb_weights;
|
||||
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `pallet_transaction_payment`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=pallet_transaction_payment
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/
|
||||
// --chain=bridge-hub-rococo-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `pallet_transaction_payment`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> pallet_transaction_payment::WeightInfo for WeightInfo<T> {
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:1 w:1)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_transaction_payment() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `3`
|
||||
// Estimated: `3593`
|
||||
// Minimum execution time: 34_956_000 picoseconds.
|
||||
Weight::from_parts(40_788_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3593))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(1))
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@ use bridge_hub_rococo_runtime::{
|
||||
bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages,
|
||||
xcm_config::XcmConfig, AllPalletsWithoutSystem, BridgeRejectObsoleteHeadersAndMessages,
|
||||
Executive, MessageQueueServiceWeight, Runtime, RuntimeCall, RuntimeEvent, SessionKeys,
|
||||
SignedExtra, UncheckedExtrinsic,
|
||||
TxExtension, UncheckedExtrinsic,
|
||||
};
|
||||
use codec::{Decode, Encode};
|
||||
use cumulus_primitives_core::XcmError::{FailedToTransactAsset, NotHoldingFees};
|
||||
@@ -171,7 +171,7 @@ fn construct_extrinsic(
|
||||
call: RuntimeCall,
|
||||
) -> UncheckedExtrinsic {
|
||||
let account_id = AccountId32::from(sender.public());
|
||||
let extra: SignedExtra = (
|
||||
let tx_ext: TxExtension = (
|
||||
frame_system::CheckNonZeroSender::<Runtime>::new(),
|
||||
frame_system::CheckSpecVersion::<Runtime>::new(),
|
||||
frame_system::CheckTxVersion::<Runtime>::new(),
|
||||
@@ -188,13 +188,13 @@ fn construct_extrinsic(
|
||||
OnBridgeHubRococoRefundRococoBulletinMessages::default(),
|
||||
),
|
||||
);
|
||||
let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap();
|
||||
let payload = SignedPayload::new(call.clone(), tx_ext.clone()).unwrap();
|
||||
let signature = payload.using_encoded(|e| sender.sign(e));
|
||||
UncheckedExtrinsic::new_signed(
|
||||
call,
|
||||
account_id.into(),
|
||||
Signature::Sr25519(signature.clone()),
|
||||
extra,
|
||||
tx_ext,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ use bridge_hub_rococo_runtime::{
|
||||
xcm_config::{RelayNetwork, TokenLocation, XcmConfig},
|
||||
AllPalletsWithoutSystem, BridgeRejectObsoleteHeadersAndMessages, EthereumGatewayAddress,
|
||||
Executive, ExistentialDeposit, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall,
|
||||
RuntimeEvent, RuntimeOrigin, SessionKeys, SignedExtra, TransactionPayment, UncheckedExtrinsic,
|
||||
RuntimeEvent, RuntimeOrigin, SessionKeys, TransactionPayment, TxExtension, UncheckedExtrinsic,
|
||||
};
|
||||
use bridge_hub_test_utils::SlotDurations;
|
||||
use codec::{Decode, Encode};
|
||||
@@ -48,7 +48,7 @@ fn construct_extrinsic(
|
||||
call: RuntimeCall,
|
||||
) -> UncheckedExtrinsic {
|
||||
let account_id = AccountId32::from(sender.public());
|
||||
let extra: SignedExtra = (
|
||||
let tx_ext: TxExtension = (
|
||||
frame_system::CheckNonZeroSender::<Runtime>::new(),
|
||||
frame_system::CheckSpecVersion::<Runtime>::new(),
|
||||
frame_system::CheckTxVersion::<Runtime>::new(),
|
||||
@@ -64,14 +64,15 @@ fn construct_extrinsic(
|
||||
bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages::default(),
|
||||
bridge_to_bulletin_config::OnBridgeHubRococoRefundRococoBulletinMessages::default(),
|
||||
),
|
||||
);
|
||||
let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap();
|
||||
)
|
||||
.into();
|
||||
let payload = SignedPayload::new(call.clone(), tx_ext.clone()).unwrap();
|
||||
let signature = payload.using_encoded(|e| sender.sign(e));
|
||||
UncheckedExtrinsic::new_signed(
|
||||
call,
|
||||
account_id.into(),
|
||||
Signature::Sr25519(signature.clone()),
|
||||
extra,
|
||||
tx_ext,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -204,6 +204,7 @@ runtime-benchmarks = [
|
||||
"pallet-message-queue/runtime-benchmarks",
|
||||
"pallet-multisig/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"pallet-xcm-benchmarks/runtime-benchmarks",
|
||||
"pallet-xcm-bridge-hub/runtime-benchmarks",
|
||||
|
||||
+2
-2
@@ -36,7 +36,7 @@ use bridge_runtime_common::{
|
||||
XcmBlobMessageDispatch, XcmVersionOfDestAndRemoteBridge,
|
||||
},
|
||||
refund_relayer_extension::{
|
||||
ActualFeeRefund, RefundBridgedParachainMessages, RefundSignedExtensionAdapter,
|
||||
ActualFeeRefund, RefundBridgedParachainMessages, RefundTransactionExtensionAdapter,
|
||||
RefundableMessagesLane, RefundableParachain,
|
||||
},
|
||||
};
|
||||
@@ -190,7 +190,7 @@ impl ThisChainWithMessages for BridgeHubWestend {
|
||||
}
|
||||
|
||||
/// Signed extension that refunds relayers that are delivering messages from the Rococo parachain.
|
||||
pub type OnBridgeHubWestendRefundBridgeHubRococoMessages = RefundSignedExtensionAdapter<
|
||||
pub type OnBridgeHubWestendRefundBridgeHubRococoMessages = RefundTransactionExtensionAdapter<
|
||||
RefundBridgedParachainMessages<
|
||||
Runtime,
|
||||
RefundableParachain<BridgeParachainRococoInstance, bp_bridge_hub_rococo::BridgeHubRococo>,
|
||||
|
||||
@@ -97,8 +97,8 @@ pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The TransactionExtension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -113,7 +113,7 @@ pub type SignedExtra = (
|
||||
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
|
||||
/// Migrations to apply on runtime upgrade.
|
||||
pub type Migrations = (
|
||||
@@ -298,6 +298,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type WeightToFee = WeightToFee;
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type WeightInfo = weights::pallet_transaction_payment::WeightInfo<Runtime>;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
@@ -515,12 +516,14 @@ bridge_runtime_common::generate_bridge_reject_obsolete_headers_and_messages! {
|
||||
mod benches {
|
||||
frame_benchmarking::define_benchmarks!(
|
||||
[frame_system, SystemBench::<Runtime>]
|
||||
[frame_system_extensions, SystemExtensionsBench::<Runtime>]
|
||||
[pallet_balances, Balances]
|
||||
[pallet_message_queue, MessageQueue]
|
||||
[pallet_multisig, Multisig]
|
||||
[pallet_session, SessionBench::<Runtime>]
|
||||
[pallet_utility, Utility]
|
||||
[pallet_timestamp, Timestamp]
|
||||
[pallet_transaction_payment, TransactionPayment]
|
||||
[pallet_collator_selection, CollatorSelection]
|
||||
[cumulus_pallet_parachain_system, ParachainSystem]
|
||||
[cumulus_pallet_xcmp_queue, XcmpQueue]
|
||||
@@ -761,6 +764,7 @@ impl_runtime_apis! {
|
||||
use frame_benchmarking::{Benchmarking, BenchmarkList};
|
||||
use frame_support::traits::StorageInfoTrait;
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
use cumulus_pallet_session_benchmarking::Pallet as SessionBench;
|
||||
use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark;
|
||||
|
||||
@@ -790,6 +794,7 @@ impl_runtime_apis! {
|
||||
use sp_storage::TrackedStorageKey;
|
||||
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
impl frame_system_benchmarking::Config for Runtime {
|
||||
fn setup_set_code_requirements(code: &sp_std::vec::Vec<u8>) -> Result<(), BenchmarkError> {
|
||||
ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32);
|
||||
@@ -1135,16 +1140,16 @@ mod tests {
|
||||
use codec::Encode;
|
||||
use sp_runtime::{
|
||||
generic::Era,
|
||||
traits::{SignedExtension, Zero},
|
||||
traits::{TransactionExtensionBase, Zero},
|
||||
};
|
||||
|
||||
#[test]
|
||||
fn ensure_signed_extension_definition_is_compatible_with_relay() {
|
||||
use bp_polkadot_core::SuffixedCommonSignedExtensionExt;
|
||||
use bp_polkadot_core::SuffixedCommonTransactionExtensionExt;
|
||||
|
||||
sp_io::TestExternalities::default().execute_with(|| {
|
||||
frame_system::BlockHash::<Runtime>::insert(BlockNumber::zero(), Hash::default());
|
||||
let payload: SignedExtra = (
|
||||
let payload: TxExtension = (
|
||||
frame_system::CheckNonZeroSender::new(),
|
||||
frame_system::CheckSpecVersion::new(),
|
||||
frame_system::CheckTxVersion::new(),
|
||||
@@ -1157,10 +1162,10 @@ mod tests {
|
||||
(
|
||||
bridge_to_rococo_config::OnBridgeHubWestendRefundBridgeHubRococoMessages::default(),
|
||||
),
|
||||
);
|
||||
).into();
|
||||
|
||||
{
|
||||
let bh_indirect_payload = bp_bridge_hub_westend::SignedExtension::from_params(
|
||||
let bh_indirect_payload = bp_bridge_hub_westend::TransactionExtension::from_params(
|
||||
VERSION.spec_version,
|
||||
VERSION.transaction_version,
|
||||
bp_runtime::TransactionEra::Immortal,
|
||||
@@ -1171,8 +1176,8 @@ mod tests {
|
||||
);
|
||||
assert_eq!(payload.encode(), bh_indirect_payload.encode());
|
||||
assert_eq!(
|
||||
payload.additional_signed().unwrap().encode(),
|
||||
bh_indirect_payload.additional_signed().unwrap().encode()
|
||||
payload.implicit().unwrap().encode(),
|
||||
bh_indirect_payload.implicit().unwrap().encode()
|
||||
)
|
||||
}
|
||||
});
|
||||
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `frame_system_extensions`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=frame_system_extensions
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/
|
||||
// --chain=bridge-hub-westend-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `frame_system_extensions`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> frame_system::ExtensionsWeightInfo for WeightInfo<T> {
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_genesis() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `54`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 3_166_000 picoseconds.
|
||||
Weight::from_parts(6_021_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_mortality() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `92`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 5_651_000 picoseconds.
|
||||
Weight::from_parts(9_177_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
fn check_non_zero_sender() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 601_000 picoseconds.
|
||||
Weight::from_parts(2_805_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_nonce() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 3_727_000 picoseconds.
|
||||
Weight::from_parts(6_051_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_spec_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 471_000 picoseconds.
|
||||
Weight::from_parts(2_494_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_tx_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 521_000 picoseconds.
|
||||
Weight::from_parts(2_655_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `System::AllExtrinsicsLen` (r:1 w:1)
|
||||
/// Proof: `System::AllExtrinsicsLen` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::BlockWeight` (r:1 w:1)
|
||||
/// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`)
|
||||
fn check_weight() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `24`
|
||||
// Estimated: `1533`
|
||||
// Minimum execution time: 3_808_000 picoseconds.
|
||||
Weight::from_parts(6_402_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 1533))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(2))
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,7 @@ pub mod cumulus_pallet_parachain_system;
|
||||
pub mod cumulus_pallet_xcmp_queue;
|
||||
pub mod extrinsic_weights;
|
||||
pub mod frame_system;
|
||||
pub mod frame_system_extensions;
|
||||
pub mod pallet_balances;
|
||||
pub mod pallet_bridge_grandpa;
|
||||
pub mod pallet_bridge_messages;
|
||||
@@ -35,6 +36,7 @@ pub mod pallet_message_queue;
|
||||
pub mod pallet_multisig;
|
||||
pub mod pallet_session;
|
||||
pub mod pallet_timestamp;
|
||||
pub mod pallet_transaction_payment;
|
||||
pub mod pallet_utility;
|
||||
pub mod pallet_xcm;
|
||||
pub mod paritydb_weights;
|
||||
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `pallet_transaction_payment`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=pallet_transaction_payment
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/
|
||||
// --chain=bridge-hub-westend-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `pallet_transaction_payment`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> pallet_transaction_payment::WeightInfo for WeightInfo<T> {
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:1 w:1)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_transaction_payment() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `3`
|
||||
// Estimated: `3593`
|
||||
// Minimum execution time: 40_286_000 picoseconds.
|
||||
Weight::from_parts(45_816_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3593))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(1))
|
||||
}
|
||||
}
|
||||
@@ -24,7 +24,7 @@ use bridge_hub_westend_runtime::{
|
||||
xcm_config::{RelayNetwork, WestendLocation, XcmConfig},
|
||||
AllPalletsWithoutSystem, BridgeRejectObsoleteHeadersAndMessages, Executive, ExistentialDeposit,
|
||||
ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, SessionKeys,
|
||||
SignedExtra, TransactionPayment, UncheckedExtrinsic,
|
||||
TransactionPayment, TxExtension, UncheckedExtrinsic,
|
||||
};
|
||||
use bridge_to_rococo_config::{
|
||||
BridgeGrandpaRococoInstance, BridgeHubRococoChainId, BridgeHubRococoLocation,
|
||||
@@ -65,7 +65,7 @@ fn construct_extrinsic(
|
||||
call: RuntimeCall,
|
||||
) -> UncheckedExtrinsic {
|
||||
let account_id = AccountId32::from(sender.public());
|
||||
let extra: SignedExtra = (
|
||||
let tx_ext: TxExtension = (
|
||||
frame_system::CheckNonZeroSender::<Runtime>::new(),
|
||||
frame_system::CheckSpecVersion::<Runtime>::new(),
|
||||
frame_system::CheckTxVersion::<Runtime>::new(),
|
||||
@@ -78,14 +78,15 @@ fn construct_extrinsic(
|
||||
pallet_transaction_payment::ChargeTransactionPayment::<Runtime>::from(0),
|
||||
BridgeRejectObsoleteHeadersAndMessages::default(),
|
||||
(bridge_to_rococo_config::OnBridgeHubWestendRefundBridgeHubRococoMessages::default(),),
|
||||
);
|
||||
let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap();
|
||||
)
|
||||
.into();
|
||||
let payload = SignedPayload::new(call.clone(), tx_ext.clone()).unwrap();
|
||||
let signature = payload.using_encoded(|e| sender.sign(e));
|
||||
UncheckedExtrinsic::new_signed(
|
||||
call,
|
||||
account_id.into(),
|
||||
Signature::Sr25519(signature.clone()),
|
||||
extra,
|
||||
tx_ext,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -117,6 +117,7 @@ runtime-benchmarks = [
|
||||
"pallet-salary/runtime-benchmarks",
|
||||
"pallet-scheduler/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-treasury/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
|
||||
@@ -175,6 +175,7 @@ impl frame_system::Config for Runtime {
|
||||
type Version = Version;
|
||||
type AccountData = pallet_balances::AccountData<Balance>;
|
||||
type SystemWeightInfo = weights::frame_system::WeightInfo<Runtime>;
|
||||
type ExtensionsWeightInfo = weights::frame_system_extensions::WeightInfo<Runtime>;
|
||||
type SS58Prefix = ConstU16<0>;
|
||||
type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;
|
||||
type MaxConsumers = frame_support::traits::ConstU32<16>;
|
||||
@@ -231,6 +232,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type OperationalFeeMultiplier = ConstU8<5>;
|
||||
type WeightInfo = weights::pallet_transaction_payment::WeightInfo<Runtime>;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
@@ -707,8 +709,8 @@ pub type Block = generic::Block<Header, UncheckedExtrinsic>;
|
||||
pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The extension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -719,7 +721,7 @@ pub type SignedExtra = (
|
||||
);
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
/// All migrations executed on runtime upgrade as a nested tuple of types implementing
|
||||
/// `OnRuntimeUpgrade`. Included migrations must be idempotent.
|
||||
type Migrations = (
|
||||
@@ -745,6 +747,7 @@ pub type Executive = frame_executive::Executive<
|
||||
mod benches {
|
||||
frame_benchmarking::define_benchmarks!(
|
||||
[frame_system, SystemBench::<Runtime>]
|
||||
[frame_system_extensions, SystemExtensionsBench::<Runtime>]
|
||||
[pallet_balances, Balances]
|
||||
[pallet_message_queue, MessageQueue]
|
||||
[pallet_multisig, Multisig]
|
||||
@@ -752,6 +755,7 @@ mod benches {
|
||||
[pallet_session, SessionBench::<Runtime>]
|
||||
[pallet_utility, Utility]
|
||||
[pallet_timestamp, Timestamp]
|
||||
[pallet_transaction_payment, TransactionPayment]
|
||||
[pallet_collator_selection, CollatorSelection]
|
||||
[cumulus_pallet_parachain_system, ParachainSystem]
|
||||
[cumulus_pallet_xcmp_queue, XcmpQueue]
|
||||
@@ -955,6 +959,7 @@ impl_runtime_apis! {
|
||||
use frame_benchmarking::{Benchmarking, BenchmarkList};
|
||||
use frame_support::traits::StorageInfoTrait;
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
use cumulus_pallet_session_benchmarking::Pallet as SessionBench;
|
||||
use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark;
|
||||
|
||||
@@ -972,6 +977,7 @@ impl_runtime_apis! {
|
||||
use sp_storage::TrackedStorageKey;
|
||||
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
impl frame_system_benchmarking::Config for Runtime {
|
||||
fn setup_set_code_requirements(code: &sp_std::vec::Vec<u8>) -> Result<(), BenchmarkError> {
|
||||
ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32);
|
||||
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `frame_system_extensions`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-westend-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=frame_system_extensions
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/
|
||||
// --chain=collectives-westend-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `frame_system_extensions`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> frame_system::ExtensionsWeightInfo for WeightInfo<T> {
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_genesis() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `54`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 3_497_000 picoseconds.
|
||||
Weight::from_parts(5_961_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_mortality() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `92`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 5_240_000 picoseconds.
|
||||
Weight::from_parts(8_175_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
fn check_non_zero_sender() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 671_000 picoseconds.
|
||||
Weight::from_parts(3_005_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_nonce() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 3_426_000 picoseconds.
|
||||
Weight::from_parts(6_131_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_spec_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 501_000 picoseconds.
|
||||
Weight::from_parts(2_715_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_tx_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 491_000 picoseconds.
|
||||
Weight::from_parts(2_635_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `System::AllExtrinsicsLen` (r:1 w:1)
|
||||
/// Proof: `System::AllExtrinsicsLen` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::BlockWeight` (r:1 w:1)
|
||||
/// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`)
|
||||
fn check_weight() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `24`
|
||||
// Estimated: `1533`
|
||||
// Minimum execution time: 3_958_000 picoseconds.
|
||||
Weight::from_parts(6_753_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 1533))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(2))
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,7 @@ pub mod cumulus_pallet_parachain_system;
|
||||
pub mod cumulus_pallet_xcmp_queue;
|
||||
pub mod extrinsic_weights;
|
||||
pub mod frame_system;
|
||||
pub mod frame_system_extensions;
|
||||
pub mod pallet_alliance;
|
||||
pub mod pallet_asset_rate;
|
||||
pub mod pallet_balances;
|
||||
@@ -39,6 +40,7 @@ pub mod pallet_salary_fellowship_salary;
|
||||
pub mod pallet_scheduler;
|
||||
pub mod pallet_session;
|
||||
pub mod pallet_timestamp;
|
||||
pub mod pallet_transaction_payment;
|
||||
pub mod pallet_treasury;
|
||||
pub mod pallet_utility;
|
||||
pub mod pallet_xcm;
|
||||
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `pallet_transaction_payment`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-westend-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=pallet_transaction_payment
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/
|
||||
// --chain=collectives-westend-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `pallet_transaction_payment`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> pallet_transaction_payment::WeightInfo for WeightInfo<T> {
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:1 w:1)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_transaction_payment() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `4`
|
||||
// Estimated: `3593`
|
||||
// Minimum execution time: 39_815_000 picoseconds.
|
||||
Weight::from_parts(46_067_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3593))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(1))
|
||||
}
|
||||
}
|
||||
@@ -158,6 +158,7 @@ runtime-benchmarks = [
|
||||
"pallet-multisig/runtime-benchmarks",
|
||||
"pallet-sudo/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
"parachains-common/runtime-benchmarks",
|
||||
|
||||
@@ -80,8 +80,8 @@ pub type Block = generic::Block<Header, UncheckedExtrinsic>;
|
||||
pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The extension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -93,7 +93,7 @@ pub type SignedExtra = (
|
||||
);
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
|
||||
/// Migrations to apply on runtime upgrade.
|
||||
pub type Migrations = (
|
||||
@@ -240,6 +240,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type OperationalFeeMultiplier = ConstU8<5>;
|
||||
type WeightInfo = pallet_transaction_payment::weights::SubstrateWeight<Runtime>;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
@@ -423,6 +424,7 @@ construct_runtime!(
|
||||
mod benches {
|
||||
frame_benchmarking::define_benchmarks!(
|
||||
[frame_system, SystemBench::<Runtime>]
|
||||
[frame_system_extensions, SystemExtensionsBench::<Runtime>]
|
||||
[pallet_balances, Balances]
|
||||
[pallet_message_queue, MessageQueue]
|
||||
[pallet_multisig, Multisig]
|
||||
@@ -686,6 +688,7 @@ impl_runtime_apis! {
|
||||
use frame_benchmarking::{Benchmarking, BenchmarkList};
|
||||
use frame_support::traits::StorageInfoTrait;
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
use cumulus_pallet_session_benchmarking::Pallet as SessionBench;
|
||||
use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark;
|
||||
|
||||
@@ -703,6 +706,7 @@ impl_runtime_apis! {
|
||||
use sp_storage::TrackedStorageKey;
|
||||
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
impl frame_system_benchmarking::Config for Runtime {
|
||||
fn setup_set_code_requirements(code: &sp_std::vec::Vec<u8>) -> Result<(), BenchmarkError> {
|
||||
ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32);
|
||||
|
||||
@@ -156,6 +156,7 @@ runtime-benchmarks = [
|
||||
"pallet-multisig/runtime-benchmarks",
|
||||
"pallet-sudo/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"pallet-xcm-benchmarks/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
|
||||
@@ -89,8 +89,8 @@ pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The TransactionExtension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -103,7 +103,7 @@ pub type SignedExtra = (
|
||||
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
|
||||
/// Migrations to apply on runtime upgrade.
|
||||
pub type Migrations = (
|
||||
@@ -192,6 +192,8 @@ impl frame_system::Config for Runtime {
|
||||
type DbWeight = RocksDbWeight;
|
||||
/// Weight information for the extrinsics of this pallet.
|
||||
type SystemWeightInfo = weights::frame_system::WeightInfo<Runtime>;
|
||||
/// Weight information for the extensions of this pallet.
|
||||
type ExtensionsWeightInfo = weights::frame_system_extensions::WeightInfo<Runtime>;
|
||||
/// Block & extrinsics weights: base values and limits.
|
||||
type BlockWeights = RuntimeBlockWeights;
|
||||
/// The maximum length of a block (in bytes).
|
||||
@@ -251,6 +253,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type WeightToFee = WeightToFee;
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type WeightInfo = weights::pallet_transaction_payment::WeightInfo<Runtime>;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `frame_system_extensions`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=frame_system_extensions
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/
|
||||
// --chain=coretime-rococo-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `frame_system_extensions`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> frame_system::ExtensionsWeightInfo for WeightInfo<T> {
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_genesis() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `54`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 3_637_000 picoseconds.
|
||||
Weight::from_parts(6_382_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_mortality() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `92`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 5_841_000 picoseconds.
|
||||
Weight::from_parts(8_776_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
fn check_non_zero_sender() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 561_000 picoseconds.
|
||||
Weight::from_parts(2_705_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_nonce() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 3_316_000 picoseconds.
|
||||
Weight::from_parts(5_771_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_spec_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 511_000 picoseconds.
|
||||
Weight::from_parts(2_575_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_tx_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 501_000 picoseconds.
|
||||
Weight::from_parts(2_595_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `System::AllExtrinsicsLen` (r:1 w:1)
|
||||
/// Proof: `System::AllExtrinsicsLen` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::BlockWeight` (r:1 w:1)
|
||||
/// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`)
|
||||
fn check_weight() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `24`
|
||||
// Estimated: `1533`
|
||||
// Minimum execution time: 3_687_000 picoseconds.
|
||||
Weight::from_parts(6_192_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 1533))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(2))
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,7 @@ pub mod cumulus_pallet_parachain_system;
|
||||
pub mod cumulus_pallet_xcmp_queue;
|
||||
pub mod extrinsic_weights;
|
||||
pub mod frame_system;
|
||||
pub mod frame_system_extensions;
|
||||
pub mod pallet_balances;
|
||||
pub mod pallet_broker;
|
||||
pub mod pallet_collator_selection;
|
||||
@@ -29,6 +30,7 @@ pub mod pallet_message_queue;
|
||||
pub mod pallet_multisig;
|
||||
pub mod pallet_session;
|
||||
pub mod pallet_timestamp;
|
||||
pub mod pallet_transaction_payment;
|
||||
pub mod pallet_utility;
|
||||
pub mod pallet_xcm;
|
||||
pub mod paritydb_weights;
|
||||
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `pallet_transaction_payment`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=pallet_transaction_payment
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/
|
||||
// --chain=coretime-rococo-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `pallet_transaction_payment`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> pallet_transaction_payment::WeightInfo for WeightInfo<T> {
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:1 w:1)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_transaction_payment() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `4`
|
||||
// Estimated: `3593`
|
||||
// Minimum execution time: 33_363_000 picoseconds.
|
||||
Weight::from_parts(38_793_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3593))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(1))
|
||||
}
|
||||
}
|
||||
@@ -153,6 +153,7 @@ runtime-benchmarks = [
|
||||
"pallet-message-queue/runtime-benchmarks",
|
||||
"pallet-multisig/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"pallet-xcm-benchmarks/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
|
||||
@@ -89,8 +89,8 @@ pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The TransactionExtension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -103,7 +103,7 @@ pub type SignedExtra = (
|
||||
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
|
||||
/// Migrations to apply on runtime upgrade.
|
||||
pub type Migrations = (
|
||||
@@ -192,6 +192,8 @@ impl frame_system::Config for Runtime {
|
||||
type DbWeight = RocksDbWeight;
|
||||
/// Weight information for the extrinsics of this pallet.
|
||||
type SystemWeightInfo = weights::frame_system::WeightInfo<Runtime>;
|
||||
/// Weight information for the extensions of this pallet.
|
||||
type ExtensionsWeightInfo = weights::frame_system_extensions::WeightInfo<Runtime>;
|
||||
/// Block & extrinsics weights: base values and limits.
|
||||
type BlockWeights = RuntimeBlockWeights;
|
||||
/// The maximum length of a block (in bytes).
|
||||
@@ -251,6 +253,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type WeightToFee = WeightToFee;
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type WeightInfo = weights::pallet_transaction_payment::WeightInfo<Runtime>;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `frame_system_extensions`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=frame_system_extensions
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/
|
||||
// --chain=coretime-westend-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `frame_system_extensions`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> frame_system::ExtensionsWeightInfo for WeightInfo<T> {
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_genesis() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `54`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 3_637_000 picoseconds.
|
||||
Weight::from_parts(6_382_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_mortality() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `92`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 5_841_000 picoseconds.
|
||||
Weight::from_parts(8_776_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
fn check_non_zero_sender() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 561_000 picoseconds.
|
||||
Weight::from_parts(2_705_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_nonce() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 3_316_000 picoseconds.
|
||||
Weight::from_parts(5_771_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_spec_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 511_000 picoseconds.
|
||||
Weight::from_parts(2_575_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_tx_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 501_000 picoseconds.
|
||||
Weight::from_parts(2_595_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `System::AllExtrinsicsLen` (r:1 w:1)
|
||||
/// Proof: `System::AllExtrinsicsLen` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::BlockWeight` (r:1 w:1)
|
||||
/// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`)
|
||||
fn check_weight() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `24`
|
||||
// Estimated: `1533`
|
||||
// Minimum execution time: 3_687_000 picoseconds.
|
||||
Weight::from_parts(6_192_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 1533))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(2))
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,7 @@ pub mod cumulus_pallet_parachain_system;
|
||||
pub mod cumulus_pallet_xcmp_queue;
|
||||
pub mod extrinsic_weights;
|
||||
pub mod frame_system;
|
||||
pub mod frame_system_extensions;
|
||||
pub mod pallet_balances;
|
||||
pub mod pallet_broker;
|
||||
pub mod pallet_collator_selection;
|
||||
@@ -29,6 +30,7 @@ pub mod pallet_message_queue;
|
||||
pub mod pallet_multisig;
|
||||
pub mod pallet_session;
|
||||
pub mod pallet_timestamp;
|
||||
pub mod pallet_transaction_payment;
|
||||
pub mod pallet_utility;
|
||||
pub mod pallet_xcm;
|
||||
pub mod paritydb_weights;
|
||||
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `pallet_transaction_payment`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=pallet_transaction_payment
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/
|
||||
// --chain=coretime-westend-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `pallet_transaction_payment`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> pallet_transaction_payment::WeightInfo for WeightInfo<T> {
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:1 w:1)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_transaction_payment() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `4`
|
||||
// Estimated: `3593`
|
||||
// Minimum execution time: 33_363_000 picoseconds.
|
||||
Weight::from_parts(38_793_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3593))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(1))
|
||||
}
|
||||
}
|
||||
@@ -289,8 +289,8 @@ pub type Block = generic::Block<Header, UncheckedExtrinsic>;
|
||||
pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The extension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
pallet_sudo::CheckOnlySudoAccount<Runtime>,
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
@@ -301,7 +301,7 @@ pub type SignedExtra = (
|
||||
);
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
/// Executive: handles dispatch to the various modules.
|
||||
pub type Executive = frame_executive::Executive<
|
||||
Runtime,
|
||||
@@ -316,6 +316,7 @@ mod benches {
|
||||
frame_benchmarking::define_benchmarks!(
|
||||
[cumulus_pallet_parachain_system, ParachainSystem]
|
||||
[frame_system, SystemBench::<Runtime>]
|
||||
[frame_system_extensions, SystemExtensionsBench::<Runtime>]
|
||||
[pallet_glutton, Glutton]
|
||||
[pallet_message_queue, MessageQueue]
|
||||
[pallet_timestamp, Timestamp]
|
||||
@@ -439,6 +440,7 @@ impl_runtime_apis! {
|
||||
use frame_benchmarking::{Benchmarking, BenchmarkList};
|
||||
use frame_support::traits::StorageInfoTrait;
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
|
||||
let mut list = Vec::<BenchmarkList>::new();
|
||||
list_benchmarks!(list, extra);
|
||||
@@ -455,6 +457,7 @@ impl_runtime_apis! {
|
||||
use sp_storage::TrackedStorageKey;
|
||||
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
impl frame_system_benchmarking::Config for Runtime {
|
||||
fn setup_set_code_requirements(code: &sp_std::vec::Vec<u8>) -> Result<(), BenchmarkError> {
|
||||
ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32);
|
||||
|
||||
+119
@@ -0,0 +1,119 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `frame_system_extensions`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("glutton-westend-dev-1300")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=frame_system_extensions
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/glutton/glutton-westend/src/weights/
|
||||
// --chain=glutton-westend-dev-1300
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `frame_system_extensions`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> frame_system::ExtensionsWeightInfo for WeightInfo<T> {
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_genesis() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `54`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 3_908_000 picoseconds.
|
||||
Weight::from_parts(4_007_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_mortality() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `92`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 5_510_000 picoseconds.
|
||||
Weight::from_parts(6_332_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
fn check_non_zero_sender() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 651_000 picoseconds.
|
||||
Weight::from_parts(851_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_nonce() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 3_387_000 picoseconds.
|
||||
Weight::from_parts(3_646_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_spec_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 491_000 picoseconds.
|
||||
Weight::from_parts(651_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_tx_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 451_000 picoseconds.
|
||||
Weight::from_parts(662_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `System::AllExtrinsicsLen` (r:1 w:1)
|
||||
/// Proof: `System::AllExtrinsicsLen` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
|
||||
fn check_weight() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `24`
|
||||
// Estimated: `1489`
|
||||
// Minimum execution time: 3_537_000 picoseconds.
|
||||
Weight::from_parts(4_208_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 1489))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
.saturating_add(T::DbWeight::get().writes(1))
|
||||
}
|
||||
}
|
||||
@@ -152,6 +152,7 @@ runtime-benchmarks = [
|
||||
"pallet-message-queue/runtime-benchmarks",
|
||||
"pallet-multisig/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"pallet-xcm-benchmarks/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
|
||||
@@ -83,8 +83,8 @@ pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The TransactionExtension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -97,7 +97,7 @@ pub type SignedExtra = (
|
||||
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
|
||||
/// Migrations to apply on runtime upgrade.
|
||||
pub type Migrations = (
|
||||
@@ -178,6 +178,7 @@ impl frame_system::Config for Runtime {
|
||||
type Version = Version;
|
||||
type AccountData = pallet_balances::AccountData<Balance>;
|
||||
type SystemWeightInfo = weights::frame_system::WeightInfo<Runtime>;
|
||||
type ExtensionsWeightInfo = weights::frame_system_extensions::WeightInfo<Runtime>;
|
||||
type SS58Prefix = SS58Prefix;
|
||||
type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;
|
||||
type MaxConsumers = ConstU32<16>;
|
||||
@@ -232,6 +233,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type WeightToFee = WeightToFee;
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type WeightInfo = weights::pallet_transaction_payment::WeightInfo<Runtime>;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
@@ -453,6 +455,7 @@ mod benches {
|
||||
[pallet_session, SessionBench::<Runtime>]
|
||||
[pallet_utility, Utility]
|
||||
[pallet_timestamp, Timestamp]
|
||||
[pallet_transaction_payment, TransactionPayment]
|
||||
// Polkadot
|
||||
[polkadot_runtime_common::identity_migrator, IdentityMigrator]
|
||||
// Cumulus
|
||||
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `frame_system_extensions`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("people-rococo-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=frame_system_extensions
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/people/people-rococo/src/weights/
|
||||
// --chain=people-rococo-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `frame_system_extensions`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> frame_system::ExtensionsWeightInfo for WeightInfo<T> {
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_genesis() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `54`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 3_637_000 picoseconds.
|
||||
Weight::from_parts(6_382_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_mortality() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `92`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 5_841_000 picoseconds.
|
||||
Weight::from_parts(8_776_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
fn check_non_zero_sender() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 561_000 picoseconds.
|
||||
Weight::from_parts(2_705_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_nonce() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 3_316_000 picoseconds.
|
||||
Weight::from_parts(5_771_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_spec_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 511_000 picoseconds.
|
||||
Weight::from_parts(2_575_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_tx_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 501_000 picoseconds.
|
||||
Weight::from_parts(2_595_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `System::AllExtrinsicsLen` (r:1 w:1)
|
||||
/// Proof: `System::AllExtrinsicsLen` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::BlockWeight` (r:1 w:1)
|
||||
/// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`)
|
||||
fn check_weight() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `24`
|
||||
// Estimated: `1533`
|
||||
// Minimum execution time: 3_687_000 picoseconds.
|
||||
Weight::from_parts(6_192_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 1533))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(2))
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ pub mod cumulus_pallet_parachain_system;
|
||||
pub mod cumulus_pallet_xcmp_queue;
|
||||
pub mod extrinsic_weights;
|
||||
pub mod frame_system;
|
||||
pub mod frame_system_extensions;
|
||||
pub mod pallet_balances;
|
||||
pub mod pallet_collator_selection;
|
||||
pub mod pallet_identity;
|
||||
@@ -27,6 +28,7 @@ pub mod pallet_message_queue;
|
||||
pub mod pallet_multisig;
|
||||
pub mod pallet_session;
|
||||
pub mod pallet_timestamp;
|
||||
pub mod pallet_transaction_payment;
|
||||
pub mod pallet_utility;
|
||||
pub mod pallet_xcm;
|
||||
pub mod paritydb_weights;
|
||||
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `pallet_transaction_payment`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("people-rococo-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=pallet_transaction_payment
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/people/people-rococo/src/weights/
|
||||
// --chain=people-rococo-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `pallet_transaction_payment`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> pallet_transaction_payment::WeightInfo for WeightInfo<T> {
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:1 w:1)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_transaction_payment() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `4`
|
||||
// Estimated: `3593`
|
||||
// Minimum execution time: 33_363_000 picoseconds.
|
||||
Weight::from_parts(38_793_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3593))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(1))
|
||||
}
|
||||
}
|
||||
@@ -152,6 +152,7 @@ runtime-benchmarks = [
|
||||
"pallet-message-queue/runtime-benchmarks",
|
||||
"pallet-multisig/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-utility/runtime-benchmarks",
|
||||
"pallet-xcm-benchmarks/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
|
||||
@@ -83,8 +83,8 @@ pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The transactionExtension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -97,7 +97,7 @@ pub type SignedExtra = (
|
||||
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
|
||||
/// Migrations to apply on runtime upgrade.
|
||||
pub type Migrations = (
|
||||
@@ -178,6 +178,7 @@ impl frame_system::Config for Runtime {
|
||||
type Version = Version;
|
||||
type AccountData = pallet_balances::AccountData<Balance>;
|
||||
type SystemWeightInfo = weights::frame_system::WeightInfo<Runtime>;
|
||||
type ExtensionsWeightInfo = weights::frame_system_extensions::WeightInfo<Runtime>;
|
||||
type SS58Prefix = SS58Prefix;
|
||||
type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;
|
||||
type MaxConsumers = ConstU32<16>;
|
||||
@@ -232,6 +233,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type WeightToFee = WeightToFee;
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type WeightInfo = weights::pallet_transaction_payment::WeightInfo<Runtime>;
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `frame_system_extensions`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("people-westend-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=frame_system_extensions
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/people/people-westend/src/weights/
|
||||
// --chain=people-westend-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `frame_system_extensions`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> frame_system::ExtensionsWeightInfo for WeightInfo<T> {
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_genesis() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `54`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 3_637_000 picoseconds.
|
||||
Weight::from_parts(6_382_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
/// Storage: `System::BlockHash` (r:1 w:0)
|
||||
/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`)
|
||||
fn check_mortality() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `92`
|
||||
// Estimated: `3509`
|
||||
// Minimum execution time: 5_841_000 picoseconds.
|
||||
Weight::from_parts(8_776_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3509))
|
||||
.saturating_add(T::DbWeight::get().reads(1))
|
||||
}
|
||||
fn check_non_zero_sender() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 561_000 picoseconds.
|
||||
Weight::from_parts(2_705_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_nonce() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 3_316_000 picoseconds.
|
||||
Weight::from_parts(5_771_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_spec_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 511_000 picoseconds.
|
||||
Weight::from_parts(2_575_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
fn check_tx_version() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 501_000 picoseconds.
|
||||
Weight::from_parts(2_595_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 0))
|
||||
}
|
||||
/// Storage: `System::AllExtrinsicsLen` (r:1 w:1)
|
||||
/// Proof: `System::AllExtrinsicsLen` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::BlockWeight` (r:1 w:1)
|
||||
/// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`)
|
||||
fn check_weight() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `24`
|
||||
// Estimated: `1533`
|
||||
// Minimum execution time: 3_687_000 picoseconds.
|
||||
Weight::from_parts(6_192_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 1533))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(2))
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ pub mod cumulus_pallet_parachain_system;
|
||||
pub mod cumulus_pallet_xcmp_queue;
|
||||
pub mod extrinsic_weights;
|
||||
pub mod frame_system;
|
||||
pub mod frame_system_extensions;
|
||||
pub mod pallet_balances;
|
||||
pub mod pallet_collator_selection;
|
||||
pub mod pallet_identity;
|
||||
@@ -27,6 +28,7 @@ pub mod pallet_message_queue;
|
||||
pub mod pallet_multisig;
|
||||
pub mod pallet_session;
|
||||
pub mod pallet_timestamp;
|
||||
pub mod pallet_transaction_payment;
|
||||
pub mod pallet_utility;
|
||||
pub mod pallet_xcm;
|
||||
pub mod paritydb_weights;
|
||||
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Cumulus is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for `pallet_transaction_payment`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-12-21, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `gleipnir`, CPU: `AMD Ryzen 9 7900X 12-Core Processor`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("people-westend-dev")`, DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// ./target/release/polkadot-parachain
|
||||
// benchmark
|
||||
// pallet
|
||||
// --wasm-execution=compiled
|
||||
// --pallet=pallet_transaction_payment
|
||||
// --no-storage-info
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --steps=2
|
||||
// --repeat=2
|
||||
// --json
|
||||
// --header=./cumulus/file_header.txt
|
||||
// --output=./cumulus/parachains/runtimes/people/people-westend/src/weights/
|
||||
// --chain=people-westend-dev
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{traits::Get, weights::Weight};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions for `pallet_transaction_payment`.
|
||||
pub struct WeightInfo<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> pallet_transaction_payment::WeightInfo for WeightInfo<T> {
|
||||
/// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0)
|
||||
/// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
|
||||
/// Storage: `System::Account` (r:1 w:1)
|
||||
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
|
||||
fn charge_transaction_payment() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `4`
|
||||
// Estimated: `3593`
|
||||
// Minimum execution time: 33_363_000 picoseconds.
|
||||
Weight::from_parts(38_793_000, 0)
|
||||
.saturating_add(Weight::from_parts(0, 3593))
|
||||
.saturating_add(T::DbWeight::get().reads(2))
|
||||
.saturating_add(T::DbWeight::get().writes(1))
|
||||
}
|
||||
}
|
||||
@@ -258,8 +258,8 @@ pub type Block = generic::Block<Header, UncheckedExtrinsic>;
|
||||
pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The extension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
frame_system::CheckGenesis<Runtime>,
|
||||
@@ -269,7 +269,7 @@ pub type SignedExtra = (
|
||||
);
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
|
||||
/// Executive: handles dispatch to the various modules.
|
||||
pub type Executive = frame_executive::Executive<
|
||||
|
||||
@@ -34,15 +34,19 @@ pub mod xcm_config;
|
||||
use codec::{Decode, Encode};
|
||||
use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases;
|
||||
use cumulus_primitives_core::AggregateMessageOrigin;
|
||||
use frame_support::unsigned::TransactionValidityError;
|
||||
use scale_info::TypeInfo;
|
||||
use sp_api::impl_runtime_apis;
|
||||
pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;
|
||||
use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
|
||||
use sp_runtime::{
|
||||
create_runtime_str, generic, impl_opaque_keys,
|
||||
traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, DispatchInfoOf},
|
||||
transaction_validity::{TransactionSource, TransactionValidity},
|
||||
traits::{
|
||||
AccountIdLookup, BlakeTwo256, Block as BlockT, DispatchInfoOf, OriginOf,
|
||||
TransactionExtension, TransactionExtensionBase, ValidateResult,
|
||||
},
|
||||
transaction_validity::{
|
||||
InvalidTransaction, TransactionSource, TransactionValidity, TransactionValidityError,
|
||||
},
|
||||
ApplyExtrinsicResult,
|
||||
};
|
||||
use sp_std::prelude::*;
|
||||
@@ -275,35 +279,37 @@ construct_runtime! {
|
||||
/// Simple implementation which fails any transaction which is signed.
|
||||
#[derive(Eq, PartialEq, Clone, Default, sp_core::RuntimeDebug, Encode, Decode, TypeInfo)]
|
||||
pub struct DisallowSigned;
|
||||
impl sp_runtime::traits::SignedExtension for DisallowSigned {
|
||||
|
||||
impl TransactionExtensionBase for DisallowSigned {
|
||||
const IDENTIFIER: &'static str = "DisallowSigned";
|
||||
type AccountId = AccountId;
|
||||
type Call = RuntimeCall;
|
||||
type AdditionalSigned = ();
|
||||
type Implicit = ();
|
||||
}
|
||||
|
||||
impl<C> TransactionExtension<RuntimeCall, C> for DisallowSigned {
|
||||
type Val = ();
|
||||
type Pre = ();
|
||||
fn additional_signed(
|
||||
&self,
|
||||
) -> sp_std::result::Result<(), sp_runtime::transaction_validity::TransactionValidityError> {
|
||||
Ok(())
|
||||
}
|
||||
fn pre_dispatch(
|
||||
self,
|
||||
who: &Self::AccountId,
|
||||
call: &Self::Call,
|
||||
info: &DispatchInfoOf<Self::Call>,
|
||||
len: usize,
|
||||
) -> Result<Self::Pre, TransactionValidityError> {
|
||||
self.validate(who, call, info, len).map(|_| ())
|
||||
}
|
||||
fn validate(
|
||||
&self,
|
||||
_who: &Self::AccountId,
|
||||
_call: &Self::Call,
|
||||
_info: &sp_runtime::traits::DispatchInfoOf<Self::Call>,
|
||||
_origin: OriginOf<RuntimeCall>,
|
||||
_call: &RuntimeCall,
|
||||
_info: &DispatchInfoOf<RuntimeCall>,
|
||||
_len: usize,
|
||||
) -> TransactionValidity {
|
||||
let i = sp_runtime::transaction_validity::InvalidTransaction::BadProof;
|
||||
Err(sp_runtime::transaction_validity::TransactionValidityError::Invalid(i))
|
||||
_context: &mut C,
|
||||
_self_implicit: Self::Implicit,
|
||||
_inherited_implication: &impl Encode,
|
||||
) -> ValidateResult<Self::Val, RuntimeCall> {
|
||||
Err(InvalidTransaction::BadProof.into())
|
||||
}
|
||||
fn prepare(
|
||||
self,
|
||||
_val: Self::Val,
|
||||
_origin: &OriginOf<RuntimeCall>,
|
||||
_call: &RuntimeCall,
|
||||
_info: &DispatchInfoOf<RuntimeCall>,
|
||||
_len: usize,
|
||||
_context: &C,
|
||||
) -> Result<Self::Pre, TransactionValidityError> {
|
||||
Err(InvalidTransaction::BadProof.into())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -323,11 +329,11 @@ pub type Block = generic::Block<Header, UncheckedExtrinsic>;
|
||||
pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = DisallowSigned;
|
||||
/// The extension to the basic transaction logic.
|
||||
pub type TxExtension = DisallowSigned;
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
/// Executive: handles dispatch to the various modules.
|
||||
pub type Executive = frame_executive::Executive<
|
||||
Runtime,
|
||||
|
||||
@@ -158,6 +158,7 @@ runtime-benchmarks = [
|
||||
"pallet-message-queue/runtime-benchmarks",
|
||||
"pallet-sudo/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
"parachains-common/runtime-benchmarks",
|
||||
"polkadot-parachain-primitives/runtime-benchmarks",
|
||||
|
||||
@@ -114,8 +114,8 @@ pub type BlockId = generic::BlockId<Block>;
|
||||
// Id used for identifying assets.
|
||||
pub type AssetId = u32;
|
||||
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The extension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -128,7 +128,7 @@ pub type SignedExtra = (
|
||||
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
|
||||
pub type Migrations = (
|
||||
pallet_balances::migration::MigrateToTrackInactive<Runtime, xcm_config::CheckingAccount>,
|
||||
@@ -419,6 +419,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
||||
type OperationalFeeMultiplier = ConstU8<5>;
|
||||
type WeightInfo = ();
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
@@ -608,6 +609,19 @@ impl pallet_collator_selection::Config for Runtime {
|
||||
type WeightInfo = ();
|
||||
}
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
pub struct AssetTxHelper;
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
impl pallet_asset_tx_payment::BenchmarkHelperTrait<AccountId, u32, u32> for AssetTxHelper {
|
||||
fn create_asset_id_parameter(_id: u32) -> (u32, u32) {
|
||||
unimplemented!("Penpal uses default weights");
|
||||
}
|
||||
fn setup_balances_and_pool(_asset_id: u32, _account: AccountId) {
|
||||
unimplemented!("Penpal uses default weights");
|
||||
}
|
||||
}
|
||||
|
||||
impl pallet_asset_tx_payment::Config for Runtime {
|
||||
type RuntimeEvent = RuntimeEvent;
|
||||
type Fungibles = Assets;
|
||||
@@ -620,6 +634,9 @@ impl pallet_asset_tx_payment::Config for Runtime {
|
||||
>,
|
||||
AssetsToBlockAuthor<Runtime>,
|
||||
>;
|
||||
type WeightInfo = ();
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
type BenchmarkHelper = AssetTxHelper;
|
||||
}
|
||||
|
||||
impl pallet_sudo::Config for Runtime {
|
||||
@@ -668,6 +685,7 @@ construct_runtime!(
|
||||
mod benches {
|
||||
frame_benchmarking::define_benchmarks!(
|
||||
[frame_system, SystemBench::<Runtime>]
|
||||
[frame_system_extensions, SystemExtensionsBench::<Runtime>]
|
||||
[pallet_balances, Balances]
|
||||
[pallet_message_queue, MessageQueue]
|
||||
[pallet_session, SessionBench::<Runtime>]
|
||||
@@ -851,6 +869,7 @@ impl_runtime_apis! {
|
||||
use frame_benchmarking::{Benchmarking, BenchmarkList};
|
||||
use frame_support::traits::StorageInfoTrait;
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
use cumulus_pallet_session_benchmarking::Pallet as SessionBench;
|
||||
|
||||
let mut list = Vec::<BenchmarkList>::new();
|
||||
@@ -867,6 +886,7 @@ impl_runtime_apis! {
|
||||
use sp_storage::TrackedStorageKey;
|
||||
|
||||
use frame_system_benchmarking::Pallet as SystemBench;
|
||||
use frame_system_benchmarking::extensions::Pallet as SystemExtensionsBench;
|
||||
impl frame_system_benchmarking::Config for Runtime {}
|
||||
|
||||
use cumulus_pallet_session_benchmarking::Pallet as SessionBench;
|
||||
|
||||
@@ -126,6 +126,7 @@ runtime-benchmarks = [
|
||||
"pallet-message-queue/runtime-benchmarks",
|
||||
"pallet-sudo/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
"parachains-common/runtime-benchmarks",
|
||||
"polkadot-parachain-primitives/runtime-benchmarks",
|
||||
|
||||
@@ -267,6 +267,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = ();
|
||||
type OperationalFeeMultiplier = ConstU8<5>;
|
||||
type WeightInfo = ();
|
||||
}
|
||||
|
||||
impl pallet_sudo::Config for Runtime {
|
||||
@@ -644,8 +645,8 @@ pub type Block = generic::Block<Header, UncheckedExtrinsic>;
|
||||
pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The extension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
@@ -657,7 +658,7 @@ pub type SignedExtra = (
|
||||
);
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
/// Executive: handles dispatch to the various modules.
|
||||
pub type Executive = frame_executive::Executive<
|
||||
Runtime,
|
||||
|
||||
@@ -136,6 +136,7 @@ runtime-benchmarks = [
|
||||
"frame-benchmarking/runtime-benchmarks",
|
||||
"frame-support/runtime-benchmarks",
|
||||
"glutton-westend-runtime/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"parachains-common/runtime-benchmarks",
|
||||
"penpal-runtime/runtime-benchmarks",
|
||||
"people-rococo-runtime/runtime-benchmarks",
|
||||
|
||||
@@ -14,9 +14,12 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features =
|
||||
log = { workspace = true }
|
||||
scale-info = { version = "2.10.0", default-features = false, features = ["derive"] }
|
||||
|
||||
frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true }
|
||||
frame-support = { path = "../../../substrate/frame/support", default-features = false }
|
||||
frame-system = { path = "../../../substrate/frame/system", default-features = false }
|
||||
|
||||
sp-core = { path = "../../../substrate/primitives/core", default-features = false }
|
||||
sp-io = { path = "../../../substrate/primitives/io", default-features = false }
|
||||
sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false }
|
||||
sp-std = { path = "../../../substrate/primitives/std", default-features = false }
|
||||
|
||||
@@ -26,19 +29,27 @@ docify = "0.2.7"
|
||||
|
||||
[dev-dependencies]
|
||||
sp-trie = { path = "../../../substrate/primitives/trie", default-features = false }
|
||||
sp-io = { path = "../../../substrate/primitives/io", default-features = false }
|
||||
cumulus-test-runtime = { path = "../../test/runtime" }
|
||||
|
||||
[features]
|
||||
default = ["std"]
|
||||
runtime-benchmarks = [
|
||||
"cumulus-primitives-core/runtime-benchmarks",
|
||||
"frame-benchmarking/runtime-benchmarks",
|
||||
"frame-support/runtime-benchmarks",
|
||||
"frame-system/runtime-benchmarks",
|
||||
"sp-runtime/runtime-benchmarks",
|
||||
]
|
||||
std = [
|
||||
"codec/std",
|
||||
"cumulus-primitives-core/std",
|
||||
"cumulus-primitives-proof-size-hostfunction/std",
|
||||
"frame-benchmarking/std",
|
||||
"frame-support/std",
|
||||
"frame-system/std",
|
||||
"log/std",
|
||||
"scale-info/std",
|
||||
"sp-core/std",
|
||||
"sp-io/std",
|
||||
"sp-runtime/std",
|
||||
"sp-std/std",
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//! Benchmarking setup for cumulus-primitives-storage-weight-reclaim
|
||||
|
||||
#![cfg(feature = "runtime-benchmarks")]
|
||||
|
||||
use super::*;
|
||||
|
||||
use frame_benchmarking::{account, v2::*, BenchmarkError};
|
||||
use frame_support::pallet_prelude::DispatchClass;
|
||||
use frame_system::{BlockWeight, RawOrigin};
|
||||
use sp_runtime::traits::{DispatchTransaction, Get};
|
||||
use sp_std::{
|
||||
marker::{Send, Sync},
|
||||
prelude::*,
|
||||
};
|
||||
|
||||
/// Pallet we're benchmarking here.
|
||||
pub struct Pallet<T: frame_system::Config>(frame_system::Pallet<T>);
|
||||
|
||||
#[benchmarks(where
|
||||
T: Send + Sync,
|
||||
T::RuntimeCall: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo>
|
||||
)]
|
||||
mod benchmarks {
|
||||
use super::*;
|
||||
|
||||
#[benchmark]
|
||||
fn storage_weight_reclaim() -> Result<(), BenchmarkError> {
|
||||
let caller = account("caller", 0, 0);
|
||||
BlockWeight::<T>::mutate(|current_weight| {
|
||||
current_weight.set(Weight::from_parts(0, 1000), DispatchClass::Normal);
|
||||
});
|
||||
let base_extrinsic = <T as frame_system::Config>::BlockWeights::get()
|
||||
.get(DispatchClass::Normal)
|
||||
.base_extrinsic;
|
||||
let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() };
|
||||
let call: T::RuntimeCall = frame_system::Call::remark { remark: vec![] }.into();
|
||||
let post_info = PostDispatchInfo {
|
||||
actual_weight: Some(Weight::from_parts(0, 200)),
|
||||
pays_fee: Default::default(),
|
||||
};
|
||||
let len = 0_usize;
|
||||
let ext = StorageWeightReclaim::<T>::new();
|
||||
|
||||
#[block]
|
||||
{
|
||||
ext.test_run(RawOrigin::Signed(caller).into(), &call, &info, len, |_| Ok(post_info))
|
||||
.unwrap()
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
assert_eq!(BlockWeight::<T>::get().total().proof_size(), 700 + base_extrinsic.proof_size());
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
@@ -29,12 +29,22 @@ use frame_support::{
|
||||
use frame_system::Config;
|
||||
use scale_info::TypeInfo;
|
||||
use sp_runtime::{
|
||||
traits::{DispatchInfoOf, Dispatchable, PostDispatchInfoOf, SignedExtension},
|
||||
impl_tx_ext_default,
|
||||
traits::{
|
||||
DispatchInfoOf, Dispatchable, PostDispatchInfoOf, TransactionExtension,
|
||||
TransactionExtensionBase,
|
||||
},
|
||||
transaction_validity::TransactionValidityError,
|
||||
DispatchResult,
|
||||
};
|
||||
use sp_std::marker::PhantomData;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
mod benchmarking;
|
||||
|
||||
const LOG_TARGET: &'static str = "runtime::storage_reclaim";
|
||||
|
||||
/// `StorageWeightReclaimer` is a mechanism for manually reclaiming storage weight.
|
||||
@@ -43,7 +53,7 @@ const LOG_TARGET: &'static str = "runtime::storage_reclaim";
|
||||
/// reclaim it computes the real consumed storage weight and refunds excess weight.
|
||||
///
|
||||
/// # Example
|
||||
#[doc = docify::embed!("src/lib.rs", simple_reclaimer_example)]
|
||||
#[doc = docify::embed!("src/tests.rs", simple_reclaimer_example)]
|
||||
pub struct StorageWeightReclaimer {
|
||||
previous_remaining_proof_size: u64,
|
||||
previous_reported_proof_size: Option<u64>,
|
||||
@@ -119,42 +129,40 @@ impl<T: Config + Send + Sync> core::fmt::Debug for StorageWeightReclaim<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Config + Send + Sync> SignedExtension for StorageWeightReclaim<T>
|
||||
impl<T: Config + Send + Sync> TransactionExtensionBase for StorageWeightReclaim<T> {
|
||||
const IDENTIFIER: &'static str = "StorageWeightReclaim";
|
||||
type Implicit = ();
|
||||
}
|
||||
|
||||
impl<T: Config + Send + Sync, Context> TransactionExtension<T::RuntimeCall, Context>
|
||||
for StorageWeightReclaim<T>
|
||||
where
|
||||
T::RuntimeCall: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo>,
|
||||
{
|
||||
const IDENTIFIER: &'static str = "StorageWeightReclaim";
|
||||
|
||||
type AccountId = T::AccountId;
|
||||
type Call = T::RuntimeCall;
|
||||
type AdditionalSigned = ();
|
||||
type Val = ();
|
||||
type Pre = Option<u64>;
|
||||
|
||||
fn additional_signed(
|
||||
&self,
|
||||
) -> Result<Self::AdditionalSigned, sp_runtime::transaction_validity::TransactionValidityError>
|
||||
{
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn pre_dispatch(
|
||||
fn prepare(
|
||||
self,
|
||||
_who: &Self::AccountId,
|
||||
_call: &Self::Call,
|
||||
_info: &sp_runtime::traits::DispatchInfoOf<Self::Call>,
|
||||
_val: Self::Val,
|
||||
_origin: &T::RuntimeOrigin,
|
||||
_call: &T::RuntimeCall,
|
||||
_info: &DispatchInfoOf<T::RuntimeCall>,
|
||||
_len: usize,
|
||||
) -> Result<Self::Pre, sp_runtime::transaction_validity::TransactionValidityError> {
|
||||
_context: &Context,
|
||||
) -> Result<Self::Pre, TransactionValidityError> {
|
||||
Ok(get_proof_size())
|
||||
}
|
||||
|
||||
fn post_dispatch(
|
||||
pre: Option<Self::Pre>,
|
||||
info: &DispatchInfoOf<Self::Call>,
|
||||
post_info: &PostDispatchInfoOf<Self::Call>,
|
||||
pre: Self::Pre,
|
||||
info: &DispatchInfoOf<T::RuntimeCall>,
|
||||
post_info: &PostDispatchInfoOf<T::RuntimeCall>,
|
||||
_len: usize,
|
||||
_result: &DispatchResult,
|
||||
_context: &Context,
|
||||
) -> Result<(), TransactionValidityError> {
|
||||
let Some(Some(pre_dispatch_proof_size)) = pre else {
|
||||
let Some(pre_dispatch_proof_size) = pre else {
|
||||
return Ok(());
|
||||
};
|
||||
|
||||
@@ -194,470 +202,6 @@ where
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use frame_support::{
|
||||
assert_ok,
|
||||
dispatch::DispatchClass,
|
||||
weights::{Weight, WeightMeter},
|
||||
};
|
||||
use frame_system::{BlockWeight, CheckWeight};
|
||||
use sp_runtime::{AccountId32, BuildStorage};
|
||||
use sp_std::marker::PhantomData;
|
||||
use sp_trie::proof_size_extension::ProofSizeExt;
|
||||
|
||||
type Test = cumulus_test_runtime::Runtime;
|
||||
const CALL: &<Test as Config>::RuntimeCall =
|
||||
&cumulus_test_runtime::RuntimeCall::System(frame_system::Call::set_heap_pages {
|
||||
pages: 0u64,
|
||||
});
|
||||
const ALICE: AccountId32 = AccountId32::new([1u8; 32]);
|
||||
const LEN: usize = 0;
|
||||
|
||||
pub fn new_test_ext() -> sp_io::TestExternalities {
|
||||
let ext: sp_io::TestExternalities = cumulus_test_runtime::RuntimeGenesisConfig::default()
|
||||
.build_storage()
|
||||
.unwrap()
|
||||
.into();
|
||||
ext
|
||||
}
|
||||
|
||||
struct TestRecorder {
|
||||
return_values: Box<[usize]>,
|
||||
counter: std::sync::atomic::AtomicUsize,
|
||||
}
|
||||
|
||||
impl TestRecorder {
|
||||
fn new(values: &[usize]) -> Self {
|
||||
TestRecorder { return_values: values.into(), counter: Default::default() }
|
||||
}
|
||||
}
|
||||
|
||||
impl sp_trie::ProofSizeProvider for TestRecorder {
|
||||
fn estimate_encoded_size(&self) -> usize {
|
||||
let counter = self.counter.fetch_add(1, core::sync::atomic::Ordering::Relaxed);
|
||||
self.return_values[counter]
|
||||
}
|
||||
}
|
||||
|
||||
fn setup_test_externalities(proof_values: &[usize]) -> sp_io::TestExternalities {
|
||||
let mut test_ext = new_test_ext();
|
||||
let test_recorder = TestRecorder::new(proof_values);
|
||||
test_ext.register_extension(ProofSizeExt::new(test_recorder));
|
||||
test_ext
|
||||
}
|
||||
|
||||
fn set_current_storage_weight(new_weight: u64) {
|
||||
BlockWeight::<Test>::mutate(|current_weight| {
|
||||
current_weight.set(Weight::from_parts(0, new_weight), DispatchClass::Normal);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn basic_refund() {
|
||||
// The real cost will be 100 bytes of storage size
|
||||
let mut test_ext = setup_test_externalities(&[0, 100]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
|
||||
// Benchmarked storage weight: 500
|
||||
let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() };
|
||||
let post_info = PostDispatchInfo::default();
|
||||
|
||||
let pre = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.pre_dispatch(&ALICE, CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(0));
|
||||
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch(None, &info, &post_info, 0, &Ok(())));
|
||||
// We expect a refund of 400
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
Some(pre),
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(())
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 600);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn does_nothing_without_extension() {
|
||||
let mut test_ext = new_test_ext();
|
||||
|
||||
// Proof size extension not registered
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
|
||||
// Benchmarked storage weight: 500
|
||||
let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() };
|
||||
let post_info = PostDispatchInfo::default();
|
||||
|
||||
let pre = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.pre_dispatch(&ALICE, CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, None);
|
||||
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch(None, &info, &post_info, 0, &Ok(())));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
Some(pre),
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(())
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 1000);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn negative_refund_is_added_to_weight() {
|
||||
let mut test_ext = setup_test_externalities(&[100, 300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
// Benchmarked storage weight: 100
|
||||
let info = DispatchInfo { weight: Weight::from_parts(0, 100), ..Default::default() };
|
||||
let post_info = PostDispatchInfo::default();
|
||||
|
||||
let pre = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.pre_dispatch(&ALICE, CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(100));
|
||||
|
||||
// We expect no refund
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch(None, &info, &post_info, 0, &Ok(())));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
Some(pre),
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(())
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 1100);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_zero_proof_size() {
|
||||
let mut test_ext = setup_test_externalities(&[0, 0]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() };
|
||||
let post_info = PostDispatchInfo::default();
|
||||
|
||||
let pre = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.pre_dispatch(&ALICE, CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(0));
|
||||
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch(None, &info, &post_info, 0, &Ok(())));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
Some(pre),
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(())
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 0);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_larger_pre_dispatch_proof_size() {
|
||||
let mut test_ext = setup_test_externalities(&[300, 100]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1300);
|
||||
|
||||
let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() };
|
||||
let post_info = PostDispatchInfo::default();
|
||||
|
||||
let pre = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.pre_dispatch(&ALICE, CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(300));
|
||||
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch(None, &info, &post_info, 0, &Ok(())));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
Some(pre),
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(())
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 800);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_incorporates_check_weight_unspent_weight() {
|
||||
let mut test_ext = setup_test_externalities(&[100, 300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
|
||||
// Benchmarked storage weight: 300
|
||||
let info = DispatchInfo { weight: Weight::from_parts(100, 300), ..Default::default() };
|
||||
|
||||
// Actual weight is 50
|
||||
let post_info = PostDispatchInfo {
|
||||
actual_weight: Some(Weight::from_parts(50, 250)),
|
||||
pays_fee: Default::default(),
|
||||
};
|
||||
|
||||
let pre = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.pre_dispatch(&ALICE, CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(100));
|
||||
|
||||
// The `CheckWeight` extension will refunt `actual_weight` from `PostDispatchInfo`
|
||||
// we always need to call `post_dispatch` to verify that they interoperate correctly.
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch(None, &info, &post_info, 0, &Ok(())));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
Some(pre),
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(())
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 900);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_incorporates_check_weight_unspent_weight_on_negative() {
|
||||
let mut test_ext = setup_test_externalities(&[100, 300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
// Benchmarked storage weight: 50
|
||||
let info = DispatchInfo { weight: Weight::from_parts(100, 50), ..Default::default() };
|
||||
|
||||
// Actual weight is 25
|
||||
let post_info = PostDispatchInfo {
|
||||
actual_weight: Some(Weight::from_parts(50, 25)),
|
||||
pays_fee: Default::default(),
|
||||
};
|
||||
|
||||
let pre = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.pre_dispatch(&ALICE, CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(100));
|
||||
|
||||
// The `CheckWeight` extension will refunt `actual_weight` from `PostDispatchInfo`
|
||||
// we always need to call `post_dispatch` to verify that they interoperate correctly.
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch(None, &info, &post_info, 0, &Ok(())));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
Some(pre),
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(())
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 1150);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_incorporates_check_weight_unspent_weight_reverse_order() {
|
||||
let mut test_ext = setup_test_externalities(&[100, 300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
|
||||
// Benchmarked storage weight: 300
|
||||
let info = DispatchInfo { weight: Weight::from_parts(100, 300), ..Default::default() };
|
||||
|
||||
// Actual weight is 50
|
||||
let post_info = PostDispatchInfo {
|
||||
actual_weight: Some(Weight::from_parts(50, 250)),
|
||||
pays_fee: Default::default(),
|
||||
};
|
||||
|
||||
let pre = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.pre_dispatch(&ALICE, CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(100));
|
||||
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
Some(pre),
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(())
|
||||
));
|
||||
// `CheckWeight` gets called after `StorageWeightReclaim` this time.
|
||||
// The `CheckWeight` extension will refunt `actual_weight` from `PostDispatchInfo`
|
||||
// we always need to call `post_dispatch` to verify that they interoperate correctly.
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch(None, &info, &post_info, 0, &Ok(())));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 900);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_incorporates_check_weight_unspent_weight_on_negative_reverse_order() {
|
||||
let mut test_ext = setup_test_externalities(&[100, 300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
// Benchmarked storage weight: 50
|
||||
let info = DispatchInfo { weight: Weight::from_parts(100, 50), ..Default::default() };
|
||||
|
||||
// Actual weight is 25
|
||||
let post_info = PostDispatchInfo {
|
||||
actual_weight: Some(Weight::from_parts(50, 25)),
|
||||
pays_fee: Default::default(),
|
||||
};
|
||||
|
||||
let pre = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.pre_dispatch(&ALICE, CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(100));
|
||||
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
Some(pre),
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(())
|
||||
));
|
||||
// `CheckWeight` gets called after `StorageWeightReclaim` this time.
|
||||
// The `CheckWeight` extension will refunt `actual_weight` from `PostDispatchInfo`
|
||||
// we always need to call `post_dispatch` to verify that they interoperate correctly.
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch(None, &info, &post_info, 0, &Ok(())));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 1150);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn storage_size_reported_correctly() {
|
||||
let mut test_ext = setup_test_externalities(&[1000]);
|
||||
test_ext.execute_with(|| {
|
||||
assert_eq!(get_proof_size(), Some(1000));
|
||||
});
|
||||
|
||||
let mut test_ext = new_test_ext();
|
||||
|
||||
let test_recorder = TestRecorder::new(&[0]);
|
||||
|
||||
test_ext.register_extension(ProofSizeExt::new(test_recorder));
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
assert_eq!(get_proof_size(), Some(0));
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn storage_size_disabled_reported_correctly() {
|
||||
let mut test_ext = setup_test_externalities(&[PROOF_RECORDING_DISABLED as usize]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
assert_eq!(get_proof_size(), None);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reclaim_helper() {
|
||||
let mut test_ext = setup_test_externalities(&[1000, 1300, 1800]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(0, 2000));
|
||||
let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter);
|
||||
remaining_weight_meter.consume(Weight::from_parts(0, 500));
|
||||
let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter);
|
||||
|
||||
assert_eq!(reclaimed, Some(Weight::from_parts(0, 200)));
|
||||
|
||||
remaining_weight_meter.consume(Weight::from_parts(0, 800));
|
||||
let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter);
|
||||
assert_eq!(reclaimed, Some(Weight::from_parts(0, 300)));
|
||||
assert_eq!(remaining_weight_meter.remaining(), Weight::from_parts(0, 1200));
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reclaim_helper_does_not_reclaim_negative() {
|
||||
// Benchmarked weight does not change at all
|
||||
let mut test_ext = setup_test_externalities(&[1000, 1300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(0, 1000));
|
||||
let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter);
|
||||
let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter);
|
||||
|
||||
assert_eq!(reclaimed, Some(Weight::from_parts(0, 0)));
|
||||
assert_eq!(remaining_weight_meter.remaining(), Weight::from_parts(0, 1000));
|
||||
});
|
||||
|
||||
// Benchmarked weight increases less than storage proof consumes
|
||||
let mut test_ext = setup_test_externalities(&[1000, 1300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(0, 1000));
|
||||
let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter);
|
||||
remaining_weight_meter.consume(Weight::from_parts(0, 0));
|
||||
let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter);
|
||||
|
||||
assert_eq!(reclaimed, Some(Weight::from_parts(0, 0)));
|
||||
});
|
||||
}
|
||||
|
||||
/// Just here for doc purposes
|
||||
fn get_benched_weight() -> Weight {
|
||||
Weight::from_parts(0, 5)
|
||||
}
|
||||
|
||||
/// Just here for doc purposes
|
||||
fn do_work() {}
|
||||
|
||||
#[docify::export_content(simple_reclaimer_example)]
|
||||
fn reclaim_with_weight_meter() {
|
||||
let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(10, 10));
|
||||
|
||||
let benched_weight = get_benched_weight();
|
||||
|
||||
// It is important to instantiate the `StorageWeightReclaimer` before we consume the weight
|
||||
// for a piece of work from the weight meter.
|
||||
let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter);
|
||||
|
||||
if remaining_weight_meter.try_consume(benched_weight).is_ok() {
|
||||
// Perform some work that takes has `benched_weight` storage weight.
|
||||
do_work();
|
||||
|
||||
// Reclaimer will detect that we only consumed 2 bytes, so 3 bytes are reclaimed.
|
||||
let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter);
|
||||
|
||||
// We reclaimed 3 bytes of storage size!
|
||||
assert_eq!(reclaimed, Some(Weight::from_parts(0, 3)));
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 10);
|
||||
assert_eq!(remaining_weight_meter.remaining(), Weight::from_parts(10, 8));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reclaim_helper_works_with_meter() {
|
||||
// The node will report 12 - 10 = 2 consumed storage size between the calls.
|
||||
let mut test_ext = setup_test_externalities(&[10, 12]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
// Initial storage size is 10.
|
||||
set_current_storage_weight(10);
|
||||
reclaim_with_weight_meter();
|
||||
});
|
||||
}
|
||||
|
||||
impl_tx_ext_default!(T::RuntimeCall; Context; validate);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,484 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
use super::*;
|
||||
use frame_support::{
|
||||
assert_ok,
|
||||
dispatch::DispatchClass,
|
||||
weights::{Weight, WeightMeter},
|
||||
};
|
||||
use frame_system::{BlockWeight, CheckWeight};
|
||||
use sp_runtime::{traits::DispatchTransaction, AccountId32, BuildStorage};
|
||||
use sp_std::marker::PhantomData;
|
||||
use sp_trie::proof_size_extension::ProofSizeExt;
|
||||
|
||||
type Test = cumulus_test_runtime::Runtime;
|
||||
const CALL: &<Test as Config>::RuntimeCall =
|
||||
&cumulus_test_runtime::RuntimeCall::System(frame_system::Call::set_heap_pages { pages: 0u64 });
|
||||
const ALICE: AccountId32 = AccountId32::new([1u8; 32]);
|
||||
const LEN: usize = 0;
|
||||
|
||||
fn new_test_ext() -> sp_io::TestExternalities {
|
||||
let ext: sp_io::TestExternalities = cumulus_test_runtime::RuntimeGenesisConfig::default()
|
||||
.build_storage()
|
||||
.unwrap()
|
||||
.into();
|
||||
ext
|
||||
}
|
||||
|
||||
struct TestRecorder {
|
||||
return_values: Box<[usize]>,
|
||||
counter: std::sync::atomic::AtomicUsize,
|
||||
}
|
||||
|
||||
impl TestRecorder {
|
||||
fn new(values: &[usize]) -> Self {
|
||||
TestRecorder { return_values: values.into(), counter: Default::default() }
|
||||
}
|
||||
}
|
||||
|
||||
impl sp_trie::ProofSizeProvider for TestRecorder {
|
||||
fn estimate_encoded_size(&self) -> usize {
|
||||
let counter = self.counter.fetch_add(1, core::sync::atomic::Ordering::Relaxed);
|
||||
self.return_values[counter]
|
||||
}
|
||||
}
|
||||
|
||||
fn setup_test_externalities(proof_values: &[usize]) -> sp_io::TestExternalities {
|
||||
let mut test_ext = new_test_ext();
|
||||
let test_recorder = TestRecorder::new(proof_values);
|
||||
test_ext.register_extension(ProofSizeExt::new(test_recorder));
|
||||
test_ext
|
||||
}
|
||||
|
||||
fn set_current_storage_weight(new_weight: u64) {
|
||||
BlockWeight::<Test>::mutate(|current_weight| {
|
||||
current_weight.set(Weight::from_parts(0, new_weight), DispatchClass::Normal);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn basic_refund() {
|
||||
// The real cost will be 100 bytes of storage size
|
||||
let mut test_ext = setup_test_externalities(&[0, 100]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
|
||||
// Benchmarked storage weight: 500
|
||||
let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() };
|
||||
let post_info = PostDispatchInfo::default();
|
||||
|
||||
let (pre, _) = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.validate_and_prepare(Some(ALICE.clone()).into(), CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(0));
|
||||
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch((), &info, &post_info, 0, &Ok(()), &()));
|
||||
// We expect a refund of 400
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
pre,
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(()),
|
||||
&()
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 600);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn does_nothing_without_extension() {
|
||||
let mut test_ext = new_test_ext();
|
||||
|
||||
// Proof size extension not registered
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
|
||||
// Benchmarked storage weight: 500
|
||||
let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() };
|
||||
let post_info = PostDispatchInfo::default();
|
||||
|
||||
let (pre, _) = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.validate_and_prepare(Some(ALICE.clone()).into(), CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, None);
|
||||
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch((), &info, &post_info, 0, &Ok(()), &()));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
pre,
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(()),
|
||||
&()
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 1000);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn negative_refund_is_added_to_weight() {
|
||||
let mut test_ext = setup_test_externalities(&[100, 300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
// Benchmarked storage weight: 100
|
||||
let info = DispatchInfo { weight: Weight::from_parts(0, 100), ..Default::default() };
|
||||
let post_info = PostDispatchInfo::default();
|
||||
|
||||
let (pre, _) = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.validate_and_prepare(Some(ALICE.clone()).into(), CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(100));
|
||||
|
||||
// We expect no refund
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch((), &info, &post_info, 0, &Ok(()), &()));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
pre,
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(()),
|
||||
&()
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 1100);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_zero_proof_size() {
|
||||
let mut test_ext = setup_test_externalities(&[0, 0]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() };
|
||||
let post_info = PostDispatchInfo::default();
|
||||
|
||||
let (pre, _) = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.validate_and_prepare(Some(ALICE.clone()).into(), CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(0));
|
||||
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch((), &info, &post_info, 0, &Ok(()), &()));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
pre,
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(()),
|
||||
&()
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 0);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_larger_pre_dispatch_proof_size() {
|
||||
let mut test_ext = setup_test_externalities(&[300, 100]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1300);
|
||||
|
||||
let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() };
|
||||
let post_info = PostDispatchInfo::default();
|
||||
|
||||
let (pre, _) = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.validate_and_prepare(Some(ALICE.clone()).into(), CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(300));
|
||||
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch((), &info, &post_info, 0, &Ok(()), &()));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
pre,
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(()),
|
||||
&()
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 800);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_incorporates_check_weight_unspent_weight() {
|
||||
let mut test_ext = setup_test_externalities(&[100, 300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
|
||||
// Benchmarked storage weight: 300
|
||||
let info = DispatchInfo { weight: Weight::from_parts(100, 300), ..Default::default() };
|
||||
|
||||
// Actual weight is 50
|
||||
let post_info = PostDispatchInfo {
|
||||
actual_weight: Some(Weight::from_parts(50, 250)),
|
||||
pays_fee: Default::default(),
|
||||
};
|
||||
|
||||
let (pre, _) = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.validate_and_prepare(Some(ALICE.clone()).into(), CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(100));
|
||||
|
||||
// The `CheckWeight` extension will refunt `actual_weight` from `PostDispatchInfo`
|
||||
// we always need to call `post_dispatch` to verify that they interoperate correctly.
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch((), &info, &post_info, 0, &Ok(()), &()));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
pre,
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(()),
|
||||
&()
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 900);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_incorporates_check_weight_unspent_weight_on_negative() {
|
||||
let mut test_ext = setup_test_externalities(&[100, 300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
// Benchmarked storage weight: 50
|
||||
let info = DispatchInfo { weight: Weight::from_parts(100, 50), ..Default::default() };
|
||||
|
||||
// Actual weight is 25
|
||||
let post_info = PostDispatchInfo {
|
||||
actual_weight: Some(Weight::from_parts(50, 25)),
|
||||
pays_fee: Default::default(),
|
||||
};
|
||||
|
||||
let (pre, _) = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.validate_and_prepare(Some(ALICE.clone()).into(), CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(100));
|
||||
|
||||
// The `CheckWeight` extension will refunt `actual_weight` from `PostDispatchInfo`
|
||||
// we always need to call `post_dispatch` to verify that they interoperate correctly.
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch((), &info, &post_info, 0, &Ok(()), &()));
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
pre,
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(()),
|
||||
&()
|
||||
));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 1150);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_incorporates_check_weight_unspent_weight_reverse_order() {
|
||||
let mut test_ext = setup_test_externalities(&[100, 300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
|
||||
// Benchmarked storage weight: 300
|
||||
let info = DispatchInfo { weight: Weight::from_parts(100, 300), ..Default::default() };
|
||||
|
||||
// Actual weight is 50
|
||||
let post_info = PostDispatchInfo {
|
||||
actual_weight: Some(Weight::from_parts(50, 250)),
|
||||
pays_fee: Default::default(),
|
||||
};
|
||||
|
||||
let (pre, _) = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.validate_and_prepare(Some(ALICE.clone()).into(), CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(100));
|
||||
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
pre,
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(()),
|
||||
&()
|
||||
));
|
||||
// `CheckWeight` gets called after `StorageWeightReclaim` this time.
|
||||
// The `CheckWeight` extension will refunt `actual_weight` from `PostDispatchInfo`
|
||||
// we always need to call `post_dispatch` to verify that they interoperate correctly.
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch((), &info, &post_info, 0, &Ok(()), &()));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 900);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_incorporates_check_weight_unspent_weight_on_negative_reverse_order() {
|
||||
let mut test_ext = setup_test_externalities(&[100, 300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
set_current_storage_weight(1000);
|
||||
// Benchmarked storage weight: 50
|
||||
let info = DispatchInfo { weight: Weight::from_parts(100, 50), ..Default::default() };
|
||||
|
||||
// Actual weight is 25
|
||||
let post_info = PostDispatchInfo {
|
||||
actual_weight: Some(Weight::from_parts(50, 25)),
|
||||
pays_fee: Default::default(),
|
||||
};
|
||||
|
||||
let (pre, _) = StorageWeightReclaim::<Test>(PhantomData)
|
||||
.validate_and_prepare(Some(ALICE.clone()).into(), CALL, &info, LEN)
|
||||
.unwrap();
|
||||
assert_eq!(pre, Some(100));
|
||||
|
||||
assert_ok!(StorageWeightReclaim::<Test>::post_dispatch(
|
||||
pre,
|
||||
&info,
|
||||
&post_info,
|
||||
LEN,
|
||||
&Ok(()),
|
||||
&()
|
||||
));
|
||||
// `CheckWeight` gets called after `StorageWeightReclaim` this time.
|
||||
// The `CheckWeight` extension will refunt `actual_weight` from `PostDispatchInfo`
|
||||
// we always need to call `post_dispatch` to verify that they interoperate correctly.
|
||||
assert_ok!(CheckWeight::<Test>::post_dispatch((), &info, &post_info, 0, &Ok(()), &()));
|
||||
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 1150);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn storage_size_reported_correctly() {
|
||||
let mut test_ext = setup_test_externalities(&[1000]);
|
||||
test_ext.execute_with(|| {
|
||||
assert_eq!(get_proof_size(), Some(1000));
|
||||
});
|
||||
|
||||
let mut test_ext = new_test_ext();
|
||||
|
||||
let test_recorder = TestRecorder::new(&[0]);
|
||||
|
||||
test_ext.register_extension(ProofSizeExt::new(test_recorder));
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
assert_eq!(get_proof_size(), Some(0));
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn storage_size_disabled_reported_correctly() {
|
||||
let mut test_ext = setup_test_externalities(&[PROOF_RECORDING_DISABLED as usize]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
assert_eq!(get_proof_size(), None);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reclaim_helper() {
|
||||
let mut test_ext = setup_test_externalities(&[1000, 1300, 1800]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(0, 2000));
|
||||
let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter);
|
||||
remaining_weight_meter.consume(Weight::from_parts(0, 500));
|
||||
let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter);
|
||||
|
||||
assert_eq!(reclaimed, Some(Weight::from_parts(0, 200)));
|
||||
|
||||
remaining_weight_meter.consume(Weight::from_parts(0, 800));
|
||||
let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter);
|
||||
assert_eq!(reclaimed, Some(Weight::from_parts(0, 300)));
|
||||
assert_eq!(remaining_weight_meter.remaining(), Weight::from_parts(0, 1200));
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reclaim_helper_does_not_reclaim_negative() {
|
||||
// Benchmarked weight does not change at all
|
||||
let mut test_ext = setup_test_externalities(&[1000, 1300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(0, 1000));
|
||||
let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter);
|
||||
let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter);
|
||||
|
||||
assert_eq!(reclaimed, Some(Weight::from_parts(0, 0)));
|
||||
assert_eq!(remaining_weight_meter.remaining(), Weight::from_parts(0, 1000));
|
||||
});
|
||||
|
||||
// Benchmarked weight increases less than storage proof consumes
|
||||
let mut test_ext = setup_test_externalities(&[1000, 1300]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(0, 1000));
|
||||
let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter);
|
||||
remaining_weight_meter.consume(Weight::from_parts(0, 0));
|
||||
let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter);
|
||||
|
||||
assert_eq!(reclaimed, Some(Weight::from_parts(0, 0)));
|
||||
});
|
||||
}
|
||||
|
||||
/// Just here for doc purposes
|
||||
fn get_benched_weight() -> Weight {
|
||||
Weight::from_parts(0, 5)
|
||||
}
|
||||
|
||||
/// Just here for doc purposes
|
||||
fn do_work() {}
|
||||
|
||||
#[docify::export_content(simple_reclaimer_example)]
|
||||
fn reclaim_with_weight_meter() {
|
||||
let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(10, 10));
|
||||
|
||||
let benched_weight = get_benched_weight();
|
||||
|
||||
// It is important to instantiate the `StorageWeightReclaimer` before we consume the weight
|
||||
// for a piece of work from the weight meter.
|
||||
let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter);
|
||||
|
||||
if remaining_weight_meter.try_consume(benched_weight).is_ok() {
|
||||
// Perform some work that takes has `benched_weight` storage weight.
|
||||
do_work();
|
||||
|
||||
// Reclaimer will detect that we only consumed 2 bytes, so 3 bytes are reclaimed.
|
||||
let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter);
|
||||
|
||||
// We reclaimed 3 bytes of storage size!
|
||||
assert_eq!(reclaimed, Some(Weight::from_parts(0, 3)));
|
||||
assert_eq!(BlockWeight::<Test>::get().total().proof_size(), 10);
|
||||
assert_eq!(remaining_weight_meter.remaining(), Weight::from_parts(10, 8));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reclaim_helper_works_with_meter() {
|
||||
// The node will report 12 - 10 = 2 consumed storage size between the calls.
|
||||
let mut test_ext = setup_test_externalities(&[10, 12]);
|
||||
|
||||
test_ext.execute_with(|| {
|
||||
// Initial storage size is 10.
|
||||
set_current_storage_weight(10);
|
||||
reclaim_with_weight_meter();
|
||||
});
|
||||
}
|
||||
@@ -46,9 +46,11 @@ cumulus-primitives-storage-weight-reclaim = { path = "../../primitives/storage-w
|
||||
[features]
|
||||
runtime-benchmarks = [
|
||||
"cumulus-primitives-core/runtime-benchmarks",
|
||||
"cumulus-primitives-storage-weight-reclaim/runtime-benchmarks",
|
||||
"cumulus-test-service/runtime-benchmarks",
|
||||
"frame-system/runtime-benchmarks",
|
||||
"pallet-balances/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"polkadot-parachain-primitives/runtime-benchmarks",
|
||||
"polkadot-primitives/runtime-benchmarks",
|
||||
"sc-service/runtime-benchmarks",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
mod block_builder;
|
||||
use codec::{Decode, Encode};
|
||||
use runtime::{
|
||||
Balance, Block, BlockHashCount, Runtime, RuntimeCall, Signature, SignedExtra, SignedPayload,
|
||||
Balance, Block, BlockHashCount, Runtime, RuntimeCall, Signature, SignedPayload, TxExtension,
|
||||
UncheckedExtrinsic, VERSION,
|
||||
};
|
||||
use sc_executor::HeapAllocStrategy;
|
||||
@@ -125,7 +125,7 @@ impl DefaultTestClientBuilderExt for TestClientBuilder {
|
||||
|
||||
/// Create an unsigned extrinsic from a runtime call.
|
||||
pub fn generate_unsigned(function: impl Into<RuntimeCall>) -> UncheckedExtrinsic {
|
||||
UncheckedExtrinsic::new_unsigned(function.into())
|
||||
UncheckedExtrinsic::new_bare(function.into())
|
||||
}
|
||||
|
||||
/// Create a signed extrinsic from a runtime call and sign
|
||||
@@ -143,7 +143,7 @@ pub fn generate_extrinsic_with_pair(
|
||||
let period =
|
||||
BlockHashCount::get().checked_next_power_of_two().map(|c| c / 2).unwrap_or(2) as u64;
|
||||
let tip = 0;
|
||||
let extra: SignedExtra = (
|
||||
let tx_ext: TxExtension = (
|
||||
frame_system::CheckNonZeroSender::<Runtime>::new(),
|
||||
frame_system::CheckSpecVersion::<Runtime>::new(),
|
||||
frame_system::CheckGenesis::<Runtime>::new(),
|
||||
@@ -152,13 +152,14 @@ pub fn generate_extrinsic_with_pair(
|
||||
frame_system::CheckWeight::<Runtime>::new(),
|
||||
pallet_transaction_payment::ChargeTransactionPayment::<Runtime>::from(tip),
|
||||
cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim::<Runtime>::new(),
|
||||
);
|
||||
)
|
||||
.into();
|
||||
|
||||
let function = function.into();
|
||||
|
||||
let raw_payload = SignedPayload::from_raw(
|
||||
function.clone(),
|
||||
extra.clone(),
|
||||
tx_ext.clone(),
|
||||
((), VERSION.spec_version, genesis_block, current_block_hash, (), (), (), ()),
|
||||
);
|
||||
let signature = raw_payload.using_encoded(|e| origin.sign(e));
|
||||
@@ -167,7 +168,7 @@ pub fn generate_extrinsic_with_pair(
|
||||
function,
|
||||
origin.public().into(),
|
||||
Signature::Sr25519(signature),
|
||||
extra,
|
||||
tx_ext,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -246,6 +246,7 @@ impl pallet_transaction_payment::Config for Runtime {
|
||||
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
||||
type FeeMultiplierUpdate = ();
|
||||
type OperationalFeeMultiplier = ConstU8<5>;
|
||||
type WeightInfo = pallet_transaction_payment::weights::SubstrateWeight<Runtime>;
|
||||
}
|
||||
|
||||
impl pallet_sudo::Config for Runtime {
|
||||
@@ -322,8 +323,8 @@ pub type Block = generic::Block<Header, UncheckedExtrinsic>;
|
||||
pub type SignedBlock = generic::SignedBlock<Block>;
|
||||
/// BlockId type as expected by this runtime.
|
||||
pub type BlockId = generic::BlockId<Block>;
|
||||
/// The SignedExtension to the basic transaction logic.
|
||||
pub type SignedExtra = (
|
||||
/// The extension to the basic transaction logic.
|
||||
pub type TxExtension = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckGenesis<Runtime>,
|
||||
@@ -335,7 +336,7 @@ pub type SignedExtra = (
|
||||
);
|
||||
/// Unchecked extrinsic type as expected by this runtime.
|
||||
pub type UncheckedExtrinsic =
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
||||
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
|
||||
/// Executive: handles dispatch to the various modules.
|
||||
pub type Executive = frame_executive::Executive<
|
||||
Runtime,
|
||||
@@ -346,7 +347,7 @@ pub type Executive = frame_executive::Executive<
|
||||
TestOnRuntimeUpgrade,
|
||||
>;
|
||||
/// The payload being signed in transactions.
|
||||
pub type SignedPayload = generic::SignedPayload<RuntimeCall, SignedExtra>;
|
||||
pub type SignedPayload = generic::SignedPayload<RuntimeCall, TxExtension>;
|
||||
|
||||
pub struct TestOnRuntimeUpgrade;
|
||||
|
||||
|
||||
@@ -104,10 +104,12 @@ substrate-test-utils = { path = "../../../substrate/test-utils" }
|
||||
runtime-benchmarks = [
|
||||
"cumulus-pallet-parachain-system/runtime-benchmarks",
|
||||
"cumulus-primitives-core/runtime-benchmarks",
|
||||
"cumulus-primitives-storage-weight-reclaim/runtime-benchmarks",
|
||||
"cumulus-test-client/runtime-benchmarks",
|
||||
"frame-system/runtime-benchmarks",
|
||||
"pallet-im-online/runtime-benchmarks",
|
||||
"pallet-timestamp/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"parachains-common/runtime-benchmarks",
|
||||
"polkadot-cli/runtime-benchmarks",
|
||||
"polkadot-primitives/runtime-benchmarks",
|
||||
|
||||
@@ -69,7 +69,7 @@ pub fn extrinsic_set_time(client: &TestClient) -> OpaqueExtrinsic {
|
||||
|
||||
let timestamp = best_number as u64 * cumulus_test_runtime::MinimumPeriod::get();
|
||||
cumulus_test_runtime::UncheckedExtrinsic {
|
||||
signature: None,
|
||||
preamble: sp_runtime::generic::Preamble::Bare,
|
||||
function: cumulus_test_runtime::RuntimeCall::Timestamp(pallet_timestamp::Call::set {
|
||||
now: timestamp,
|
||||
}),
|
||||
@@ -102,7 +102,7 @@ pub fn extrinsic_set_validation_data(
|
||||
};
|
||||
|
||||
cumulus_test_runtime::UncheckedExtrinsic {
|
||||
signature: None,
|
||||
preamble: sp_runtime::generic::Preamble::Bare,
|
||||
function: cumulus_test_runtime::RuntimeCall::ParachainSystem(
|
||||
cumulus_pallet_parachain_system::Call::set_validation_data { data },
|
||||
),
|
||||
|
||||
@@ -883,7 +883,7 @@ pub fn construct_extrinsic(
|
||||
.map(|c| c / 2)
|
||||
.unwrap_or(2) as u64;
|
||||
let tip = 0;
|
||||
let extra: runtime::SignedExtra = (
|
||||
let tx_ext: runtime::TxExtension = (
|
||||
frame_system::CheckNonZeroSender::<runtime::Runtime>::new(),
|
||||
frame_system::CheckSpecVersion::<runtime::Runtime>::new(),
|
||||
frame_system::CheckGenesis::<runtime::Runtime>::new(),
|
||||
@@ -895,10 +895,11 @@ pub fn construct_extrinsic(
|
||||
frame_system::CheckWeight::<runtime::Runtime>::new(),
|
||||
pallet_transaction_payment::ChargeTransactionPayment::<runtime::Runtime>::from(tip),
|
||||
cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim::<runtime::Runtime>::new(),
|
||||
);
|
||||
)
|
||||
.into();
|
||||
let raw_payload = runtime::SignedPayload::from_raw(
|
||||
function.clone(),
|
||||
extra.clone(),
|
||||
tx_ext.clone(),
|
||||
((), runtime::VERSION.spec_version, genesis_block, current_block_hash, (), (), (), ()),
|
||||
);
|
||||
let signature = raw_payload.using_encoded(|e| caller.sign(e));
|
||||
@@ -906,7 +907,7 @@ pub fn construct_extrinsic(
|
||||
function,
|
||||
caller.public().into(),
|
||||
runtime::Signature::Sr25519(signature),
|
||||
extra,
|
||||
tx_ext,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
//! version_and_signed,
|
||||
//! from_address,
|
||||
//! signature,
|
||||
//! signed_extensions_extra,
|
||||
//! transaction_extensions_extra,
|
||||
//! )
|
||||
//! ```
|
||||
//!
|
||||
@@ -90,31 +90,31 @@
|
||||
//! The signature type used on the Polkadot relay chain is [`sp_runtime::MultiSignature`]; the
|
||||
//! variants there are the types of signature that can be provided.
|
||||
//!
|
||||
//! ### signed_extensions_extra
|
||||
//! ### transaction_extensions_extra
|
||||
//!
|
||||
//! This is the concatenation of the [SCALE encoded][frame::deps::codec] bytes representing each of
|
||||
//! the [_signed extensions_][sp_runtime::traits::SignedExtension], and are configured by the
|
||||
//! fourth generic parameter of [`sp_runtime::generic::UncheckedExtrinsic`]. Learn more about
|
||||
//! signed extensions [here][crate::reference_docs::signed_extensions].
|
||||
//! the [_transaction extensions_][sp_runtime::traits::TransactionExtension], and are configured by
|
||||
//! the fourth generic parameter of [`sp_runtime::generic::UncheckedExtrinsic`]. Learn more about
|
||||
//! transaction extensions [here][crate::reference_docs::transaction_extensions].
|
||||
//!
|
||||
//! When it comes to constructing an extrinsic, each signed extension has two things that we are
|
||||
//! interested in here:
|
||||
//! When it comes to constructing an extrinsic, each transaction extension has two things that we
|
||||
//! are interested in here:
|
||||
//!
|
||||
//! - The actual SCALE encoding of the signed extension type itself; this is what will form our
|
||||
//! `signed_extensions_extra` bytes.
|
||||
//! - An `AdditionalSigned` type. This is SCALE encoded into the `signed_extensions_additional` data
|
||||
//! of the _signed payload_ (see below).
|
||||
//! - The actual SCALE encoding of the transaction extension type itself; this is what will form our
|
||||
//! `transaction_extensions_extra` bytes.
|
||||
//! - An `Implicit` type. This is SCALE encoded into the `transaction_extensions_implicit` data of
|
||||
//! the _signed payload_ (see below).
|
||||
//!
|
||||
//! Either (or both) of these can encode to zero bytes.
|
||||
//!
|
||||
//! Each chain configures the set of signed extensions that it uses in its runtime configuration.
|
||||
//! At the time of writing, Polkadot configures them
|
||||
//! Each chain configures the set of transaction extensions that it uses in its runtime
|
||||
//! configuration. At the time of writing, Polkadot configures them
|
||||
//! [here](https://github.com/polkadot-fellows/runtimes/blob/1dc04eb954eadf8aadb5d83990b89662dbb5a074/relay/polkadot/src/lib.rs#L1432C25-L1432C25).
|
||||
//! Some of the common signed extensions are defined
|
||||
//! [here][frame::deps::frame_system#signed-extensions].
|
||||
//! Some of the common transaction extensions are defined
|
||||
//! [here][frame::deps::frame_system#transaction-extensions].
|
||||
//!
|
||||
//! Information about exactly which signed extensions are present on a chain and in what order is
|
||||
//! also a part of the metadata for the chain. For V15 metadata, it can be
|
||||
//! Information about exactly which transaction extensions are present on a chain and in what order
|
||||
//! is also a part of the metadata for the chain. For V15 metadata, it can be
|
||||
//! [found here][frame::deps::frame_support::__private::metadata::v15::ExtrinsicMetadata].
|
||||
//!
|
||||
//! ## call_data
|
||||
@@ -163,8 +163,8 @@
|
||||
//! ```text
|
||||
//! signed_payload = concat(
|
||||
//! call_data,
|
||||
//! signed_extensions_extra,
|
||||
//! signed_extensions_additional,
|
||||
//! transaction_extensions_extra,
|
||||
//! transaction_extensions_implicit,
|
||||
//! )
|
||||
//!
|
||||
//! if length(signed_payload) > 256 {
|
||||
@@ -172,16 +172,16 @@
|
||||
//! }
|
||||
//! ```
|
||||
//!
|
||||
//! The bytes representing `call_data` and `signed_extensions_extra` can be obtained as described
|
||||
//! above. `signed_extensions_additional` is constructed by SCALE encoding the
|
||||
//! ["additional signed" data][sp_runtime::traits::SignedExtension::AdditionalSigned] for each
|
||||
//! signed extension that the chain is using, in order.
|
||||
//! The bytes representing `call_data` and `transaction_extensions_extra` can be obtained as
|
||||
//! descibed above. `transaction_extensions_implicit` is constructed by SCALE encoding the
|
||||
//! ["implicit" data][sp_runtime::traits::TransactionExtensionBase::Implicit] for each
|
||||
//! transaction extension that the chain is using, in order.
|
||||
//!
|
||||
//! Once we've concatenated those together, we hash the result if it's greater than 256 bytes in
|
||||
//! length using a Blake2 256bit hasher.
|
||||
//!
|
||||
//! The [`sp_runtime::generic::SignedPayload`] type takes care of assembling the correct payload
|
||||
//! for us, given `call_data` and a tuple of signed extensions.
|
||||
//! for us, given `call_data` and a tuple of transaction extensions.
|
||||
//!
|
||||
//! # Example Encoding
|
||||
//!
|
||||
@@ -192,11 +192,12 @@
|
||||
#[docify::export]
|
||||
pub mod call_data {
|
||||
use parity_scale_codec::{Decode, Encode};
|
||||
use sp_runtime::{traits::Dispatchable, DispatchResultWithInfo};
|
||||
|
||||
// The outer enum composes calls within
|
||||
// different pallets together. We have two
|
||||
// pallets, "PalletA" and "PalletB".
|
||||
#[derive(Encode, Decode)]
|
||||
#[derive(Encode, Decode, Clone)]
|
||||
pub enum Call {
|
||||
#[codec(index = 0)]
|
||||
PalletA(PalletACall),
|
||||
@@ -207,23 +208,33 @@ pub mod call_data {
|
||||
// An inner enum represents the calls within
|
||||
// a specific pallet. "PalletA" has one call,
|
||||
// "Foo".
|
||||
#[derive(Encode, Decode)]
|
||||
#[derive(Encode, Decode, Clone)]
|
||||
pub enum PalletACall {
|
||||
#[codec(index = 0)]
|
||||
Foo(String),
|
||||
}
|
||||
|
||||
#[derive(Encode, Decode)]
|
||||
#[derive(Encode, Decode, Clone)]
|
||||
pub enum PalletBCall {
|
||||
#[codec(index = 0)]
|
||||
Bar(String),
|
||||
}
|
||||
|
||||
impl Dispatchable for Call {
|
||||
type RuntimeOrigin = ();
|
||||
type Config = ();
|
||||
type Info = ();
|
||||
type PostInfo = ();
|
||||
fn dispatch(self, _origin: Self::RuntimeOrigin) -> DispatchResultWithInfo<Self::PostInfo> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[docify::export]
|
||||
pub mod encoding_example {
|
||||
use super::call_data::{Call, PalletACall};
|
||||
use crate::reference_docs::signed_extensions::signed_extensions_example;
|
||||
use crate::reference_docs::transaction_extensions::transaction_extensions_example;
|
||||
use parity_scale_codec::Encode;
|
||||
use sp_core::crypto::AccountId32;
|
||||
use sp_keyring::sr25519::Keyring;
|
||||
@@ -232,34 +243,40 @@ pub mod encoding_example {
|
||||
MultiAddress, MultiSignature,
|
||||
};
|
||||
|
||||
// Define some signed extensions to use. We'll use a couple of examples
|
||||
// from the signed extensions reference doc.
|
||||
type SignedExtensions =
|
||||
(signed_extensions_example::AddToPayload, signed_extensions_example::AddToSignaturePayload);
|
||||
// Define some transaction extensions to use. We'll use a couple of examples
|
||||
// from the transaction extensions reference doc.
|
||||
type TransactionExtensions = (
|
||||
transaction_extensions_example::AddToPayload,
|
||||
transaction_extensions_example::AddToSignaturePayload,
|
||||
);
|
||||
|
||||
// We'll use `UncheckedExtrinsic` to encode our extrinsic for us. We set
|
||||
// the address and signature type to those used on Polkadot, use our custom
|
||||
// `Call` type, and use our custom set of `SignedExtensions`.
|
||||
type Extrinsic =
|
||||
UncheckedExtrinsic<MultiAddress<AccountId32, ()>, Call, MultiSignature, SignedExtensions>;
|
||||
// `Call` type, and use our custom set of `TransactionExtensions`.
|
||||
type Extrinsic = UncheckedExtrinsic<
|
||||
MultiAddress<AccountId32, ()>,
|
||||
Call,
|
||||
MultiSignature,
|
||||
TransactionExtensions,
|
||||
>;
|
||||
|
||||
pub fn encode_demo_extrinsic() -> Vec<u8> {
|
||||
// The "from" address will be our Alice dev account.
|
||||
let from_address = MultiAddress::<AccountId32, ()>::Id(Keyring::Alice.to_account_id());
|
||||
|
||||
// We provide some values for our expected signed extensions.
|
||||
let signed_extensions = (
|
||||
signed_extensions_example::AddToPayload(1),
|
||||
signed_extensions_example::AddToSignaturePayload,
|
||||
// We provide some values for our expected transaction extensions.
|
||||
let transaction_extensions = (
|
||||
transaction_extensions_example::AddToPayload(1),
|
||||
transaction_extensions_example::AddToSignaturePayload,
|
||||
);
|
||||
|
||||
// Construct our call data:
|
||||
let call_data = Call::PalletA(PalletACall::Foo("Hello".to_string()));
|
||||
|
||||
// The signed payload. This takes care of encoding the call_data,
|
||||
// signed_extensions_extra and signed_extensions_additional, and hashing
|
||||
// transaction_extensions_extra and transaction_extensions_implicit, and hashing
|
||||
// the result if it's > 256 bytes:
|
||||
let signed_payload = SignedPayload::new(&call_data, signed_extensions.clone());
|
||||
let signed_payload = SignedPayload::new(call_data.clone(), transaction_extensions.clone());
|
||||
|
||||
// Sign the signed payload with our Alice dev account's private key,
|
||||
// and wrap the signature into the expected type:
|
||||
@@ -269,7 +286,7 @@ pub mod encoding_example {
|
||||
};
|
||||
|
||||
// Now, we can build and encode our extrinsic:
|
||||
let ext = Extrinsic::new_signed(call_data, from_address, signature, signed_extensions);
|
||||
let ext = Extrinsic::new_signed(call_data, from_address, signature, transaction_extensions);
|
||||
|
||||
let encoded_ext = ext.encode();
|
||||
encoded_ext
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
//! * [`crate::reference_docs::frame_origin`] explores further details about the usage of
|
||||
//! `RuntimeOrigin`.
|
||||
//! * [`RuntimeCall`] is a particularly interesting composite enum as it dictates the encoding of an
|
||||
//! extrinsic. See [`crate::reference_docs::signed_extensions`] for more information.
|
||||
//! extrinsic. See [`crate::reference_docs::transaction_extensions`] for more information.
|
||||
//! * See the documentation of [`construct_runtime`].
|
||||
//! * See the corresponding lecture in the [pba-book](https://polkadot-blockchain-academy.github.io/pba-book/frame/outer-enum/page.html).
|
||||
//!
|
||||
|
||||
@@ -39,9 +39,9 @@ pub mod runtime_vs_smart_contract;
|
||||
/// Learn about how extrinsics are encoded to be transmitted to a node and stored in blocks.
|
||||
pub mod extrinsic_encoding;
|
||||
|
||||
/// Learn about the signed extensions that form a part of extrinsics.
|
||||
/// Learn about the transaction extensions that form a part of extrinsics.
|
||||
// TODO: @jsdw https://github.com/paritytech/polkadot-sdk-docs/issues/42
|
||||
pub mod signed_extensions;
|
||||
pub mod transaction_extensions;
|
||||
|
||||
/// Learn about *Origins*, a topic in FRAME that enables complex account abstractions to be built.
|
||||
pub mod frame_origin;
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
//! Signed extensions are, briefly, a means for different chains to extend the "basic" extrinsic
|
||||
//! format with custom data that can be checked by the runtime.
|
||||
//!
|
||||
//! # Example
|
||||
//!
|
||||
//! Defining a couple of very simple signed extensions looks like the following:
|
||||
#![doc = docify::embed!("./src/reference_docs/signed_extensions.rs", signed_extensions_example)]
|
||||
|
||||
#[docify::export]
|
||||
pub mod signed_extensions_example {
|
||||
use parity_scale_codec::{Decode, Encode};
|
||||
use scale_info::TypeInfo;
|
||||
use sp_runtime::traits::SignedExtension;
|
||||
|
||||
// This doesn't actually check anything, but simply allows
|
||||
// some arbitrary `u32` to be added to the extrinsic payload
|
||||
#[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, TypeInfo)]
|
||||
pub struct AddToPayload(pub u32);
|
||||
|
||||
impl SignedExtension for AddToPayload {
|
||||
const IDENTIFIER: &'static str = "AddToPayload";
|
||||
type AccountId = ();
|
||||
type Call = ();
|
||||
type AdditionalSigned = ();
|
||||
type Pre = ();
|
||||
|
||||
fn additional_signed(
|
||||
&self,
|
||||
) -> Result<
|
||||
Self::AdditionalSigned,
|
||||
sp_runtime::transaction_validity::TransactionValidityError,
|
||||
> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn pre_dispatch(
|
||||
self,
|
||||
_who: &Self::AccountId,
|
||||
_call: &Self::Call,
|
||||
_info: &sp_runtime::traits::DispatchInfoOf<Self::Call>,
|
||||
_len: usize,
|
||||
) -> Result<Self::Pre, sp_runtime::transaction_validity::TransactionValidityError> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
// This is the opposite; nothing will be added to the extrinsic payload,
|
||||
// but the AdditionalSigned type (`1234u32`) will be added to the
|
||||
// payload to be signed.
|
||||
#[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, TypeInfo)]
|
||||
pub struct AddToSignaturePayload;
|
||||
|
||||
impl SignedExtension for AddToSignaturePayload {
|
||||
const IDENTIFIER: &'static str = "AddToSignaturePayload";
|
||||
type AccountId = ();
|
||||
type Call = ();
|
||||
type AdditionalSigned = u32;
|
||||
type Pre = ();
|
||||
|
||||
fn additional_signed(
|
||||
&self,
|
||||
) -> Result<
|
||||
Self::AdditionalSigned,
|
||||
sp_runtime::transaction_validity::TransactionValidityError,
|
||||
> {
|
||||
Ok(1234)
|
||||
}
|
||||
|
||||
fn pre_dispatch(
|
||||
self,
|
||||
_who: &Self::AccountId,
|
||||
_call: &Self::Call,
|
||||
_info: &sp_runtime::traits::DispatchInfoOf<Self::Call>,
|
||||
_len: usize,
|
||||
) -> Result<Self::Pre, sp_runtime::transaction_validity::TransactionValidityError> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
//! Transaction extensions are, briefly, a means for different chains to extend the "basic"
|
||||
//! extrinsic format with custom data that can be checked by the runtime.
|
||||
//!
|
||||
//! # Example
|
||||
//!
|
||||
//! Defining a couple of very simple transaction extensions looks like the following:
|
||||
#![doc = docify::embed!("./src/reference_docs/transaction_extensions.rs", transaction_extensions_example)]
|
||||
|
||||
#[docify::export]
|
||||
pub mod transaction_extensions_example {
|
||||
use parity_scale_codec::{Decode, Encode};
|
||||
use scale_info::TypeInfo;
|
||||
use sp_runtime::{
|
||||
impl_tx_ext_default,
|
||||
traits::{Dispatchable, TransactionExtension, TransactionExtensionBase},
|
||||
TransactionValidityError,
|
||||
};
|
||||
|
||||
// This doesn't actually check anything, but simply allows
|
||||
// some arbitrary `u32` to be added to the extrinsic payload
|
||||
#[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, TypeInfo)]
|
||||
pub struct AddToPayload(pub u32);
|
||||
|
||||
impl TransactionExtensionBase for AddToPayload {
|
||||
const IDENTIFIER: &'static str = "AddToPayload";
|
||||
type Implicit = ();
|
||||
}
|
||||
|
||||
impl<Call: Dispatchable> TransactionExtension<Call, ()> for AddToPayload {
|
||||
type Pre = ();
|
||||
type Val = ();
|
||||
|
||||
impl_tx_ext_default!(Call; (); validate prepare);
|
||||
}
|
||||
|
||||
// This is the opposite; nothing will be added to the extrinsic payload,
|
||||
// but the Implicit type (`1234u32`) will be added to the
|
||||
// payload to be signed.
|
||||
#[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, TypeInfo)]
|
||||
pub struct AddToSignaturePayload;
|
||||
|
||||
impl TransactionExtensionBase for AddToSignaturePayload {
|
||||
const IDENTIFIER: &'static str = "AddToSignaturePayload";
|
||||
type Implicit = u32;
|
||||
|
||||
fn implicit(&self) -> Result<Self::Implicit, TransactionValidityError> {
|
||||
Ok(1234)
|
||||
}
|
||||
}
|
||||
|
||||
impl<Call: Dispatchable> TransactionExtension<Call, ()> for AddToSignaturePayload {
|
||||
type Pre = ();
|
||||
type Val = ();
|
||||
|
||||
impl_tx_ext_default!(Call; (); validate prepare);
|
||||
}
|
||||
}
|
||||
@@ -196,6 +196,7 @@ runtime-benchmarks = [
|
||||
"pallet-babe/runtime-benchmarks",
|
||||
"pallet-im-online/runtime-benchmarks",
|
||||
"pallet-staking/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"polkadot-parachain-primitives/runtime-benchmarks",
|
||||
"polkadot-primitives/runtime-benchmarks",
|
||||
"polkadot-runtime-parachains/runtime-benchmarks",
|
||||
|
||||
@@ -189,7 +189,7 @@ fn westend_sign_call(
|
||||
use sp_core::Pair;
|
||||
use westend_runtime as runtime;
|
||||
|
||||
let extra: runtime::SignedExtra = (
|
||||
let tx_ext: runtime::TxExtension = (
|
||||
frame_system::CheckNonZeroSender::<runtime::Runtime>::new(),
|
||||
frame_system::CheckSpecVersion::<runtime::Runtime>::new(),
|
||||
frame_system::CheckTxVersion::<runtime::Runtime>::new(),
|
||||
@@ -201,11 +201,12 @@ fn westend_sign_call(
|
||||
frame_system::CheckNonce::<runtime::Runtime>::from(nonce),
|
||||
frame_system::CheckWeight::<runtime::Runtime>::new(),
|
||||
pallet_transaction_payment::ChargeTransactionPayment::<runtime::Runtime>::from(0),
|
||||
);
|
||||
)
|
||||
.into();
|
||||
|
||||
let payload = runtime::SignedPayload::from_raw(
|
||||
call.clone(),
|
||||
extra.clone(),
|
||||
tx_ext.clone(),
|
||||
(
|
||||
(),
|
||||
runtime::VERSION.spec_version,
|
||||
@@ -223,7 +224,7 @@ fn westend_sign_call(
|
||||
call,
|
||||
sp_runtime::AccountId32::from(acc.public()).into(),
|
||||
polkadot_core_primitives::Signature::Sr25519(signature.clone()),
|
||||
extra,
|
||||
tx_ext,
|
||||
)
|
||||
.into()
|
||||
}
|
||||
@@ -241,7 +242,7 @@ fn rococo_sign_call(
|
||||
use rococo_runtime as runtime;
|
||||
use sp_core::Pair;
|
||||
|
||||
let extra: runtime::SignedExtra = (
|
||||
let tx_ext: runtime::TxExtension = (
|
||||
frame_system::CheckNonZeroSender::<runtime::Runtime>::new(),
|
||||
frame_system::CheckSpecVersion::<runtime::Runtime>::new(),
|
||||
frame_system::CheckTxVersion::<runtime::Runtime>::new(),
|
||||
@@ -253,11 +254,12 @@ fn rococo_sign_call(
|
||||
frame_system::CheckNonce::<runtime::Runtime>::from(nonce),
|
||||
frame_system::CheckWeight::<runtime::Runtime>::new(),
|
||||
pallet_transaction_payment::ChargeTransactionPayment::<runtime::Runtime>::from(0),
|
||||
);
|
||||
)
|
||||
.into();
|
||||
|
||||
let payload = runtime::SignedPayload::from_raw(
|
||||
call.clone(),
|
||||
extra.clone(),
|
||||
tx_ext.clone(),
|
||||
(
|
||||
(),
|
||||
runtime::VERSION.spec_version,
|
||||
@@ -275,7 +277,7 @@ fn rococo_sign_call(
|
||||
call,
|
||||
sp_runtime::AccountId32::from(acc.public()).into(),
|
||||
polkadot_core_primitives::Signature::Sr25519(signature.clone()),
|
||||
extra,
|
||||
tx_ext,
|
||||
)
|
||||
.into()
|
||||
}
|
||||
|
||||
@@ -71,6 +71,7 @@ runtime-benchmarks = [
|
||||
"frame-system/runtime-benchmarks",
|
||||
"pallet-balances/runtime-benchmarks",
|
||||
"pallet-staking/runtime-benchmarks",
|
||||
"pallet-transaction-payment/runtime-benchmarks",
|
||||
"polkadot-parachain-primitives/runtime-benchmarks",
|
||||
"polkadot-primitives/runtime-benchmarks",
|
||||
"polkadot-runtime-common/runtime-benchmarks",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user