Skip to content

Commit

Permalink
Introduce message broker for receiving and sending relay chain messag…
Browse files Browse the repository at this point in the history
…es (paritytech#80)

* Start message broker implementation

* Finish first stub implementation

* Add features

* Fix attribute

* Update primitives/src/lib.rs

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

Co-authored-by: Joshy Orndorff <JoshOrndorff@users.noreply.github.com>
  • Loading branch information
bkchr and JoshOrndorff committed Apr 20, 2020
1 parent 7431075 commit c0769c6
Show file tree
Hide file tree
Showing 11 changed files with 200 additions and 5 deletions.
19 changes: 19 additions & 0 deletions Cargo.lock

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

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
[workspace]
members = [
"consensus",
"message-broker",
"network",
"primitives",
"runtime",
"test/runtime",
"test/client",
Expand Down
2 changes: 1 addition & 1 deletion collator/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
2 changes: 1 addition & 1 deletion consensus/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
27 changes: 27 additions & 0 deletions message-broker/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[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",
]
75 changes: 75 additions & 0 deletions message-broker/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// 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))
}
}
2 changes: 1 addition & 1 deletion network/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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" ] }
18 changes: 18 additions & 0 deletions primitives/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[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",
]
53 changes: 53 additions & 0 deletions primitives/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// 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<(), ()>;
}
2 changes: 1 addition & 1 deletion runtime/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
Expand Down
3 changes: 2 additions & 1 deletion runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"))]
Expand Down

0 comments on commit c0769c6

Please sign in to comment.