Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Commit

Permalink
XCM: Limit the max number of assets weighable in MultiAssets (#6786)
Browse files Browse the repository at this point in the history
* Limit the max number of assets weighable in MultiAssets

* Apply suggestions from code review

Co-authored-by: Gavin Wood <gavin@parity.io>

* Add tests

* cargo fmt

* Include proof size weight in tests

* Add comments

---------

Co-authored-by: Gavin Wood <gavin@parity.io>
  • Loading branch information
KiChjang and gavofyork authored Feb 28, 2023
1 parent c9f0ed2 commit 9d74985
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 9 deletions.
17 changes: 14 additions & 3 deletions runtime/kusama/src/weights/xcm/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ trait WeighMultiAssets {
}

// Kusama only knows about one asset, the balances pallet.
const MAX_ASSETS: u32 = 1;
const MAX_ASSETS: u64 = 1;

impl WeighMultiAssets for MultiAssetFilter {
fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight {
Expand All @@ -62,9 +62,12 @@ impl WeighMultiAssets for MultiAssetFilter {
AssetTypes::Unknown => Weight::MAX,
})
.fold(Weight::zero(), |acc, x| acc.saturating_add(x)),
// We don't support any NFTs on Kusama, so these two variants will always match
// only 1 kind of fungible asset.
Self::Wild(AllOf { .. } | AllOfCounted { .. }) => balances_weight,
Self::Wild(AllCounted(count)) => balances_weight.saturating_mul(*count as u64),
Self::Wild(All) => balances_weight.saturating_mul(MAX_ASSETS as u64),
Self::Wild(AllCounted(count)) =>
balances_weight.saturating_mul(MAX_ASSETS.min(*count as u64)),
Self::Wild(All) => balances_weight.saturating_mul(MAX_ASSETS),
}
}
}
Expand Down Expand Up @@ -275,3 +278,11 @@ impl<RuntimeCall> XcmWeightInfo<RuntimeCall> for KusamaXcmWeight<RuntimeCall> {
XcmGeneric::<Runtime>::unpaid_execution()
}
}

#[test]
fn all_counted_has_a_sane_weight_upper_limit() {
let assets = MultiAssetFilter::Wild(AllCounted(4294967295));
let weight = Weight::from_parts(1000, 1000);

assert_eq!(assets.weigh_multi_assets(weight), weight * MAX_ASSETS);
}
16 changes: 16 additions & 0 deletions runtime/kusama/src/xcm_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -457,3 +457,19 @@ impl pallet_xcm::Config for Runtime {
#[cfg(feature = "runtime-benchmarks")]
type ReachableDest = ReachableDest;
}

#[test]
fn karura_liquid_staking_xcm_has_sane_weight_upper_limt() {
use parity_scale_codec::Decode;
use xcm::VersionedXcm;
use xcm_executor::traits::WeightBounds;
let blob = hex_literal::hex!("02140004000000000700e40b540213000000000700e40b54020006010700c817a804341801000006010b00c490bf4302140d010003ffffffff000100411f");
let Ok(VersionedXcm::V2(old_xcm)) =
VersionedXcm::<super::RuntimeCall>::decode(&mut &blob[..]) else { panic!("can't decode XCM blob") };
let mut xcm: Xcm<super::RuntimeCall> =
old_xcm.try_into().expect("conversion from v2 to v3 failed");
let weight = <XcmConfig as xcm_executor::Config>::Weigher::weight(&mut xcm)
.expect("weighing XCM failed");

assert_eq!(weight, Weight::from_parts(20_313_281_000, 65536));
}
17 changes: 14 additions & 3 deletions runtime/rococo/src/weights/xcm/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ trait WeighMultiAssets {
}

// Rococo only knows about one asset, the balances pallet.
const MAX_ASSETS: u32 = 1;
const MAX_ASSETS: u64 = 1;

impl WeighMultiAssets for MultiAssetFilter {
fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight {
Expand All @@ -62,9 +62,12 @@ impl WeighMultiAssets for MultiAssetFilter {
AssetTypes::Unknown => Weight::MAX,
})
.fold(Weight::zero(), |acc, x| acc.saturating_add(x)),
// We don't support any NFTs on Rococo, so these two variants will always match
// only 1 kind of fungible asset.
Self::Wild(AllOf { .. } | AllOfCounted { .. }) => balances_weight,
Self::Wild(AllCounted(count)) => balances_weight.saturating_mul(*count as u64),
Self::Wild(All) => balances_weight.saturating_mul(MAX_ASSETS as u64),
Self::Wild(AllCounted(count)) =>
balances_weight.saturating_mul(MAX_ASSETS.min(*count as u64)),
Self::Wild(All) => balances_weight.saturating_mul(MAX_ASSETS),
}
}
}
Expand Down Expand Up @@ -275,3 +278,11 @@ impl<RuntimeCall> XcmWeightInfo<RuntimeCall> for RococoXcmWeight<RuntimeCall> {
XcmGeneric::<Runtime>::unpaid_execution()
}
}

#[test]
fn all_counted_has_a_sane_weight_upper_limit() {
let assets = MultiAssetFilter::Wild(AllCounted(4294967295));
let weight = Weight::from_parts(1000, 1000);

assert_eq!(assets.weigh_multi_assets(weight), weight * MAX_ASSETS);
}
17 changes: 14 additions & 3 deletions runtime/westend/src/weights/xcm/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ trait WeighMultiAssets {
}

// Westend only knows about one asset, the balances pallet.
const MAX_ASSETS: u32 = 1;
const MAX_ASSETS: u64 = 1;

impl WeighMultiAssets for MultiAssetFilter {
fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight {
Expand All @@ -65,9 +65,12 @@ impl WeighMultiAssets for MultiAssetFilter {
AssetTypes::Unknown => Weight::MAX,
})
.fold(Weight::zero(), |acc, x| acc.saturating_add(x)),
// We don't support any NFTs on Westend, so these two variants will always match
// only 1 kind of fungible asset.
Self::Wild(AllOf { .. } | AllOfCounted { .. }) => balances_weight,
Self::Wild(AllCounted(count)) => balances_weight.saturating_mul(*count as u64),
Self::Wild(All) => balances_weight.saturating_mul(MAX_ASSETS as u64),
Self::Wild(AllCounted(count)) =>
balances_weight.saturating_mul(MAX_ASSETS.min(*count as u64)),
Self::Wild(All) => balances_weight.saturating_mul(MAX_ASSETS),
}
}
}
Expand Down Expand Up @@ -279,3 +282,11 @@ impl<RuntimeCall> XcmWeightInfo<RuntimeCall> for WestendXcmWeight<RuntimeCall> {
XcmGeneric::<Runtime>::unpaid_execution()
}
}

#[test]
fn all_counted_has_a_sane_weight_upper_limit() {
let assets = MultiAssetFilter::Wild(AllCounted(4294967295));
let weight = Weight::from_parts(1000, 1000);

assert_eq!(assets.weigh_multi_assets(weight), weight * MAX_ASSETS);
}

0 comments on commit 9d74985

Please sign in to comment.