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

XCM: Properly set the pricing for the DMP router #6843

Merged
merged 46 commits into from
Apr 20, 2023
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
145af81
Properly set the pricing for the DMP router
KiChjang Mar 8, 2023
d489025
Publicize price types
KiChjang Mar 8, 2023
39f90fe
Use FixedU128 instead of Percent
KiChjang Mar 9, 2023
824f045
Add sp-arithmetic as a dependency for rococo runtime
KiChjang Mar 9, 2023
f4e0d66
Add sp-arithmetic as a dependency to all runtimes
KiChjang Mar 9, 2023
7a49275
Remove duplicate import
KiChjang Mar 9, 2023
59d6693
Add missing import
KiChjang Mar 9, 2023
500b42f
Fix tests
KiChjang Mar 9, 2023
633430c
Create an appropriate QueueDownwardMessageError variant
KiChjang Mar 10, 2023
7f27521
Recalculate delivery fee factor based on past queue sizes
KiChjang Mar 10, 2023
2fe3547
Remove unused error variant
KiChjang Mar 10, 2023
3f6ea59
Fixes
KiChjang Mar 10, 2023
c36de96
Fixes
KiChjang Mar 10, 2023
7e3d876
Remove unused imports
KiChjang Mar 10, 2023
c5a622d
Rewrite fee factor update mechanism
KiChjang Mar 15, 2023
c83126b
Remove unused imports
KiChjang Mar 15, 2023
85141d2
Merge remote-tracking branch 'origin/master' into kckyeung/xcm-sender…
KiChjang Mar 15, 2023
8c7c9f9
Fixes
KiChjang Mar 15, 2023
395a70b
Update runtime/parachains/src/dmp.rs
KiChjang Mar 16, 2023
a938c9c
Make DeliveryFeeFactor be a StorageMap keyed on ParaIds
KiChjang Mar 21, 2023
56a018d
Fixes
KiChjang Mar 21, 2023
758ff41
merge master
vstam1 Mar 22, 2023
838b9b5
introduce limit for fee increase on dmp queue
vstam1 Mar 22, 2023
1a2bcd6
add message_size based fee factor to increment_fee_factor
vstam1 Mar 23, 2023
3546698
change message_size fee rate to correct value
vstam1 Mar 23, 2023
da90e35
fix div by 0 error
vstam1 Mar 23, 2023
9eefb51
bind limit to variable
vstam1 Mar 23, 2023
5310ce1
merge master
vstam1 Mar 23, 2023
7086ec1
fix message_size_factor and add DeliveryFeeFactor test
vstam1 Mar 24, 2023
f2f0427
add test for ExponentialPrice implementation
vstam1 Mar 27, 2023
e1fa338
make test formula based
vstam1 Mar 27, 2023
303d7d5
make delivery fee factor test formula based
vstam1 Mar 27, 2023
8588ce9
add max value test for DeliveryFeeFactor and move limit to config
vstam1 Mar 28, 2023
7f6cfdf
change threshold back to dynamic value and fix tests
vstam1 Mar 30, 2023
759277c
fmt
vstam1 Mar 30, 2023
a6a7fd9
suggested changes and fmt
vstam1 Mar 31, 2023
0a2a6e7
merge master
vstam1 Mar 31, 2023
d92d990
small stylistic change
vstam1 Apr 3, 2023
aafbb68
merge master
vstam1 Apr 3, 2023
d0c5de1
fmt
vstam1 Apr 3, 2023
ea42774
change to tokenlocation
vstam1 Apr 4, 2023
1732846
small fixes
vstam1 Apr 11, 2023
56fe04d
fmt
vstam1 Apr 11, 2023
2f7acd1
remove sp_arithmetic dependency
vstam1 Apr 14, 2023
8b4877a
Merge branch 'master' into kckyeung/xcm-sender-price
vstam1 Apr 19, 2023
a7e5ded
Update runtime/parachains/src/dmp.rs
vstam1 Apr 20, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion runtime/kusama/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", d
inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
offchain-primitives = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-arithmetic = { package = "sp-arithmetic", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-mmr-primitives = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
Expand Down Expand Up @@ -128,6 +128,7 @@ std = [
"parity-scale-codec/std",
"scale-info/std",
"inherents/std",
"sp-arithmetic/std",
"sp-core/std",
"sp-api/std",
"tx-pool-api/std",
Expand Down
2 changes: 1 addition & 1 deletion runtime/kusama/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1416,7 +1416,7 @@ construct_runtime! {
ParaScheduler: parachains_scheduler::{Pallet, Storage} = 55,
Paras: parachains_paras::{Pallet, Call, Storage, Event, Config, ValidateUnsigned} = 56,
Initializer: parachains_initializer::{Pallet, Call, Storage} = 57,
Dmp: parachains_dmp::{Pallet, Call, Storage} = 58,
Dmp: parachains_dmp::{Pallet, Storage} = 58,
Copy link
Contributor

Choose a reason for hiding this comment

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

this could be all refactored to use default parts in the future, no?

Ump: parachains_ump::{Pallet, Call, Storage, Event} = 59,
Hrmp: parachains_hrmp::{Pallet, Call, Storage, Event<T>, Config} = 60,
ParaSessionInfo: parachains_session_info::{Pallet, Storage} = 61,
Expand Down
35 changes: 30 additions & 5 deletions runtime/kusama/src/xcm_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,22 @@
//! XCM configurations for the Kusama runtime.

use super::{
parachains_origin, AccountId, AllPalletsWithSystem, Balances, CouncilCollective, Fellows,
ParaId, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, StakingAdmin, WeightToFee,
XcmPallet,
parachains_dmp, parachains_origin, AccountId, AllPalletsWithSystem, Balances,
CouncilCollective, Dmp, Fellows, ParaId, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin,
StakingAdmin, TransactionByteFee, WeightToFee, XcmPallet,
};
use frame_support::{
match_types, parameter_types,
traits::{Contains, Everything, Nothing},
weights::Weight,
};
use runtime_common::{paras_registrar, xcm_sender, ToAuthor};
use kusama_runtime_constants::currency::CENTS;
use runtime_common::{
paras_registrar,
xcm_sender::{ChildParachainRouter, PriceForParachainDelivery},
ToAuthor,
};
use sp_arithmetic::FixedPointNumber;
use sp_core::ConstU32;
use xcm::latest::prelude::*;
use xcm_builder::{
Expand Down Expand Up @@ -103,11 +109,30 @@ parameter_types! {
pub const MaxInstructions: u32 = 100;
}

pub struct ExponentialKsmPrice;
impl PriceForParachainDelivery for ExponentialKsmPrice {
fn price_for_parachain_delivery(para: ParaId, msg: &Xcm<()>) -> MultiAssets {
let base = CENTS.saturating_mul(3);
let msg_fee = (msg.len() as u128).saturating_mul(TransactionByteFee::get());
KiChjang marked this conversation as resolved.
Show resolved Hide resolved

let excess_msgs =
Dmp::dmq_length(para).saturating_sub(parachains_dmp::MAX_MESSAGE_QUEUE_SIZE) as usize;
let factor = if excess_msgs != 0 {
Dmp::raise_fee_factor(excess_msgs)
} else {
Dmp::reduce_fee_factor(1)
};

let amount = factor.saturating_mul_int(base + msg_fee);
(Here, amount).into()
}
}

/// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our
/// individual routers.
pub type XcmRouter = (
// Only one router so far - use DMP to communicate with child parachains.
xcm_sender::ChildParachainRouter<Runtime, XcmPallet, ()>,
ChildParachainRouter<Runtime, XcmPallet, ExponentialKsmPrice>,
);

parameter_types! {
Expand Down
60 changes: 42 additions & 18 deletions runtime/parachains/src/dmp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ use crate::{
};
use frame_support::pallet_prelude::*;
use primitives::{DownwardMessage, Hash, Id as ParaId, InboundDownwardMessage};
use sp_runtime::traits::{BlakeTwo256, Hash as HashT, SaturatedConversion};
use sp_runtime::{
traits::{BlakeTwo256, Hash as HashT, SaturatedConversion},
FixedU128, Saturating,
};
use sp_std::{fmt, prelude::*};
use xcm::latest::SendError;

Expand All @@ -29,7 +32,8 @@ pub use pallet::*;
#[cfg(test)]
mod tests;

pub const MAX_MESSAGE_QUEUE_SIZE: usize = 1024;
pub const MAX_MESSAGE_QUEUE_SIZE: u32 = 1024;
pub const MULTIPLICATIVE_FEE_FACTOR: FixedU128 = FixedU128::from_rational(101, 100); // 1.01
vstam1 marked this conversation as resolved.
Show resolved Hide resolved

/// An error sending a downward message.
#[cfg_attr(test, derive(Debug))]
Expand Down Expand Up @@ -103,8 +107,14 @@ pub mod pallet {
pub(crate) type DownwardMessageQueueHeads<T: Config> =
StorageMap<_, Twox64Concat, ParaId, Hash, ValueQuery>;

#[pallet::call]
impl<T: Config> Pallet<T> {}
frame_support::parameter_types! {
vstam1 marked this conversation as resolved.
Show resolved Hide resolved
pub InitialFactor: FixedU128 = FixedU128::from_u32(1);
}

/// The number to multiply the base delivery fee by.
#[pallet::storage]
pub(crate) type DeliveryFeeFactor<T: Config> =
ggwpez marked this conversation as resolved.
Show resolved Hide resolved
StorageValue<_, FixedU128, ValueQuery, InitialFactor>;
}

/// Routines and getters related to downward message passing.
Expand Down Expand Up @@ -144,20 +154,14 @@ impl<T: Config> Pallet<T> {
/// `queue_downward_message` with the same parameters will be successful.
pub fn can_queue_downward_message(
config: &HostConfiguration<T::BlockNumber>,
para: &ParaId,
_: &ParaId,
msg: &DownwardMessage,
) -> Result<(), QueueDownwardMessageError> {
let serialized_len = msg.len() as u32;
if serialized_len > config.max_downward_message_size {
return Err(QueueDownwardMessageError::ExceedsMaxMessageSize)
}

if <Self as Store>::DownwardMessageQueues::decode_len(para).unwrap_or(0) >
MAX_MESSAGE_QUEUE_SIZE
{
return Err(QueueDownwardMessageError::ExceedsMaxMessageSize)
}

Ok(())
}

Expand All @@ -179,12 +183,6 @@ impl<T: Config> Pallet<T> {
return Err(QueueDownwardMessageError::ExceedsMaxMessageSize)
}

if <Self as Store>::DownwardMessageQueues::decode_len(para).unwrap_or(0) >
MAX_MESSAGE_QUEUE_SIZE
{
return Err(QueueDownwardMessageError::ExceedsMaxMessageSize)
}

let inbound =
InboundDownwardMessage { msg, sent_at: <frame_system::Pallet<T>>::block_number() };

Expand Down Expand Up @@ -247,7 +245,7 @@ impl<T: Config> Pallet<T> {
/// Returns the number of pending downward messages addressed to the given para.
///
/// Returns 0 if the para doesn't have an associated downward message queue.
pub(crate) fn dmq_length(para: ParaId) -> u32 {
pub fn dmq_length(para: ParaId) -> u32 {
<Self as Store>::DownwardMessageQueues::decode_len(&para)
.unwrap_or(0)
.saturated_into::<u32>()
Expand All @@ -259,4 +257,30 @@ impl<T: Config> Pallet<T> {
pub(crate) fn dmq_contents(recipient: ParaId) -> Vec<InboundDownwardMessage<T::BlockNumber>> {
<Self as Store>::DownwardMessageQueues::get(&recipient)
}

/// Raise the delivery fee factor by a multiplicative factor to the power of `n`, and stores
/// the resulting value.
///
/// Returns the new delivery fee factor after the raise.
pub fn raise_fee_factor(n: usize) -> FixedU128 {
<DeliveryFeeFactor<T>>::mutate(|f| {
let factor = MULTIPLICATIVE_FEE_FACTOR.saturating_pow(n);
*f = f.saturating_mul(factor);
*f
})
}

/// Reduce the delivery fee factor by a multiplicative factor to the power of `n`, and stores
/// the resulting value.
///
/// Does not reduce the fee factor below the initial value, which is currently set as 1.
///
/// Returns the new delivery fee factor after the reduction.
pub fn reduce_fee_factor(n: usize) -> FixedU128 {
<DeliveryFeeFactor<T>>::mutate(|f| {
let factor = MULTIPLICATIVE_FEE_FACTOR.saturating_pow(n);
*f = InitialFactor::get().min(*f / factor);
*f
})
}
}
2 changes: 2 additions & 0 deletions runtime/polkadot/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ block-builder-api = { package = "sp-block-builder", git = "https://github.com/pa
inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
offchain-primitives = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
Expand Down Expand Up @@ -120,6 +121,7 @@ std = [
"parity-scale-codec/std",
"scale-info/std",
"inherents/std",
"sp-arithmetic/std",
"sp-core/std",
"sp-api/std",
"tx-pool-api/std",
Expand Down
2 changes: 1 addition & 1 deletion runtime/polkadot/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1536,7 +1536,7 @@ construct_runtime! {
ParaScheduler: parachains_scheduler::{Pallet, Storage} = 55,
Paras: parachains_paras::{Pallet, Call, Storage, Event, Config, ValidateUnsigned} = 56,
Initializer: parachains_initializer::{Pallet, Call, Storage} = 57,
Dmp: parachains_dmp::{Pallet, Call, Storage} = 58,
Dmp: parachains_dmp::{Pallet, Storage} = 58,
Ump: parachains_ump::{Pallet, Call, Storage, Event} = 59,
Hrmp: parachains_hrmp::{Pallet, Call, Storage, Event<T>, Config} = 60,
ParaSessionInfo: parachains_session_info::{Pallet, Storage} = 61,
Expand Down
34 changes: 30 additions & 4 deletions runtime/polkadot/src/xcm_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,22 @@
//! XCM configuration for Polkadot.

use super::{
parachains_origin, AccountId, AllPalletsWithSystem, Balances, CouncilCollective, ParaId,
Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmPallet,
parachains_dmp, parachains_origin, AccountId, AllPalletsWithSystem, Balances,
CouncilCollective, Dmp, ParaId, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin,
TransactionByteFee, WeightToFee, XcmPallet,
};
use frame_support::{
match_types, parameter_types,
traits::{Contains, Everything, Nothing},
weights::Weight,
};
use runtime_common::{paras_registrar, xcm_sender, ToAuthor};
use polkadot_runtime_constants::currency::CENTS;
use runtime_common::{
paras_registrar,
xcm_sender::{ChildParachainRouter, PriceForParachainDelivery},
ToAuthor,
};
use sp_arithmetic::FixedPointNumber;
use sp_core::ConstU32;
use xcm::latest::prelude::*;
use xcm_builder::{
Expand Down Expand Up @@ -101,11 +108,30 @@ parameter_types! {
pub const MaxInstructions: u32 = 100;
}

pub struct ExponentialDotPrice;
impl PriceForParachainDelivery for ExponentialDotPrice {
fn price_for_parachain_delivery(para: ParaId, msg: &Xcm<()>) -> MultiAssets {
let base = CENTS.saturating_mul(3);
let msg_fee = (msg.len() as u128).saturating_mul(TransactionByteFee::get());

let excess_msgs =
Dmp::dmq_length(para).saturating_sub(parachains_dmp::MAX_MESSAGE_QUEUE_SIZE) as usize;
let factor = if excess_msgs != 0 {
Dmp::raise_fee_factor(excess_msgs)
} else {
Dmp::reduce_fee_factor(1)
};

let amount = factor.saturating_mul_int(base + msg_fee);
(Here, amount).into()
}
}

/// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our
/// individual routers.
pub type XcmRouter = (
// Only one router so far - use DMP to communicate with child parachains.
xcm_sender::ChildParachainRouter<Runtime, XcmPallet, ()>,
ChildParachainRouter<Runtime, XcmPallet, ExponentialDotPrice>,
);

parameter_types! {
Expand Down
2 changes: 2 additions & 0 deletions runtime/rococo/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", de
sp-mmr-primitives = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
Copy link
Member

Choose a reason for hiding this comment

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

Same?

sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
Expand Down Expand Up @@ -112,6 +113,7 @@ std = [
"parity-scale-codec/std",
"scale-info/std",
"inherents/std",
"sp-arithmetic/std",
"sp-core/std",
"sp-api/std",
"tx-pool-api/std",
Expand Down
2 changes: 1 addition & 1 deletion runtime/rococo/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1424,7 +1424,7 @@ construct_runtime! {
ParaScheduler: parachains_scheduler::{Pallet, Storage} = 55,
Paras: parachains_paras::{Pallet, Call, Storage, Event, Config, ValidateUnsigned} = 56,
Initializer: parachains_initializer::{Pallet, Call, Storage} = 57,
Dmp: parachains_dmp::{Pallet, Call, Storage} = 58,
Dmp: parachains_dmp::{Pallet, Storage} = 58,
Ump: parachains_ump::{Pallet, Call, Storage, Event} = 59,
Hrmp: parachains_hrmp::{Pallet, Call, Storage, Event<T>, Config} = 60,
ParaSessionInfo: parachains_session_info::{Pallet, Storage} = 61,
Expand Down
35 changes: 31 additions & 4 deletions runtime/rococo/src/xcm_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,22 @@
//! XCM configuration for Rococo.

use super::{
parachains_origin, AccountId, AllPalletsWithSystem, Balances, CouncilCollective, ParaId,
Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmPallet,
parachains_dmp, parachains_origin, AccountId, AllPalletsWithSystem, Balances,
CouncilCollective, Dmp, ParaId, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin,
TransactionByteFee, WeightToFee, XcmPallet,
};
use frame_support::{
match_types, parameter_types,
traits::{Contains, Everything, Nothing},
weights::Weight,
};
use runtime_common::{paras_registrar, xcm_sender, ToAuthor};
use rococo_runtime_constants::currency::CENTS;
use runtime_common::{
paras_registrar,
xcm_sender::{ChildParachainRouter, PriceForParachainDelivery},
ToAuthor,
};
use sp_arithmetic::FixedPointNumber;
use sp_core::ConstU32;
use xcm::latest::prelude::*;
use xcm_builder::{
Expand Down Expand Up @@ -82,11 +89,31 @@ parameter_types! {
/// The amount of weight an XCM operation takes. This is a safe overestimate.
pub const BaseXcmWeight: Weight = Weight::from_parts(1_000_000_000, 64 * 1024);
}

pub struct ExponentialRocPrice;
impl PriceForParachainDelivery for ExponentialRocPrice {
fn price_for_parachain_delivery(para: ParaId, msg: &Xcm<()>) -> MultiAssets {
let base = CENTS.saturating_mul(3);
let msg_fee = (msg.len() as u128).saturating_mul(TransactionByteFee::get());

let excess_msgs =
Dmp::dmq_length(para).saturating_sub(parachains_dmp::MAX_MESSAGE_QUEUE_SIZE) as usize;
let factor = if excess_msgs != 0 {
Dmp::raise_fee_factor(excess_msgs)
} else {
Dmp::reduce_fee_factor(1)
};

let amount = factor.saturating_mul_int(base + msg_fee);
(Here, amount).into()
}
}

/// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our
/// individual routers.
pub type XcmRouter = (
// Only one router so far - use DMP to communicate with child parachains.
xcm_sender::ChildParachainRouter<Runtime, XcmPallet, ()>,
ChildParachainRouter<Runtime, XcmPallet, ExponentialRocPrice>,
);

parameter_types! {
Expand Down
2 changes: 1 addition & 1 deletion runtime/test-runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -667,7 +667,7 @@ construct_runtime! {
ParaSessionInfo: parachains_session_info::{Pallet, Storage},
Hrmp: parachains_hrmp::{Pallet, Call, Storage, Event<T>},
Ump: parachains_ump::{Pallet, Call, Storage, Event},
Dmp: parachains_dmp::{Pallet, Call, Storage},
Dmp: parachains_dmp::{Pallet, Storage},
Xcm: pallet_xcm::{Pallet, Call, Event<T>, Origin},
ParasDisputes: parachains_disputes::{Pallet, Storage, Event<T>},

Expand Down
Loading