Skip to content
Snippets Groups Projects
Commit 41e5f0dc authored by Bastian Köcher's avatar Bastian Köcher Committed by GitHub
Browse files

Introduce message broker for receiving and sending relay chain messages (#80)


* Start message broker implementation

* Finish first stub implementation

* Add features

* Fix attribute

* Update primitives/src/lib.rs

Co-Authored-By: default avatarJoshy Orndorff <JoshOrndorff@users.noreply.github.com>

Co-authored-by: default avatarJoshy Orndorff <JoshOrndorff@users.noreply.github.com>
parent 02827052
No related merge requests found
......@@ -797,6 +797,17 @@ dependencies = [
"tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "cumulus-message-broker"
version = "0.1.0"
dependencies = [
"cumulus-primitives 0.1.0",
"frame-support 2.0.0-alpha.5 (git+https://github.com/paritytech/substrate?branch=cumulus-branch)",
"frame-system 2.0.0-alpha.5 (git+https://github.com/paritytech/substrate?branch=cumulus-branch)",
"parity-scale-codec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"sp-inherents 2.0.0-alpha.5 (git+https://github.com/paritytech/substrate?branch=cumulus-branch)",
]
[[package]]
name = "cumulus-network"
version = "0.1.0"
......@@ -813,6 +824,14 @@ dependencies = [
"sp-runtime 2.0.0-alpha.5 (git+https://github.com/paritytech/substrate?branch=cumulus-branch)",
]
[[package]]
name = "cumulus-primitives"
version = "0.1.0"
dependencies = [
"impl-trait-for-tuples 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"sp-inherents 2.0.0-alpha.5 (git+https://github.com/paritytech/substrate?branch=cumulus-branch)",
]
[[package]]
name = "cumulus-runtime"
version = "0.1.0"
......
[workspace]
members = [
"consensus",
"message-broker",
"network",
"primitives",
"runtime",
"test/runtime",
"test/client",
......
......@@ -27,7 +27,7 @@ cumulus-runtime = { path = "../runtime" }
# Other dependencies
log = "0.4.8"
codec = { package = "parity-scale-codec", version = "1.0.6", features = [ "derive" ] }
codec = { package = "parity-scale-codec", version = "1.3.0", features = [ "derive" ] }
futures = { version = "0.3.1", features = ["compat"] }
parking_lot = "0.9"
......
......@@ -24,5 +24,5 @@ polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "c
# other deps
futures = { version = "0.3.1", features = ["compat"] }
tokio = "0.1.22"
codec = { package = "parity-scale-codec", version = "1.0.5", features = [ "derive" ] }
codec = { package = "parity-scale-codec", version = "1.3.0", features = [ "derive" ] }
log = "0.4"
[package]
name = "cumulus-message-broker"
version = "0.1.0"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018"
[dependencies]
# substrate deps
frame-support = { git = "https://github.com/paritytech/substrate", branch = "cumulus-branch" }
frame-system = { git = "https://github.com/paritytech/substrate", branch = "cumulus-branch" }
sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "cumulus-branch" }
# Other dependencies
codec = { package = "parity-scale-codec", version = "1.3.0", features = [ "derive" ] }
# Cumulus dependencies
cumulus-primitives = { path = "../primitives" }
[features]
default = [ "std" ]
std = [
"frame-support/std",
"frame-system/std",
"sp-inherents/std",
"codec/std",
"cumulus-primitives/std",
]
// Copyright 2020 Parity Technologies (UK) Ltd.
// This file is part of Cumulus.
// Substrate 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.
// Substrate 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/>.
//! Cumulus message broker pallet.
//!
//! This pallet provides support for handling downward and upward messages.
#![cfg_attr(not(feature = "std"), no_std)]
use cumulus_primitives::{
inherents::{DownwardMessagesType, DOWNWARD_MESSAGES_IDENTIFIER},
well_known_keys, DownwardMessageHandler, UpwardMessageSender,
};
use frame_support::{
decl_module, storage,
weights::{SimpleDispatchInfo, WeighData, Weight},
};
use frame_system::ensure_none;
use sp_inherents::{InherentData, InherentIdentifier, MakeFatalError, ProvideInherent};
/// Configuration trait of this pallet.
pub trait Trait: frame_system::Trait {
/// The downward message handlers that will be informed when a message is received.
type DownwardMessageHandlers: DownwardMessageHandler;
}
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
/// Executes the given downward messages by calling the message handlers.
///
/// The origin of this call needs to be `None` as this is an inherent.
#[weight = SimpleDispatchInfo::FixedMandatory(10)]
fn execute_downward_messages(origin, messages: Vec<()>) {
ensure_none(origin)?;
messages.iter().for_each(T::DownwardMessageHandlers::handle_downward_message);
}
fn on_initialize() -> Weight {
storage::unhashed::kill(well_known_keys::UPWARD_MESSAGES);
SimpleDispatchInfo::default().weigh_data(())
}
}
}
impl<T: Trait> UpwardMessageSender for Module<T> {
fn send_upward_message(_: &()) -> Result<(), ()> {
Ok(())
}
}
impl<T: Trait> ProvideInherent for Module<T> {
type Call = Call<T>;
type Error = MakeFatalError<()>;
const INHERENT_IDENTIFIER: InherentIdentifier = DOWNWARD_MESSAGES_IDENTIFIER;
fn create_inherent(data: &InherentData) -> Option<Self::Call> {
data.get_data::<DownwardMessagesType>(&DOWNWARD_MESSAGES_IDENTIFIER)
.expect("Downward messages inherent data failed to decode")
.map(|msgs| Call::execute_downward_messages(msgs))
}
}
......@@ -20,4 +20,4 @@ polkadot-validation = { git = "https://github.com/paritytech/polkadot", branch =
polkadot-network = { git = "https://github.com/paritytech/polkadot", branch = "cumulus-branch" }
# other deps
codec = { package = "parity-scale-codec", version = "1.0.5", features = [ "derive" ] }
codec = { package = "parity-scale-codec", version = "1.3.0", features = [ "derive" ] }
[package]
name = "cumulus-primitives"
version = "0.1.0"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018"
[dependencies]
# Substrate dependencies
sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "cumulus-branch" }
# Other dependencies
impl-trait-for-tuples = "0.1.3"
[features]
default = [ "std" ]
std = [
"sp-inherents/std",
]
// Copyright 2020 Parity Technologies (UK) Ltd.
// This file is part of Cumulus.
// Substrate 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.
// Substrate 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/>.
//! Cumulus related primitive types and traits.
#![cfg_attr(not(feature = "std"), no_std)]
/// Identifiers and types related to Cumulus Inherents
pub mod inherents {
use sp_inherents::InherentIdentifier;
/// Inherent identifier for downward messages.
pub const DOWNWARD_MESSAGES_IDENTIFIER: InherentIdentifier = *b"cumdownm";
/// The type of the inherent downward messages.
pub type DownwardMessagesType = Vec<()>;
}
/// Well known keys for values in the storage.
pub mod well_known_keys {
/// The storage key for the upward messages.
///
/// The upward messages are stored as SCALE encoded `Vec<()>`.
pub const UPWARD_MESSAGES: &'static [u8] = b":cumulus_upward_messages:";
}
/// Something that should be called when a downward message is received.
#[impl_trait_for_tuples::impl_for_tuples(30)]
pub trait DownwardMessageHandler {
/// Handle the given downward message.
fn handle_downward_message(msg: &());
}
/// Something that can send upward messages.
pub trait UpwardMessageSender {
/// Send an upward message to the relay chain.
///
/// Returns an error if sending failed.
fn send_upward_message(msg: &()) -> Result<(), ()>;
}
......@@ -6,7 +6,7 @@ edition = "2018"
[dependencies]
# Other dependencies
codec = { package = "parity-scale-codec", version = "1.0.5", default-features = false, features = [ "derive" ] }
codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = [ "derive" ] }
memory-db = { version = "0.18.0", default-features = false }
hash-db = { version = "0.15.2", default-features = false }
trie-db = { version = "0.20.0", default-features = false }
......
......@@ -16,9 +16,10 @@
#![cfg_attr(not(feature = "std"), no_std)]
///! The Cumulus runtime to make a runtime a parachain.
use codec::{Decode, Encode};
use sp_runtime::traits::Block as BlockT;
///! The Cumulus runtime to make a runtime a parachain.
use sp_std::vec::Vec;
#[cfg(not(feature = "std"))]
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment