From 4be584658dc5764a98e4fbbb768ddeae1a068a4e Mon Sep 17 00:00:00 2001 From: Shaopeng Wang Date: Mon, 22 Feb 2021 15:14:28 +1300 Subject: [PATCH 1/3] Add Xcm sender. --- runtime/common/src/lib.rs | 1 + runtime/common/src/xcm_sender.rs | 42 ++++++++++++++++++++++++++++++++ runtime/parachains/src/dmp.rs | 9 +++++++ runtime/rococo/src/lib.rs | 4 +-- xcm/src/v0/traits.rs | 1 + 5 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 runtime/common/src/xcm_sender.rs diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index 2f62eb956606..0177f48138f7 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -26,6 +26,7 @@ pub mod purchase; pub mod impls; pub mod paras_sudo_wrapper; pub mod paras_registrar; +pub mod xcm_sender; use primitives::v1::{BlockNumber, ValidatorId, AssignmentId}; use sp_runtime::{Perquintill, Perbill, FixedPointNumber}; diff --git a/runtime/common/src/xcm_sender.rs b/runtime/common/src/xcm_sender.rs new file mode 100644 index 000000000000..421c057935a4 --- /dev/null +++ b/runtime/common/src/xcm_sender.rs @@ -0,0 +1,42 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Xcm sender for relay chain. + +use parity_scale_codec::Encode; +use sp_std::marker::PhantomData; +use xcm::{VersionedXcm, v0::{SendXcm, MultiLocation, Junction, Xcm, Result, Error}}; +use runtime_parachains::{configuration, dmp}; + +/// Xcm sender for relay chain. +pub struct XcmSender(PhantomData); + +impl SendXcm for XcmSender { + fn send_xcm(dest: MultiLocation, msg: Xcm) -> Result { + if let MultiLocation::X1(Junction::Parachain { id }) = dest { + // Downward message passing. + let config = >::config(); + >::queue_downward_message( + &config, + id.into(), + VersionedXcm::from(msg).encode(), + ).map_err(Into::::into)?; + Ok(()) + } else { + Err(Error::CannotReachDestination) + } + } +} diff --git a/runtime/parachains/src/dmp.rs b/runtime/parachains/src/dmp.rs index 7b04ae03407f..43d40745d3bb 100644 --- a/runtime/parachains/src/dmp.rs +++ b/runtime/parachains/src/dmp.rs @@ -22,6 +22,7 @@ use frame_support::{decl_module, decl_storage, StorageMap, weights::Weight, trai use sp_std::{fmt, prelude::*}; use sp_runtime::traits::{BlakeTwo256, Hash as HashT, SaturatedConversion}; use primitives::v1::{Id as ParaId, DownwardMessage, InboundDownwardMessage, Hash}; +use xcm::v0::Error as XcmError; /// An error sending a downward message. #[cfg_attr(test, derive(Debug))] @@ -30,6 +31,14 @@ pub enum QueueDownwardMessageError { ExceedsMaxMessageSize, } +impl From for XcmError { + fn from(err: QueueDownwardMessageError) -> Self { + match err { + QueueDownwardMessageError::ExceedsMaxMessageSize => XcmError::ExceedsMaxMessageSize, + } + } +} + /// An error returned by [`check_processed_downward_messages`] that indicates an acceptance check /// didn't pass. pub enum ProcessedDownwardMessagesAcceptanceErr { diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index ba2d833eaa2f..b1454877242e 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -61,7 +61,7 @@ use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use pallet_session::historical as session_historical; use frame_system::{EnsureRoot, EnsureOneOf, EnsureSigned}; -use runtime_common::{paras_sudo_wrapper, paras_registrar}; +use runtime_common::{paras_sudo_wrapper, paras_registrar, xcm_sender}; use runtime_parachains::origin as parachains_origin; use runtime_parachains::configuration as parachains_configuration; @@ -553,7 +553,7 @@ type LocalOriginConverter = ( pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type Call = Call; - type XcmSender = (); + type XcmSender = xcm_sender::XcmSender; type AssetTransactor = LocalAssetTransactor; type OriginConverter = LocalOriginConverter; type IsReserve = (); diff --git a/xcm/src/v0/traits.rs b/xcm/src/v0/traits.rs index 661e71fe0877..eafeca8661c7 100644 --- a/xcm/src/v0/traits.rs +++ b/xcm/src/v0/traits.rs @@ -36,6 +36,7 @@ pub enum Error { MultiLocationFull, FailedToDecode, BadOrigin, + ExceedsMaxMessageSize, } impl From<()> for Error { From 41d364fe3e735ffff0671ec077f84a3fbc5189e0 Mon Sep 17 00:00:00 2001 From: Shaopeng Wang Date: Mon, 22 Feb 2021 22:02:54 +1300 Subject: [PATCH 2/3] Rename XCM sender and add description. --- runtime/common/src/xcm_sender.rs | 6 +++--- runtime/rococo/src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/runtime/common/src/xcm_sender.rs b/runtime/common/src/xcm_sender.rs index 421c057935a4..4a184ba296bb 100644 --- a/runtime/common/src/xcm_sender.rs +++ b/runtime/common/src/xcm_sender.rs @@ -21,10 +21,10 @@ use sp_std::marker::PhantomData; use xcm::{VersionedXcm, v0::{SendXcm, MultiLocation, Junction, Xcm, Result, Error}}; use runtime_parachains::{configuration, dmp}; -/// Xcm sender for relay chain. -pub struct XcmSender(PhantomData); +/// Xcm sender for relay chain. It only sends downward message. +pub struct RelayChainXcmSender(PhantomData); -impl SendXcm for XcmSender { +impl SendXcm for RelayChainXcmSender { fn send_xcm(dest: MultiLocation, msg: Xcm) -> Result { if let MultiLocation::X1(Junction::Parachain { id }) = dest { // Downward message passing. diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index b1454877242e..843578b08cdf 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -553,7 +553,7 @@ type LocalOriginConverter = ( pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type Call = Call; - type XcmSender = xcm_sender::XcmSender; + type XcmSender = xcm_sender::RelayChainXcmSender; type AssetTransactor = LocalAssetTransactor; type OriginConverter = LocalOriginConverter; type IsReserve = (); From 46ac3996ac393bf2378faf517a997e18359f0ed3 Mon Sep 17 00:00:00 2001 From: Shaopeng Wang Date: Tue, 23 Feb 2021 17:51:00 +1300 Subject: [PATCH 3/3] Update copyright header. --- runtime/common/src/xcm_sender.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/common/src/xcm_sender.rs b/runtime/common/src/xcm_sender.rs index 4a184ba296bb..3b81516c7fb7 100644 --- a/runtime/common/src/xcm_sender.rs +++ b/runtime/common/src/xcm_sender.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// Copyright 2021 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify