From 442e300163fbc472d4642b3a29272c27bc0a8128 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 28 Oct 2018 20:36:59 +0100 Subject: [PATCH] add substrate finality grandpa primitives for WASM --- substrate/Cargo.lock | 12 +++ substrate/Cargo.toml | 1 + substrate/core/finality-grandpa/Cargo.toml | 1 + .../finality-grandpa/primitives/Cargo.toml | 21 ++++++ .../finality-grandpa/primitives/src/lib.rs | 73 +++++++++++++++++++ substrate/core/finality-grandpa/src/lib.rs | 25 +------ substrate/core/test-runtime/src/lib.rs | 1 - 7 files changed, 111 insertions(+), 23 deletions(-) create mode 100644 substrate/core/finality-grandpa/primitives/Cargo.toml create mode 100644 substrate/core/finality-grandpa/primitives/src/lib.rs diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index ab11df3d8a..c988464c3d 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -3019,6 +3019,17 @@ dependencies = [ "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-fg-primitives" +version = "0.1.0" +dependencies = [ + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api 0.1.0", + "sr-primitives 0.1.0", + "substrate-primitives 0.1.0", +] + [[package]] name = "substrate-finality-grandpa" version = "0.1.0" @@ -3032,6 +3043,7 @@ dependencies = [ "sr-primitives 0.1.0", "substrate-client 0.1.0", "substrate-consensus-common 0.1.0", + "substrate-fg-primitives 0.1.0", "substrate-keyring 0.1.0", "substrate-network 0.1.0", "substrate-primitives 0.1.0", diff --git a/substrate/Cargo.toml b/substrate/Cargo.toml index 54ae7d9d82..899c9cedfb 100644 --- a/substrate/Cargo.toml +++ b/substrate/Cargo.toml @@ -27,6 +27,7 @@ members = [ "core/consensus/rhd", "core/executor", "core/finality-grandpa", + "core/finality-grandpa/primitives", "core/keyring", "core/network", "core/primitives", diff --git a/substrate/core/finality-grandpa/Cargo.toml b/substrate/core/finality-grandpa/Cargo.toml index afff3ad5cb..2181d2f16d 100644 --- a/substrate/core/finality-grandpa/Cargo.toml +++ b/substrate/core/finality-grandpa/Cargo.toml @@ -14,6 +14,7 @@ substrate-client = { path = "../client" } log = "0.4" parking_lot = "0.4" tokio = "0.1.7" +substrate-fg-primitives = { path = "primitives" } [dependencies.finality-grandpa] #version = "0.3.0" diff --git a/substrate/core/finality-grandpa/primitives/Cargo.toml b/substrate/core/finality-grandpa/primitives/Cargo.toml new file mode 100644 index 0000000000..b568da0c06 --- /dev/null +++ b/substrate/core/finality-grandpa/primitives/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "substrate-fg-primitives" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +substrate-primitives = { path = "../../primitives", default-features = false } +parity-codec = { version = "2.1", default-features = false } +parity-codec-derive = { version = "2.1", default-features = false } +sr-api = { path = "../../sr-api", default-features = false } +sr-primitives = { path = "../../sr-primitives", default-features = false } + +[features] +default = ["std"] +std = [ + "substrate-primitives/std", + "parity-codec/std", + "parity-codec-derive/std", + "sr-api/std", + "sr-primitives/std", +] diff --git a/substrate/core/finality-grandpa/primitives/src/lib.rs b/substrate/core/finality-grandpa/primitives/src/lib.rs new file mode 100644 index 0000000000..047c37632a --- /dev/null +++ b/substrate/core/finality-grandpa/primitives/src/lib.rs @@ -0,0 +1,73 @@ +// Copyright 2018 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! Primitives for GRANDPA integration, suitable for WASM compilation. + +#![cfg_attr(not(feature = "std"), no_std)] + +extern crate substrate_primitives; +extern crate sr_primitives; +extern crate parity_codec; + +#[macro_use] +extern crate parity_codec_derive; + +#[macro_use] +extern crate sr_api; + +use substrate_primitives::AuthorityId; +use sr_primitives::traits::{Block as BlockT, DigestFor, NumberFor}; + +/// A scheduled change of authority set. +#[cfg_attr(feature = "std", derive(Debug, PartialEq))] +#[derive(Encode, Decode)] +pub struct ScheduledChange { + /// The new authorities after the change, along with their respective weights. + pub next_authorities: Vec<(AuthorityId, u64)>, + /// The number of blocks to delay. + pub delay: N, +} + +/// WASM function call to check for pending changes. +pub const PENDING_CHANGE_CALL: &str = "grandpa_pending_change"; +/// WASM function call to get current GRANDPA authorities. +pub const AUTHORITIES_CALL: &str = "grandpa_pending_change"; + +decl_apis! { + /// APIs for integrating the GRANDPA finality gadget into runtimes. + /// + /// This is primarily used for negotiating authority-set changes for the + /// gadget. GRANDPA uses a signalling model of changing authority sets: + /// changes should be signalled with a delay of N blocks, and then automatically + /// applied in the runtime after those N blocks have passed. + /// + /// The consensus protocol will coordinate the handoff externally. + pub trait Api { + /// Check a digest for pending changes. + /// Return `None` if there are no pending changes. + /// + /// Precedence towards earlier or later digest items can be given + /// based on the rules of the chain. + /// + /// No change should be scheduled if one is already and the delay has not + /// passed completely. + fn grandpa_pending_change(digest: DigestFor) -> Option>>; + + /// Get the current GRANDPA authorities. This should not change except + /// for when changes are scheduled and the corresponding delay has passed. + fn grandpa_authorities() -> Vec; + } +} diff --git a/substrate/core/finality-grandpa/src/lib.rs b/substrate/core/finality-grandpa/src/lib.rs index fde673eb5a..0b8405a6fe 100644 --- a/substrate/core/finality-grandpa/src/lib.rs +++ b/substrate/core/finality-grandpa/src/lib.rs @@ -14,11 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -// tag::description[] //! Integration of the GRANDPA finality gadget into substrate. //! //! This is a long-running future that produces finality notifications. -// end::description[] extern crate finality_grandpa as grandpa; extern crate futures; @@ -29,6 +27,7 @@ extern crate substrate_primitives; extern crate tokio; extern crate parking_lot; extern crate parity_codec as codec; +extern crate substrate_fg_primitives as fg_primitives; #[macro_use] extern crate log; @@ -64,6 +63,8 @@ use std::time::{Instant, Duration}; use authorities::SharedAuthoritySet; +pub use fg_primitives::ScheduledChange; + mod authorities; const LAST_COMPLETED_KEY: &[u8] = b"grandpa_completed_round"; @@ -485,26 +486,6 @@ impl grandpa::Chain> for E } } -/// A scheduled change of authority set. -#[derive(Debug, PartialEq)] -pub struct ScheduledChange { - /// The new authorities after the change, along with their respective weights. - pub next_authorities: Vec<(AuthorityId, u64)>, - /// The number of blocks to delay. - pub delay: N, -} - -/// A GRANDPA-compatible DigestItem. This can describe when GRANDPA set changes -/// are scheduled. -// -// With specialization, could do a blanket implementation so this trait -// doesn't have to be implemented by users. -pub trait CompatibleDigestItem { - /// If this digest item notes a GRANDPA set change, return information about - /// the scheduled change. - fn scheduled_change(&self) -> Option> { None } -} - /// A new authority set along with the canonical block it changed at. #[derive(Debug)] struct NewAuthoritySet { diff --git a/substrate/core/test-runtime/src/lib.rs b/substrate/core/test-runtime/src/lib.rs index de678e7205..a136f02cf0 100644 --- a/substrate/core/test-runtime/src/lib.rs +++ b/substrate/core/test-runtime/src/lib.rs @@ -38,7 +38,6 @@ extern crate sr_io as runtime_io; #[macro_use] extern crate sr_version as runtime_version; - #[cfg(test)] #[macro_use] extern crate hex_literal;