XCM: Limit the max number of assets weighable in MultiAssets (#6786)

* 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>
This commit is contained in:
Keith Yeung
2023-02-28 01:12:12 -08:00
committed by GitHub
parent 65fdcf3413
commit 56f6b39da8
4 changed files with 58 additions and 9 deletions
+14 -3
View File
@@ -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 {
@@ -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),
}
}
}
@@ -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);
}