From bf0212586caae196cf2688d56d788db69bbbce7c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Feb 2018 01:37:40 +0100 Subject: [PATCH 1/3] Add codec tests (#74) * Add tests for block & header encoding * Add encoding tests for transaction/unchecked_transaction --- substrate/primitives/src/block.rs | 47 +++++++++++++++++++ substrate/test-runtime/src/transaction.rs | 27 +++++++++++ .../test-runtime/src/unchecked_transaction.rs | 34 ++++++++++++++ 3 files changed, 108 insertions(+) diff --git a/substrate/primitives/src/block.rs b/substrate/primitives/src/block.rs index ba34dd085f08a..3f1f04474c802 100644 --- a/substrate/primitives/src/block.rs +++ b/substrate/primitives/src/block.rs @@ -177,6 +177,30 @@ mod tests { use codec::Slicable; use substrate_serializer as ser; + #[test] + fn test_header_encoding() { + let header = Header { + parent_hash: 5.into(), + number: 67, + state_root: 3.into(), + transaction_root: 6.into(), + digest: Digest { logs: vec![Log(vec![1]), Log(vec![2])] }, + }; + + assert_eq!(header.encode(), vec![ + // parent_hash + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + // number + 67, 0, 0, 0, 0, 0, 0, 0, + // state_root + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + // transaction_root + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + // digest (length, log1, log2) + 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 2 + ]); + } + #[test] fn test_header_serialization() { let header = Header { @@ -202,4 +226,27 @@ mod tests { let v = header.encode(); assert_eq!(Header::decode(&mut &v[..]).unwrap(), header); } + + #[test] + fn test_block_encoding() { + let block = Block { + header: Header::from_block_number(12), + transactions: vec![Transaction(vec!(4))], + }; + + assert_eq!(block.encode(), vec![ + // parent_hash + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // number + 12, 0, 0, 0, 0, 0, 0, 0, + // state_root + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // transaction_root + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // digest + 0, 0, 0, 0, + // transactions (length, tx...) + 1, 0, 0, 0, 1, 0, 0, 0, 4 + ]); + } } diff --git a/substrate/test-runtime/src/transaction.rs b/substrate/test-runtime/src/transaction.rs index 858ac4efa0fb4..81fd37f779a5b 100644 --- a/substrate/test-runtime/src/transaction.rs +++ b/substrate/test-runtime/src/transaction.rs @@ -54,3 +54,30 @@ impl Slicable for Transaction { } impl ::codec::NonTrivialSlicable for Transaction {} + +#[cfg(test)] +mod tests { + use super::*; + use keyring::Keyring; + + #[test] + fn test_tx_encoding() { + let tx = Transaction { + from: Keyring::Alice.to_raw_public(), + to: Keyring::Bob.to_raw_public(), + amount: 69, + nonce: 33, + }; + + assert_eq!(tx.encode(), vec![ + // from + 209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79, + // to + 215, 86, 142, 95, 10, 126, 218, 103, 168, 38, 145, 255, 55, 154, 196, 187, 164, 249, 201, 184, 89, 254, 119, 155, 93, 70, 54, 59, 97, 173, 45, 185, + // amount + 69, 0, 0, 0, 0, 0, 0, 0, + // nonce + 33, 0, 0, 0, 0, 0, 0, 0 + ]); + } +} diff --git a/substrate/test-runtime/src/unchecked_transaction.rs b/substrate/test-runtime/src/unchecked_transaction.rs index 6ea3af310fc19..72b60098c11a8 100644 --- a/substrate/test-runtime/src/unchecked_transaction.rs +++ b/substrate/test-runtime/src/unchecked_transaction.rs @@ -61,3 +61,37 @@ impl Slicable for UncheckedTransaction { } impl ::codec::NonTrivialSlicable for UncheckedTransaction {} + +#[cfg(test)] +mod tests { + use super::*; + use keyring::Keyring; + use ::Transaction; + + #[test] + fn test_unchecked_encoding() { + let tx = Transaction { + from: Keyring::Alice.to_raw_public(), + to: Keyring::Bob.to_raw_public(), + amount: 69, + nonce: 34, + }; + let signature = Keyring::from_raw_public(tx.from).unwrap().sign(&tx.encode()); + let signed = UncheckedTransaction { tx, signature }; + + assert_eq!(signed.encode(), vec![ + // length + 144, 0, 0, 0, + // from + 209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79, + // to + 215, 86, 142, 95, 10, 126, 218, 103, 168, 38, 145, 255, 55, 154, 196, 187, 164, 249, 201, 184, 89, 254, 119, 155, 93, 70, 54, 59, 97, 173, 45, 185, + // amount + 69, 0, 0, 0, 0, 0, 0, 0, + // nonce + 34, 0, 0, 0, 0, 0, 0, 0, + // signature + 207, 69, 156, 55, 7, 227, 202, 3, 114, 111, 43, 46, 227, 38, 39, 122, 245, 69, 195, 117, 190, 154, 89, 76, 134, 91, 251, 230, 31, 221, 1, 194, 144, 34, 33, 58, 220, 154, 205, 135, 224, 52, 248, 198, 12, 17, 96, 53, 110, 160, 194, 10, 9, 60, 40, 133, 57, 112, 151, 200, 105, 198, 245, 10 + ]); + } +} From b5b1cb7e820d3c741186c944ee63f7861f3d46fd Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 15 Feb 2018 14:20:18 +0100 Subject: [PATCH 2/3] Split BFT into substrate-bft and runtime-specific proposer logic (#72) * reshuffle consensus libraries * polkadot-useful type definitions for statement table * begin BftService * primary selection logic * bft service implementation without I/O * extract out `BlockImport` trait * allow bft primitives to compile on wasm * take polkadot-consensus down to the core. * test for preemption * fix test build --- Cargo.lock | 50 +- Cargo.toml | 4 +- polkadot/candidate-agreement/Cargo.toml | 9 - .../src/handle_incoming.rs | 214 ------ polkadot/candidate-agreement/src/lib.rs | 625 ------------------ .../candidate-agreement/src/round_robin.rs | 164 ----- polkadot/candidate-agreement/src/tests/mod.rs | 385 ----------- polkadot/consensus/Cargo.toml | 15 + polkadot/consensus/src/lib.rs | 243 +++++++ polkadot/primitives/src/parachain.rs | 121 +++- polkadot/primitives/src/transaction.rs | 3 +- .../release/polkadot_runtime.compact.wasm | Bin 75751 -> 80217 bytes .../release/polkadot_runtime.wasm | Bin 75800 -> 80296 bytes polkadot/statement-table/Cargo.toml | 8 + .../src/generic.rs} | 41 +- polkadot/statement-table/src/lib.rs | 108 +++ substrate/bft/Cargo.toml | 20 + substrate/bft/src/error.rs | 57 ++ .../bft/src/generic}/accumulator.rs | 10 +- .../bft => substrate/bft/src/generic}/mod.rs | 94 ++- .../bft/src/generic}/tests.rs | 70 +- substrate/bft/src/lib.rs | 473 +++++++++++++ substrate/codec/src/slicable.rs | 10 +- substrate/ed25519/src/lib.rs | 2 +- .../release/runtime_test.compact.wasm | Bin 14152 -> 13451 bytes .../release/runtime_test.wasm | Bin 14248 -> 13576 bytes substrate/primitives/src/bft.rs | 122 ++++ substrate/primitives/src/block.rs | 6 + substrate/primitives/src/lib.rs | 5 +- .../substrate_test_runtime.compact.wasm | Bin 31904 -> 32856 bytes .../release/substrate_test_runtime.wasm | Bin 31984 -> 32936 bytes 31 files changed, 1394 insertions(+), 1465 deletions(-) delete mode 100644 polkadot/candidate-agreement/Cargo.toml delete mode 100644 polkadot/candidate-agreement/src/handle_incoming.rs delete mode 100644 polkadot/candidate-agreement/src/lib.rs delete mode 100644 polkadot/candidate-agreement/src/round_robin.rs delete mode 100644 polkadot/candidate-agreement/src/tests/mod.rs create mode 100644 polkadot/consensus/Cargo.toml create mode 100644 polkadot/consensus/src/lib.rs create mode 100644 polkadot/statement-table/Cargo.toml rename polkadot/{candidate-agreement/src/table.rs => statement-table/src/generic.rs} (97%) create mode 100644 polkadot/statement-table/src/lib.rs create mode 100644 substrate/bft/Cargo.toml create mode 100644 substrate/bft/src/error.rs rename {polkadot/candidate-agreement/src/bft => substrate/bft/src/generic}/accumulator.rs (98%) rename {polkadot/candidate-agreement/src/bft => substrate/bft/src/generic}/mod.rs (91%) rename {polkadot/candidate-agreement/src/bft => substrate/bft/src/generic}/tests.rs (83%) create mode 100644 substrate/bft/src/lib.rs create mode 100644 substrate/primitives/src/bft.rs diff --git a/Cargo.lock b/Cargo.lock index 6e54ac6c5e8e2..0af4fe42e80e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -970,15 +970,6 @@ dependencies = [ "substrate-state-machine 0.1.0", ] -[[package]] -name = "polkadot-candidate-agreement" -version = "0.1.0" -dependencies = [ - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "polkadot-cli" version = "0.1.0" @@ -1011,6 +1002,21 @@ dependencies = [ "substrate-primitives 0.1.0", ] +[[package]] +name = "polkadot-consensus" +version = "0.1.0" +dependencies = [ + "ed25519 0.1.0", + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "polkadot-primitives 0.1.0", + "polkadot-statement-table 0.1.0", + "substrate-bft 0.1.0", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "polkadot-executor" version = "0.1.0" @@ -1058,6 +1064,14 @@ dependencies = [ "substrate-runtime-support 0.1.0", ] +[[package]] +name = "polkadot-statement-table" +version = "0.1.0" +dependencies = [ + "polkadot-primitives 0.1.0", + "substrate-primitives 0.1.0", +] + [[package]] name = "polkadot-validator" version = "0.1.0" @@ -1378,6 +1392,24 @@ name = "strsim" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "substrate-bft" +version = "0.1.0" +dependencies = [ + "ed25519 0.1.0", + "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-client 0.1.0", + "substrate-codec 0.1.0", + "substrate-executor 0.1.0", + "substrate-keyring 0.1.0", + "substrate-primitives 0.1.0", + "substrate-state-machine 0.1.0", + "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "substrate-client" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index b2378b684b17f..23e71fa1362f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,13 +14,15 @@ polkadot-cli = { path = "polkadot/cli" } [workspace] members = [ "polkadot/api", - "polkadot/candidate-agreement", "polkadot/cli", "polkadot/collator", + "polkadot/consensus", "polkadot/executor", "polkadot/primitives", "polkadot/runtime", + "polkadot/statement-table", "polkadot/validator", + "substrate/bft", "substrate/client", "substrate/codec", "substrate/environmental", diff --git a/polkadot/candidate-agreement/Cargo.toml b/polkadot/candidate-agreement/Cargo.toml deleted file mode 100644 index 8aa2d0001b5e8..0000000000000 --- a/polkadot/candidate-agreement/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "polkadot-candidate-agreement" -version = "0.1.0" -authors = ["Parity Technologies "] - -[dependencies] -futures = "0.1.17" -parking_lot = "0.4" -tokio-timer = "0.1.2" diff --git a/polkadot/candidate-agreement/src/handle_incoming.rs b/polkadot/candidate-agreement/src/handle_incoming.rs deleted file mode 100644 index 625c950784106..0000000000000 --- a/polkadot/candidate-agreement/src/handle_incoming.rs +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2017 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 . - -//! A stream that handles incoming messages to the BFT agreement module and statement -//! table. It forwards as necessary, and dispatches requests for determining availability -//! and validity of candidates as necessary. - -use std::collections::HashSet; - -use futures::prelude::*; -use futures::stream::{Fuse, FuturesUnordered}; -use futures::sync::mpsc; - -use table::{self, Statement, Context as TableContext}; - -use super::{Context, CheckedMessage, SharedTable, TypeResolve}; - -enum CheckResult { - Available, - Unavailable, - Valid, - Invalid, -} - -enum Checking { - Availability(D, A), - Validity(D, V), -} - -impl Future for Checking - where - D: Clone, - A: Future, - V: Future, -{ - type Item = (D, CheckResult); - type Error = E; - - fn poll(&mut self) -> Poll { - Ok(Async::Ready(match *self { - Checking::Availability(ref digest, ref mut f) => { - match try_ready!(f.poll()) { - true => (digest.clone(), CheckResult::Available), - false => (digest.clone(), CheckResult::Unavailable), - } - } - Checking::Validity(ref digest, ref mut f) => { - match try_ready!(f.poll()) { - true => (digest.clone(), CheckResult::Valid), - false => (digest.clone(), CheckResult::Invalid), - } - } - })) - } -} - -/// Handles incoming messages to the BFT service and statement table. -/// -/// Also triggers requests for determining validity and availability of other -/// parachain candidates. -pub struct HandleIncoming { - table: SharedTable, - messages_in: Fuse, - bft_out: mpsc::UnboundedSender<::BftCommunication>, - local_id: C::AuthorityId, - requesting_about: FuturesUnordered::Future, - ::Future, - >>, - checked_validity: HashSet, - checked_availability: HashSet, -} - -impl HandleIncoming { - fn sign_and_import_statement(&self, digest: C::Digest, result: CheckResult) { - let statement = match result { - CheckResult::Valid => Statement::Valid(digest), - CheckResult::Invalid => Statement::Invalid(digest), - CheckResult::Available => Statement::Available(digest), - CheckResult::Unavailable => return, // no such statement and not provable. - }; - - // TODO: trigger broadcast to peers immediately? - self.table.sign_and_import(statement); - } - - fn import_message(&mut self, origin: C::AuthorityId, message: CheckedMessage) { - match message { - CheckedMessage::Bft(msg) => { let _ = self.bft_out.unbounded_send(msg); } - CheckedMessage::Table(table_messages) => { - // import all table messages and check for any that we - // need to produce statements for. - let msg_iter = table_messages - .into_iter() - .map(|m| (m, Some(origin.clone()))); - let summaries: Vec<_> = self.table.import_statements(msg_iter); - - for summary in summaries { - self.dispatch_on_summary(summary) - } - } - } - } - - // on new candidates in our group, begin checking validity. - // on new candidates in our availability sphere, begin checking availability. - fn dispatch_on_summary(&mut self, summary: table::Summary) { - let is_validity_member = - self.table.context().is_member_of(&self.local_id, &summary.group_id); - - let is_availability_member = - self.table.context().is_availability_guarantor_of(&self.local_id, &summary.group_id); - - let digest = &summary.candidate; - - // TODO: consider a strategy based on the number of candidate votes as well. - let checking_validity = - is_validity_member && - self.checked_validity.insert(digest.clone()) && - self.table.proposed_digest() != Some(digest.clone()); - - let checking_availability = is_availability_member && self.checked_availability.insert(digest.clone()); - - if checking_validity || checking_availability { - let context = &*self.table.context(); - let requesting_about = &mut self.requesting_about; - self.table.with_candidate(digest, |c| match c { - None => {} // TODO: handle table inconsistency somehow? - Some(candidate) => { - if checking_validity { - let future = context.check_validity(candidate).into_future(); - let checking = Checking::Validity(digest.clone(), future); - requesting_about.push(checking); - } - - if checking_availability { - let future = context.check_availability(candidate).into_future(); - let checking = Checking::Availability(digest.clone(), future); - requesting_about.push(checking); - } - } - }) - } - } -} - -impl HandleIncoming - where - C: Context, - I: Stream),Error=E>, - C::CheckAvailability: IntoFuture, - C::CheckCandidate: IntoFuture, -{ - pub fn new( - table: SharedTable, - messages_in: I, - bft_out: mpsc::UnboundedSender<::BftCommunication>, - ) -> Self { - let local_id = table.context().local_id(); - - HandleIncoming { - table, - bft_out, - local_id, - messages_in: messages_in.fuse(), - requesting_about: FuturesUnordered::new(), - checked_validity: HashSet::new(), - checked_availability: HashSet::new(), - } - } -} - -impl Future for HandleIncoming - where - C: Context, - I: Stream),Error=E>, - C::CheckAvailability: IntoFuture, - C::CheckCandidate: IntoFuture, -{ - type Item = (); - type Error = E; - - fn poll(&mut self) -> Poll<(), E> { - loop { - // FuturesUnordered is safe to poll after it has completed. - while let Async::Ready(Some((d, r))) = self.requesting_about.poll()? { - self.sign_and_import_statement(d, r); - } - - match try_ready!(self.messages_in.poll()) { - None => if self.requesting_about.is_empty() { - return Ok(Async::Ready(())) - } else { - return Ok(Async::NotReady) - }, - Some((origin, msg)) => self.import_message(origin, msg), - } - } - } -} diff --git a/polkadot/candidate-agreement/src/lib.rs b/polkadot/candidate-agreement/src/lib.rs deleted file mode 100644 index 2cf4be5c54715..0000000000000 --- a/polkadot/candidate-agreement/src/lib.rs +++ /dev/null @@ -1,625 +0,0 @@ -// Copyright 2017 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 . - -//! Propagation and agreement of candidates. -//! -//! Authorities are split into groups by parachain, and each authority might come -//! up its own candidate for their parachain. Within groups, authorities pass around -//! their candidates and produce statements of validity. -//! -//! Any candidate that receives majority approval by the authorities in a group -//! may be subject to inclusion, unless any authorities flag that candidate as invalid. -//! -//! Wrongly flagging as invalid should be strongly disincentivized, so that in the -//! equilibrium state it is not expected to happen. Likewise with the submission -//! of invalid blocks. -//! -//! Groups themselves may be compromised by malicious authorities. - -#[macro_use] -extern crate futures; -extern crate parking_lot; -extern crate tokio_timer; - -use std::collections::{HashMap, HashSet}; -use std::fmt::Debug; -use std::hash::Hash; -use std::sync::Arc; -use std::time::Duration; - -use futures::prelude::*; -use futures::sync::{mpsc, oneshot}; -use parking_lot::Mutex; -use tokio_timer::Timer; - -use table::Table; - -mod bft; -mod handle_incoming; -mod round_robin; -mod table; - -#[cfg(test)] -pub mod tests; - -/// Context necessary for agreement. -pub trait Context: Send + Clone { - /// A authority ID - type AuthorityId: Debug + Hash + Eq + Clone + Ord; - /// The digest (hash or other unique attribute) of a candidate. - type Digest: Debug + Hash + Eq + Clone; - /// The group ID type - type GroupId: Debug + Hash + Ord + Eq + Clone; - /// A signature type. - type Signature: Debug + Eq + Clone; - /// Candidate type. In practice this will be a candidate receipt. - type ParachainCandidate: Debug + Ord + Eq + Clone; - /// The actual block proposal type. This is what is agreed upon, and - /// is composed of multiple candidates. - type Proposal: Debug + Eq + Clone; - - /// A future that resolves when a candidate is checked for validity. - /// - /// In Polkadot, this will involve fetching the corresponding block data, - /// producing the necessary ingress, and running the parachain validity function. - type CheckCandidate: IntoFuture; - - /// A future that resolves when availability of a candidate's external - /// data is checked. - type CheckAvailability: IntoFuture; - - /// The statement batch type. - type StatementBatch: StatementBatch< - Self::AuthorityId, - table::SignedStatement, - >; - - /// Get the digest of a candidate. - fn candidate_digest(candidate: &Self::ParachainCandidate) -> Self::Digest; - - /// Get the digest of a proposal. - fn proposal_digest(proposal: &Self::Proposal) -> Self::Digest; - - /// Get the group of a candidate. - fn candidate_group(candidate: &Self::ParachainCandidate) -> Self::GroupId; - - /// Get the primary for a given round. - fn round_proposer(&self, round: usize) -> Self::AuthorityId; - - /// Check a candidate for validity. - fn check_validity(&self, candidate: &Self::ParachainCandidate) -> Self::CheckCandidate; - - /// Check availability of candidate data. - fn check_availability(&self, candidate: &Self::ParachainCandidate) -> Self::CheckAvailability; - - /// Attempt to combine a set of parachain candidates into a proposal. - /// - /// This may arbitrarily return `None`, but the intent is for `Some` - /// to only be returned when candidates from enough groups are known. - /// - /// "enough" may be subjective as well. - fn create_proposal(&self, candidates: Vec<&Self::ParachainCandidate>) - -> Option; - - /// Check validity of a proposal. This should call out to the `check_candidate` - /// function for all parachain candidates contained within it, as well as - /// checking other validity constraints of the proposal. - fn proposal_valid(&self, proposal: &Self::Proposal, check_candidate: F) -> bool - where F: FnMut(&Self::ParachainCandidate) -> bool; - - /// Get the local authority ID. - fn local_id(&self) -> Self::AuthorityId; - - /// Sign a table validity statement with the local key. - fn sign_table_statement( - &self, - statement: &table::Statement - ) -> Self::Signature; - - /// Sign a BFT agreement message. - fn sign_bft_message(&self, &bft::Message) -> Self::Signature; -} - -/// Helper for type resolution for contexts until type aliases apply bounds. -pub trait TypeResolve { - type SignedTableStatement; - type BftCommunication; - type BftCommitted; - type Misbehavior; -} - -impl TypeResolve for C { - type SignedTableStatement = table::SignedStatement; - type BftCommunication = bft::Communication; - type BftCommitted = bft::Committed; - type Misbehavior = table::Misbehavior; -} - -/// Information about a specific group. -#[derive(Debug, Clone)] -pub struct GroupInfo { - /// Authorities meant to check validity of candidates. - pub validity_guarantors: HashSet, - /// Authorities meant to check availability of candidate data. - pub availability_guarantors: HashSet, - /// Number of votes needed for validity. - pub needed_validity: usize, - /// Number of votes needed for availability. - pub needed_availability: usize, -} - -struct TableContext { - context: C, - groups: HashMap>, -} - -impl ::std::ops::Deref for TableContext { - type Target = C; - - fn deref(&self) -> &C { - &self.context - } -} - -impl table::Context for TableContext { - type AuthorityId = C::AuthorityId; - type Digest = C::Digest; - type GroupId = C::GroupId; - type Signature = C::Signature; - type Candidate = C::ParachainCandidate; - - fn candidate_digest(candidate: &Self::Candidate) -> Self::Digest { - C::candidate_digest(candidate) - } - - fn candidate_group(candidate: &Self::Candidate) -> Self::GroupId { - C::candidate_group(candidate) - } - - fn is_member_of(&self, authority: &Self::AuthorityId, group: &Self::GroupId) -> bool { - self.groups.get(group).map_or(false, |g| g.validity_guarantors.contains(authority)) - } - - fn is_availability_guarantor_of(&self, authority: &Self::AuthorityId, group: &Self::GroupId) -> bool { - self.groups.get(group).map_or(false, |g| g.availability_guarantors.contains(authority)) - } - - fn requisite_votes(&self, group: &Self::GroupId) -> (usize, usize) { - self.groups.get(group).map_or( - (usize::max_value(), usize::max_value()), - |g| (g.needed_validity, g.needed_availability), - ) - } -} - -// A shared table object. -struct SharedTableInner { - table: Table>, - proposed_digest: Option, - awaiting_proposal: Vec>, -} - -impl SharedTableInner { - fn import_statement( - &mut self, - context: &TableContext, - statement: ::SignedTableStatement, - received_from: Option - ) -> Option> { - self.table.import_statement(context, statement, received_from) - } - - fn update_proposal(&mut self, context: &TableContext) { - if self.awaiting_proposal.is_empty() { return } - let proposal_candidates = self.table.proposed_candidates(context); - if let Some(proposal) = context.context.create_proposal(proposal_candidates) { - for sender in self.awaiting_proposal.drain(..) { - let _ = sender.send(proposal.clone()); - } - } - } - - fn get_proposal(&mut self, context: &TableContext) -> oneshot::Receiver { - let (tx, rx) = oneshot::channel(); - self.awaiting_proposal.push(tx); - self.update_proposal(context); - rx - } - - fn proposal_valid(&mut self, context: &TableContext, proposal: &C::Proposal) -> bool { - context.context.proposal_valid(proposal, |contained_candidate| { - // check that the candidate is valid (has enough votes) - let digest = C::candidate_digest(contained_candidate); - self.table.candidate_includable(&digest, context) - }) - } -} - -/// A shared table object. -pub struct SharedTable { - context: Arc>, - inner: Arc>>, -} - -impl Clone for SharedTable { - fn clone(&self) -> Self { - SharedTable { - context: self.context.clone(), - inner: self.inner.clone() - } - } -} - -impl SharedTable { - /// Create a new shared table. - pub fn new(context: C, groups: HashMap>) -> Self { - SharedTable { - context: Arc::new(TableContext { context, groups }), - inner: Arc::new(Mutex::new(SharedTableInner { - table: Table::default(), - awaiting_proposal: Vec::new(), - proposed_digest: None, - })) - } - } - - /// Import a single statement. - pub fn import_statement( - &self, - statement: ::SignedTableStatement, - received_from: Option, - ) -> Option> { - self.inner.lock().import_statement(&*self.context, statement, received_from) - } - - /// Sign and import a local statement. - pub fn sign_and_import( - &self, - statement: table::Statement, - ) -> Option> { - let proposed_digest = match statement { - table::Statement::Candidate(ref c) => Some(C::candidate_digest(c)), - _ => None, - }; - - let signed_statement = table::SignedStatement { - signature: self.context.sign_table_statement(&statement), - sender: self.context.local_id(), - statement, - }; - - let mut inner = self.inner.lock(); - if proposed_digest.is_some() { - inner.proposed_digest = proposed_digest; - } - - inner.import_statement(&*self.context, signed_statement, None) - } - - /// Import many statements at once. - /// - /// Provide an iterator yielding pairs of (statement, received_from). - pub fn import_statements(&self, iterable: I) -> U - where - I: IntoIterator::SignedTableStatement, Option)>, - U: ::std::iter::FromIterator>, - { - let mut inner = self.inner.lock(); - - iterable.into_iter().filter_map(move |(statement, received_from)| { - inner.import_statement(&*self.context, statement, received_from) - }).collect() - } - - /// Update the proposal sealing. - pub fn update_proposal(&self) { - self.inner.lock().update_proposal(&*self.context) - } - - /// Register interest in receiving a proposal when ready. - /// If one is ready immediately, it will be provided. - pub fn get_proposal(&self) -> oneshot::Receiver { - self.inner.lock().get_proposal(&*self.context) - } - - /// Check if a proposal is valid. - pub fn proposal_valid(&self, proposal: &C::Proposal) -> bool { - self.inner.lock().proposal_valid(&*self.context, proposal) - } - - /// Execute a closure using a specific candidate. - /// - /// Deadlocks if called recursively. - pub fn with_candidate(&self, digest: &C::Digest, f: F) -> U - where F: FnOnce(Option<&C::ParachainCandidate>) -> U - { - let inner = self.inner.lock(); - f(inner.table.get_candidate(digest)) - } - - /// Get all witnessed misbehavior. - pub fn get_misbehavior(&self) -> HashMap::Misbehavior> { - self.inner.lock().table.get_misbehavior().clone() - } - - /// Fill a statement batch. - pub fn fill_batch(&self, batch: &mut C::StatementBatch) { - self.inner.lock().table.fill_batch(batch); - } - - /// Get the local proposed candidate digest. - pub fn proposed_digest(&self) -> Option { - self.inner.lock().proposed_digest.clone() - } - - // Get a handle to the table context. - fn context(&self) -> &TableContext { - &*self.context - } -} - -/// Errors that can occur during agreement. -#[derive(Debug, Clone, Copy, PartialEq)] -pub enum Error { - IoTerminated, - FaultyTimer, - CannotPropose, -} - -impl From for Error { - fn from(_: bft::InputStreamConcluded) -> Error { - Error::IoTerminated - } -} - -/// Context owned by the BFT future necessary to execute the logic. -pub struct BftContext { - context: C, - table: SharedTable, - timer: Timer, - round_timeout_multiplier: u64, -} - -impl bft::Context for BftContext - where C::Proposal: 'static, -{ - type AuthorityId = C::AuthorityId; - type Digest = C::Digest; - type Signature = C::Signature; - type Candidate = C::Proposal; - type RoundTimeout = Box>; - type CreateProposal = Box>; - - fn local_id(&self) -> Self::AuthorityId { - self.context.local_id() - } - - fn proposal(&self) -> Self::CreateProposal { - Box::new(self.table.get_proposal().map_err(|_| Error::CannotPropose)) - } - - fn candidate_digest(&self, candidate: &Self::Candidate) -> Self::Digest { - C::proposal_digest(candidate) - } - - fn sign_local(&self, message: bft::Message) - -> bft::LocalizedMessage - { - let sender = self.local_id(); - let signature = self.context.sign_bft_message(&message); - bft::LocalizedMessage { - message, - sender, - signature, - } - } - - fn round_proposer(&self, round: usize) -> Self::AuthorityId { - self.context.round_proposer(round) - } - - fn candidate_valid(&self, proposal: &Self::Candidate) -> bool { - self.table.proposal_valid(proposal) - } - - fn begin_round_timeout(&self, round: usize) -> Self::RoundTimeout { - let round = ::std::cmp::min(63, round) as u32; - let timeout = 1u64.checked_shl(round) - .unwrap_or_else(u64::max_value) - .saturating_mul(self.round_timeout_multiplier); - - Box::new(self.timer.sleep(Duration::from_secs(timeout)) - .map_err(|_| Error::FaultyTimer)) - } -} - - -/// Parameters necessary for agreement. -pub struct AgreementParams { - /// The context itself. - pub context: C, - /// For scheduling timeouts. - pub timer: Timer, - /// The statement table. - pub table: SharedTable, - /// The number of nodes. - pub nodes: usize, - /// The maximum number of faulty nodes. - pub max_faulty: usize, - /// The round timeout multiplier: 2^round_number is multiplied by this. - pub round_timeout_multiplier: u64, - /// The maximum amount of messages to queue. - pub message_buffer_size: usize, - /// Interval to attempt forming proposals over. - pub form_proposal_interval: Duration, -} - -/// Recovery for messages -pub trait MessageRecovery { - /// The unchecked message type. This implies that work hasn't been done - /// to decode the payload and check and authenticate a signature. - type UncheckedMessage; - - /// Attempt to transform a checked message into an unchecked. - fn check_message(&self, Self::UncheckedMessage) -> Option>; -} - -/// A batch of statements to send out. -pub trait StatementBatch { - /// Get the target authorities of these statements. - fn targets(&self) -> &[V]; - - /// If the batch is empty. - fn is_empty(&self) -> bool; - - /// Push a statement onto the batch. Returns false when the batch is full. - /// - /// This is meant to do work like incrementally serializing the statements - /// into a vector of bytes while making sure the length is below a certain - /// amount. - fn push(&mut self, statement: T) -> bool; -} - -/// Recovered and fully checked messages. -pub enum CheckedMessage { - /// Messages meant for the BFT agreement logic. - Bft(::BftCommunication), - /// Statements circulating about the table. - Table(Vec<::SignedTableStatement>), -} - -/// Outgoing messages to the network. -#[derive(Debug, Clone)] -pub enum OutgoingMessage { - /// Messages meant for BFT agreement peers. - Bft(::BftCommunication), - /// Batches of table statements. - Table(C::StatementBatch), -} - -/// Create an agreement future, and I/O streams. -// TODO: kill 'static bounds and use impl Future. -pub fn agree< - Context, - NetIn, - NetOut, - Recovery, - PropagateStatements, - LocalCandidate, - Err, ->( - params: AgreementParams, - net_in: NetIn, - net_out: NetOut, - recovery: Recovery, - propagate_statements: PropagateStatements, - local_candidate: LocalCandidate, -) - -> Box::BftCommitted,Error=Error>> - where - Context: ::Context + 'static, - Context::CheckCandidate: IntoFuture, - Context::CheckAvailability: IntoFuture, - NetIn: Stream),Error=Err> + 'static, - NetOut: Sink> + 'static, - Recovery: MessageRecovery + 'static, - PropagateStatements: Stream + 'static, - LocalCandidate: IntoFuture + 'static -{ - let (bft_in_in, bft_in_out) = mpsc::unbounded(); - let (bft_out_in, bft_out_out) = mpsc::unbounded(); - - let agreement = { - let bft_context = BftContext { - context: params.context, - table: params.table.clone(), - timer: params.timer.clone(), - round_timeout_multiplier: params.round_timeout_multiplier, - }; - - bft::agree( - bft_context, - params.nodes, - params.max_faulty, - bft_in_out.map(bft::ContextCommunication).map_err(|_| Error::IoTerminated), - bft_out_in.sink_map_err(|_| Error::IoTerminated), - ) - }; - - let route_messages_in = { - let round_robin = round_robin::RoundRobinBuffer::new(net_in, params.message_buffer_size); - - let round_robin_recovered = round_robin - .filter_map(move |(sender, msg)| recovery.check_message(msg).map(move |x| (sender, x))); - - handle_incoming::HandleIncoming::new( - params.table.clone(), - round_robin_recovered, - bft_in_in, - ).map_err(|_| Error::IoTerminated) - }; - - let route_messages_out = { - let table = params.table.clone(); - let periodic_table_statements = propagate_statements - .or_else(|_| ::futures::future::empty()) // halt the stream instead of error. - .map(move |mut batch| { table.fill_batch(&mut batch); batch }) - .filter(|b| !b.is_empty()) - .map(OutgoingMessage::Table); - - let complete_out_stream = bft_out_out - .map_err(|_| Error::IoTerminated) - .map(|bft::ContextCommunication(x)| x) - .map(OutgoingMessage::Bft) - .select(periodic_table_statements); - - net_out.sink_map_err(|_| Error::IoTerminated).send_all(complete_out_stream) - }; - - let import_local_candidate = { - let table = params.table.clone(); - local_candidate - .into_future() - .map(table::Statement::Candidate) - .map(Some) - .or_else(|_| Ok(None)) - .map(move |s| if let Some(s) = s { - table.sign_and_import(s); - }) - }; - - let create_proposal_on_interval = { - let table = params.table; - params.timer.interval(params.form_proposal_interval) - .map_err(|_| Error::FaultyTimer) - .for_each(move |_| { table.update_proposal(); Ok(()) }) - }; - - // if these auxiliary futures terminate before the agreement, then - // that is an error. - let auxiliary_futures = route_messages_in.join4( - create_proposal_on_interval, - route_messages_out, - import_local_candidate, - ).and_then(|_| Err(Error::IoTerminated)); - - let future = agreement - .select(auxiliary_futures) - .map(|(committed, _)| committed) - .map_err(|(e, _)| e); - - Box::new(future) -} diff --git a/polkadot/candidate-agreement/src/round_robin.rs b/polkadot/candidate-agreement/src/round_robin.rs deleted file mode 100644 index 3f98507cab89d..0000000000000 --- a/polkadot/candidate-agreement/src/round_robin.rs +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2017 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 . - -//! Round-robin buffer for incoming messages. -//! -//! This takes batches of messages associated with a sender as input, -//! and yields messages in a fair order by sender. - -use std::collections::{Bound, BTreeMap, VecDeque}; - -use futures::prelude::*; -use futures::stream::Fuse; - -/// Implementation of the round-robin buffer for incoming messages. -#[derive(Debug)] -pub struct RoundRobinBuffer { - buffer: BTreeMap>, - last_processed_from: Option, - stored_messages: usize, - max_messages: usize, - inner: Fuse, -} - -impl RoundRobinBuffer { - /// Create a new round-robin buffer which holds up to a maximum - /// amount of messages. - pub fn new(stream: S, buffer_size: usize) -> Self { - RoundRobinBuffer { - buffer: BTreeMap::new(), - last_processed_from: None, - stored_messages: 0, - max_messages: buffer_size, - inner: stream.fuse(), - } - } -} - -impl RoundRobinBuffer { - fn next_message(&mut self) -> Option<(V, M)> { - if self.stored_messages == 0 { - return None - } - - // first pick up from the last authority we processed a message from - let mut next = { - let lower_bound = match self.last_processed_from { - None => Bound::Unbounded, - Some(ref x) => Bound::Excluded(x.clone()), - }; - - self.buffer.range_mut((lower_bound, Bound::Unbounded)) - .filter_map(|(k, v)| v.pop_front().map(|v| (k.clone(), v))) - .next() - }; - - // but wrap around to the beginning again if we got nothing. - if next.is_none() { - next = self.buffer.iter_mut() - .filter_map(|(k, v)| v.pop_front().map(|v| (k.clone(), v))) - .next(); - } - - if let Some((ref authority, _)) = next { - self.stored_messages -= 1; - self.last_processed_from = Some(authority.clone()); - } - - next - } - - // import messages, discarding when the buffer is full. - fn import_messages(&mut self, sender: V, messages: Vec) { - let space_remaining = self.max_messages - self.stored_messages; - self.stored_messages += ::std::cmp::min(space_remaining, messages.len()); - - let v = self.buffer.entry(sender).or_insert_with(VecDeque::new); - v.extend(messages.into_iter().take(space_remaining)); - } -} - -impl Stream for RoundRobinBuffer - where S: Stream)> -{ - type Item = (V, M); - type Error = S::Error; - - fn poll(&mut self) -> Poll, S::Error> { - loop { - match self.inner.poll()? { - Async::NotReady | Async::Ready(None) => break, - Async::Ready(Some((sender, msgs))) => self.import_messages(sender, msgs), - } - } - - let done = self.inner.is_done(); - Ok(match self.next_message() { - Some(msg) => Async::Ready(Some(msg)), - None => if done { Async::Ready(None) } else { Async::NotReady }, - }) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use futures::stream::{self, Stream}; - - #[derive(Debug, PartialEq, Eq)] - struct UncheckedMessage { data: Vec } - - #[test] - fn is_fair_and_wraps_around() { - let stream = stream::iter_ok(vec![ - (1, vec![ - UncheckedMessage { data: vec![1, 3, 5] }, - UncheckedMessage { data: vec![3, 5, 7] }, - UncheckedMessage { data: vec![5, 7, 9] }, - ]), - (2, vec![ - UncheckedMessage { data: vec![2, 4, 6] }, - UncheckedMessage { data: vec![4, 6, 8] }, - UncheckedMessage { data: vec![6, 8, 10] }, - ]), - ]); - - let round_robin = RoundRobinBuffer::new(stream, 100); - let output = round_robin.wait().collect::, ()>>().unwrap(); - - assert_eq!(output, vec![ - (1, UncheckedMessage { data: vec![1, 3, 5] }), - (2, UncheckedMessage { data: vec![2, 4, 6] }), - (1, UncheckedMessage { data: vec![3, 5, 7] }), - - (2, UncheckedMessage { data: vec![4, 6, 8] }), - (1, UncheckedMessage { data: vec![5, 7, 9] }), - (2, UncheckedMessage { data: vec![6, 8, 10] }), - ]); - } - - #[test] - fn discards_when_full() { - let stream = stream::iter_ok(vec![ - (1, (0..200).map(|i| UncheckedMessage { data: vec![i] }).collect()) - ]); - - let round_robin = RoundRobinBuffer::new(stream, 100); - let output = round_robin.wait().collect::, ()>>().unwrap(); - - assert_eq!(output.len(), 100); - } -} diff --git a/polkadot/candidate-agreement/src/tests/mod.rs b/polkadot/candidate-agreement/src/tests/mod.rs deleted file mode 100644 index 1599a94aa69b7..0000000000000 --- a/polkadot/candidate-agreement/src/tests/mod.rs +++ /dev/null @@ -1,385 +0,0 @@ -// Copyright 2017 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 . - -//! Tests and test helpers for the candidate agreement. - -const VALIDITY_CHECK_DELAY_MS: u64 = 100; -const AVAILABILITY_CHECK_DELAY_MS: u64 = 100; -const PROPOSAL_FORMATION_TICK_MS: u64 = 50; -const PROPAGATE_STATEMENTS_TICK_MS: u64 = 200; -const TIMER_TICK_DURATION_MS: u64 = 10; - -use std::collections::HashMap; - -use futures::prelude::*; -use futures::sync::mpsc; -use tokio_timer::Timer; - -use super::*; - -#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Hash, Clone, Copy)] -struct AuthorityId(usize); - -#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Hash, Clone)] -struct Digest(Vec); - -#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Hash, Clone)] -struct GroupId(usize); - -#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Hash, Clone)] -struct ParachainCandidate { - group: GroupId, - data: usize, -} - -#[derive(PartialEq, Eq, Debug, Clone)] -struct Proposal { - candidates: Vec, -} - -#[derive(PartialEq, Eq, Debug, Clone)] -enum Signature { - Table(AuthorityId, table::Statement), - Bft(AuthorityId, bft::Message), -} - -enum Error { - Timer(tokio_timer::TimerError), - NetOut, - NetIn, -} - -#[derive(Debug, Clone)] -struct SharedTestContext { - n_authorities: usize, - n_groups: usize, - timer: Timer, -} - -#[derive(Debug, Clone)] -struct TestContext { - shared: Arc, - local_id: AuthorityId, -} - -impl Context for TestContext { - type AuthorityId = AuthorityId; - type Digest = Digest; - type GroupId = GroupId; - type Signature = Signature; - type Proposal = Proposal; - type ParachainCandidate = ParachainCandidate; - - type CheckCandidate = Box>; - type CheckAvailability = Box>; - - type StatementBatch = VecBatch< - AuthorityId, - table::SignedStatement - >; - - fn candidate_digest(candidate: &ParachainCandidate) -> Digest { - Digest(vec![candidate.group.0, candidate.data]) - } - - fn proposal_digest(candidate: &Proposal) -> Digest { - Digest(candidate.candidates.iter().fold(Vec::new(), |mut a, c| { - a.extend(Self::candidate_digest(c).0); - a - })) - } - - fn candidate_group(candidate: &ParachainCandidate) -> GroupId { - candidate.group.clone() - } - - fn round_proposer(&self, round: usize) -> AuthorityId { - AuthorityId(round % self.shared.n_authorities) - } - - fn check_validity(&self, _candidate: &ParachainCandidate) -> Self::CheckCandidate { - let future = self.shared.timer - .sleep(::std::time::Duration::from_millis(VALIDITY_CHECK_DELAY_MS)) - .map_err(Error::Timer) - .map(|_| true); - - Box::new(future) - } - - fn check_availability(&self, _candidate: &ParachainCandidate) -> Self::CheckAvailability { - let future = self.shared.timer - .sleep(::std::time::Duration::from_millis(AVAILABILITY_CHECK_DELAY_MS)) - .map_err(Error::Timer) - .map(|_| true); - - Box::new(future) - } - - fn create_proposal(&self, candidates: Vec<&ParachainCandidate>) - -> Option - { - let t = self.shared.n_groups * 2 / 3; - if candidates.len() >= t { - Some(Proposal { - candidates: candidates.iter().map(|x| (&**x).clone()).collect() - }) - } else { - None - } - } - - fn proposal_valid(&self, proposal: &Proposal, check_candidate: F) -> bool - where F: FnMut(&ParachainCandidate) -> bool - { - if proposal.candidates.len() >= self.shared.n_groups * 2 / 3 { - proposal.candidates.iter().all(check_candidate) - } else { - false - } - } - - fn local_id(&self) -> AuthorityId { - self.local_id.clone() - } - - fn sign_table_statement( - &self, - statement: &table::Statement - ) -> Signature { - Signature::Table(self.local_id(), statement.clone()) - } - - fn sign_bft_message(&self, message: &bft::Message) -> Signature { - Signature::Bft(self.local_id(), message.clone()) - } -} - -struct TestRecovery; - -impl MessageRecovery for TestRecovery { - type UncheckedMessage = OutgoingMessage; - - fn check_message(&self, msg: Self::UncheckedMessage) -> Option> { - Some(match msg { - OutgoingMessage::Bft(c) => CheckedMessage::Bft(c), - OutgoingMessage::Table(batch) => CheckedMessage::Table(batch.items), - }) - } -} - -pub struct Network { - endpoints: Vec>, - input: mpsc::UnboundedReceiver<(usize, T)>, -} - -impl Network { - pub fn new(nodes: usize) - -> (Self, Vec>, Vec>) - { - let mut inputs = Vec::with_capacity(nodes); - let mut outputs = Vec::with_capacity(nodes); - let mut endpoints = Vec::with_capacity(nodes); - - let (in_tx, in_rx) = mpsc::unbounded(); - for _ in 0..nodes { - let (out_tx, out_rx) = mpsc::unbounded(); - inputs.push(in_tx.clone()); - outputs.push(out_rx); - endpoints.push(out_tx); - } - - let network = Network { - endpoints, - input: in_rx, - }; - - (network, inputs, outputs) - } - - pub fn route_on_thread(self) { - ::std::thread::spawn(move || { let _ = self.wait(); }); - } -} - -impl Future for Network { - type Item = (); - type Error = (); - - fn poll(&mut self) -> Poll<(), Self::Error> { - match try_ready!(self.input.poll()) { - None => Ok(Async::Ready(())), - Some((sender, item)) => { - { - let receiving_endpoints = self.endpoints - .iter() - .enumerate() - .filter(|&(i, _)| i != sender) - .map(|(_, x)| x); - - for endpoint in receiving_endpoints { - let _ = endpoint.unbounded_send(item.clone()); - } - } - - self.poll() - } - } - } -} - -#[derive(Debug, Clone)] -pub struct VecBatch { - pub max_len: usize, - pub targets: Vec, - pub items: Vec, -} - -impl ::StatementBatch for VecBatch { - fn targets(&self) -> &[V] { &self.targets } - fn is_empty(&self) -> bool { self.items.is_empty() } - fn push(&mut self, item: T) -> bool { - if self.items.len() == self.max_len { - false - } else { - self.items.push(item); - true - } - } -} - -fn make_group_assignments(n_authorities: usize, n_groups: usize) - -> HashMap> -{ - let mut map = HashMap::new(); - let threshold = (n_authorities / n_groups) / 2; - let make_blank_group = || { - GroupInfo { - validity_guarantors: HashSet::new(), - availability_guarantors: HashSet::new(), - needed_validity: threshold, - needed_availability: threshold, - } - }; - - // every authority checks validity of his ID modulo n_groups and - // guarantees availability for the group above that. - for a_id in 0..n_authorities { - let primary_group = a_id % n_groups; - let availability_groups = [ - (a_id + 1) % n_groups, - a_id.wrapping_sub(1) % n_groups, - ]; - - map.entry(GroupId(primary_group)) - .or_insert_with(&make_blank_group) - .validity_guarantors - .insert(AuthorityId(a_id)); - - for &availability_group in &availability_groups { - map.entry(GroupId(availability_group)) - .or_insert_with(&make_blank_group) - .availability_guarantors - .insert(AuthorityId(a_id)); - } - } - - map -} - -fn make_blank_batch(n_authorities: usize) -> VecBatch { - VecBatch { - max_len: 20, - targets: (0..n_authorities).map(AuthorityId).collect(), - items: Vec::new(), - } -} - -#[test] -fn consensus_completes_with_minimum_good() { - let n = 50; - let f = 16; - let n_groups = 10; - - let timer = ::tokio_timer::wheel() - .tick_duration(Duration::from_millis(TIMER_TICK_DURATION_MS)) - .num_slots(1 << 16) - .build(); - - let (network, inputs, outputs) = Network::<(AuthorityId, OutgoingMessage)>::new(n - f); - network.route_on_thread(); - - let shared_test_context = Arc::new(SharedTestContext { - n_authorities: n, - n_groups: n_groups, - timer: timer.clone(), - }); - - let groups = make_group_assignments(n, n_groups); - - let authorities = inputs.into_iter().zip(outputs).enumerate().map(|(raw_id, (input, output))| { - let id = AuthorityId(raw_id); - let context = TestContext { - shared: shared_test_context.clone(), - local_id: id, - }; - - let shared_table = SharedTable::new(context.clone(), groups.clone()); - let params = AgreementParams { - context, - timer: timer.clone(), - table: shared_table, - nodes: n, - max_faulty: f, - round_timeout_multiplier: 4, - message_buffer_size: 100, - form_proposal_interval: Duration::from_millis(PROPOSAL_FORMATION_TICK_MS), - }; - - let net_out = input - .sink_map_err(|_| Error::NetOut) - .with(move |x| Ok::<_, Error>((id.0, (id, x))) ); - - let net_in = output - .map_err(|_| Error::NetIn) - .map(move |(v, msg)| (v, vec![msg])); - - let propagate_statements = timer - .interval(Duration::from_millis(PROPAGATE_STATEMENTS_TICK_MS)) - .map(move |()| make_blank_batch(n)) - .map_err(Error::Timer); - - let local_candidate = if raw_id < n_groups { - let candidate = ParachainCandidate { - group: GroupId(raw_id), - data: raw_id, - }; - ::futures::future::Either::A(Ok::<_, Error>(candidate).into_future()) - } else { - ::futures::future::Either::B(::futures::future::empty()) - }; - - agree::<_, _, _, _, _, _, Error>( - params, - net_in, - net_out, - TestRecovery, - propagate_statements, - local_candidate - ) - }).collect::>(); - - futures::future::join_all(authorities).wait().unwrap(); -} diff --git a/polkadot/consensus/Cargo.toml b/polkadot/consensus/Cargo.toml new file mode 100644 index 0000000000000..aeda287f80cac --- /dev/null +++ b/polkadot/consensus/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "polkadot-consensus" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +futures = "0.1.17" +parking_lot = "0.4" +tokio-timer = "0.1.2" +ed25519 = { path = "../../substrate/ed25519" } +polkadot-primitives = { path = "../primitives" } +polkadot-statement-table = { path = "../statement-table" } +substrate-bft = { path = "../../substrate/bft" } +substrate-codec = { path = "../../substrate/codec" } +substrate-primitives = { path = "../../substrate/primitives" } diff --git a/polkadot/consensus/src/lib.rs b/polkadot/consensus/src/lib.rs new file mode 100644 index 0000000000000..f3e62ba1d56d2 --- /dev/null +++ b/polkadot/consensus/src/lib.rs @@ -0,0 +1,243 @@ +// Copyright 2017 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 . + +//! Propagation and agreement of candidates. +//! +//! Authorities are split into groups by parachain, and each authority might come +//! up its own candidate for their parachain. Within groups, authorities pass around +//! their candidates and produce statements of validity. +//! +//! Any candidate that receives majority approval by the authorities in a group +//! may be subject to inclusion, unless any authorities flag that candidate as invalid. +//! +//! Wrongly flagging as invalid should be strongly disincentivized, so that in the +//! equilibrium state it is not expected to happen. Likewise with the submission +//! of invalid blocks. +//! +//! Groups themselves may be compromised by malicious authorities. + +use std::collections::{HashMap, HashSet}; +use std::sync::Arc; + +use codec::Slicable; +use table::Table; +use table::generic::Statement as GenericStatement; +use polkadot_primitives::Hash; +use polkadot_primitives::parachain::{Id as ParaId, CandidateReceipt}; +use primitives::block::Block as SubstrateBlock; +use primitives::AuthorityId; + +use parking_lot::Mutex; + +extern crate futures; +extern crate ed25519; +extern crate parking_lot; +extern crate tokio_timer; +extern crate polkadot_statement_table as table; +extern crate polkadot_primitives; +extern crate substrate_bft as bft; +extern crate substrate_codec as codec; +extern crate substrate_primitives as primitives; + +/// Information about a specific group. +#[derive(Debug, Clone)] +pub struct GroupInfo { + /// Authorities meant to check validity of candidates. + pub validity_guarantors: HashSet, + /// Authorities meant to check availability of candidate data. + pub availability_guarantors: HashSet, + /// Number of votes needed for validity. + pub needed_validity: usize, + /// Number of votes needed for availability. + pub needed_availability: usize, +} + +struct TableContext { + parent_hash: Hash, + key: Arc, + groups: HashMap, +} + +impl table::Context for TableContext { + fn is_member_of(&self, authority: &AuthorityId, group: &ParaId) -> bool { + self.groups.get(group).map_or(false, |g| g.validity_guarantors.contains(authority)) + } + + fn is_availability_guarantor_of(&self, authority: &AuthorityId, group: &ParaId) -> bool { + self.groups.get(group).map_or(false, |g| g.availability_guarantors.contains(authority)) + } + + fn requisite_votes(&self, group: &ParaId) -> (usize, usize) { + self.groups.get(group).map_or( + (usize::max_value(), usize::max_value()), + |g| (g.needed_validity, g.needed_availability), + ) + } +} + +impl TableContext { + fn sign_statement(&self, statement: table::Statement) -> table::SignedStatement { + let signature = sign_table_statement(&statement, &self.key, &self.parent_hash); + let local_id = self.key.public().0; + + table::SignedStatement { + statement, + signature, + sender: local_id, + } + } +} + +/// Sign a table statement against a parent hash. +/// The actual message signed is the encoded statement concatenated with the +/// parent hash. +pub fn sign_table_statement(statement: &table::Statement, key: &ed25519::Pair, parent_hash: &Hash) -> ed25519::Signature { + use polkadot_primitives::parachain::Statement as RawStatement; + + let raw = match *statement { + GenericStatement::Candidate(ref c) => RawStatement::Candidate(c.clone()), + GenericStatement::Valid(h) => RawStatement::Valid(h), + GenericStatement::Invalid(h) => RawStatement::Invalid(h), + GenericStatement::Available(h) => RawStatement::Available(h), + }; + + let mut encoded = raw.encode(); + encoded.extend(&parent_hash.0); + + key.sign(&encoded) +} + +// A shared table object. +struct SharedTableInner { + table: Table, + proposed_digest: Option, +} + +impl SharedTableInner { + fn import_statement( + &mut self, + context: &TableContext, + statement: ::table::SignedStatement, + received_from: Option, + ) -> Option { + self.table.import_statement(context, statement, received_from) + } +} + +/// A shared table object. +pub struct SharedTable { + context: Arc, + inner: Arc>, +} + +impl Clone for SharedTable { + fn clone(&self) -> Self { + SharedTable { + context: self.context.clone(), + inner: self.inner.clone() + } + } +} + +impl SharedTable { + /// Create a new shared table. + /// + /// Provide the key to sign with, and the parent hash of the relay chain + /// block being built. + pub fn new(groups: HashMap, key: Arc, parent_hash: Hash) -> Self { + SharedTable { + context: Arc::new(TableContext { groups, key, parent_hash }), + inner: Arc::new(Mutex::new(SharedTableInner { + table: Table::default(), + proposed_digest: None, + })) + } + } + + /// Import a single statement. + pub fn import_statement( + &self, + statement: table::SignedStatement, + received_from: Option, + ) -> Option { + self.inner.lock().import_statement(&*self.context, statement, received_from) + } + + /// Sign and import a local statement. + pub fn sign_and_import( + &self, + statement: table::Statement, + ) -> Option { + let proposed_digest = match statement { + GenericStatement::Candidate(ref c) => Some(c.hash()), + _ => None, + }; + + let signed_statement = self.context.sign_statement(statement); + + let mut inner = self.inner.lock(); + if proposed_digest.is_some() { + inner.proposed_digest = proposed_digest; + } + + inner.import_statement(&*self.context, signed_statement, None) + } + + /// Import many statements at once. + /// + /// Provide an iterator yielding pairs of (statement, received_from). + pub fn import_statements(&self, iterable: I) -> U + where + I: IntoIterator)>, + U: ::std::iter::FromIterator, + { + let mut inner = self.inner.lock(); + + iterable.into_iter().filter_map(move |(statement, received_from)| { + inner.import_statement(&*self.context, statement, received_from) + }).collect() + } + + /// Check if a proposal is valid. + pub fn proposal_valid(&self, _proposal: &SubstrateBlock) -> bool { + false // TODO + } + + /// Execute a closure using a specific candidate. + /// + /// Deadlocks if called recursively. + pub fn with_candidate(&self, digest: &Hash, f: F) -> U + where F: FnOnce(Option<&CandidateReceipt>) -> U + { + let inner = self.inner.lock(); + f(inner.table.get_candidate(digest)) + } + + /// Get all witnessed misbehavior. + pub fn get_misbehavior(&self) -> HashMap { + self.inner.lock().table.get_misbehavior().clone() + } + + /// Fill a statement batch. + pub fn fill_batch(&self, batch: &mut B) { + self.inner.lock().table.fill_batch(batch); + } + + /// Get the local proposed block's hash. + pub fn proposed_hash(&self) -> Option { + self.inner.lock().proposed_digest.clone() + } +} diff --git a/polkadot/primitives/src/parachain.rs b/polkadot/primitives/src/parachain.rs index 0f4c4adefc1bc..a39904f44ec53 100644 --- a/polkadot/primitives/src/parachain.rs +++ b/polkadot/primitives/src/parachain.rs @@ -20,7 +20,9 @@ use primitives::bytes; use primitives; use codec::{Input, Slicable, NonTrivialSlicable}; +use rstd::cmp::{PartialOrd, Ord, Ordering}; use rstd::vec::Vec; +use ::Hash; /// Unique identifier of a parachain. #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] @@ -159,6 +161,55 @@ pub struct CandidateReceipt { pub fees: u64, } +impl Slicable for CandidateReceipt { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + self.parachain_index.using_encoded(|s| v.extend(s)); + self.collator.using_encoded(|s| v.extend(s)); + self.head_data.0.using_encoded(|s| v.extend(s)); + self.balance_uploads.using_encoded(|s| v.extend(s)); + self.egress_queue_roots.using_encoded(|s| v.extend(s)); + self.fees.using_encoded(|s| v.extend(s)); + + v + } + + fn decode(input: &mut I) -> Option { + Some(CandidateReceipt { + parachain_index: try_opt!(Slicable::decode(input)), + collator: try_opt!(Slicable::decode(input)), + head_data: try_opt!(Slicable::decode(input).map(HeadData)), + balance_uploads: try_opt!(Slicable::decode(input)), + egress_queue_roots: try_opt!(Slicable::decode(input)), + fees: try_opt!(Slicable::decode(input)), + }) + } +} + +impl CandidateReceipt { + /// Get the blake2_256 hash + #[cfg(feature = "std")] + pub fn hash(&self) -> Hash { + let encoded = self.encode(); + primitives::hashing::blake2_256(&encoded).into() + } +} + +impl PartialOrd for CandidateReceipt { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for CandidateReceipt { + fn cmp(&self, other: &Self) -> Ordering { + // TODO: compare signatures or something more sane + self.parachain_index.cmp(&other.parachain_index) + .then_with(|| self.head_data.cmp(&other.head_data)) + } +} + /// Parachain ingress queue message. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] @@ -185,7 +236,7 @@ pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Parachain head data included in the chain. -#[derive(PartialEq, Eq, Clone)] +#[derive(PartialEq, Eq, Clone, PartialOrd, Ord)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); @@ -209,6 +260,74 @@ impl Slicable for Activity { } } +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +#[repr(u8)] +enum StatementKind { + Candidate = 1, + Valid = 2, + Invalid = 3, + Available = 4, +} + +/// Statements which can be made about parachain candidates. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Statement { + /// Proposal of a parachain candidate. + Candidate(CandidateReceipt), + /// State that a parachain candidate is valid. + Valid(Hash), + /// Vote to commit to a candidate. + Invalid(Hash), + /// Vote to advance round after inactive primary. + Available(Hash), +} + +impl Slicable for Statement { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Statement::Candidate(ref candidate) => { + v.push(StatementKind::Candidate as u8); + candidate.using_encoded(|s| v.extend(s)); + } + Statement::Valid(ref hash) => { + v.push(StatementKind::Valid as u8); + hash.using_encoded(|s| v.extend(s)); + } + Statement::Invalid(ref hash) => { + v.push(StatementKind::Invalid as u8); + hash.using_encoded(|s| v.extend(s)); + } + Statement::Available(ref hash) => { + v.push(StatementKind::Available as u8); + hash.using_encoded(|s| v.extend(s)); + } + } + + v + } + + fn decode(value: &mut I) -> Option { + match u8::decode(value) { + Some(x) if x == StatementKind::Candidate as u8 => { + Slicable::decode(value).map(Statement::Candidate) + } + Some(x) if x == StatementKind::Valid as u8 => { + Slicable::decode(value).map(Statement::Valid) + } + Some(x) if x == StatementKind::Invalid as u8 => { + Slicable::decode(value).map(Statement::Invalid) + } + Some(x) if x == StatementKind::Available as u8 => { + Slicable::decode(value).map(Statement::Available) + } + _ => None, + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/polkadot/primitives/src/transaction.rs b/polkadot/primitives/src/transaction.rs index 24a3ae4ee3634..6279a2d0aa078 100644 --- a/polkadot/primitives/src/transaction.rs +++ b/polkadot/primitives/src/transaction.rs @@ -152,7 +152,6 @@ impl Slicable for Proposal { } } - /// Public functions that can be dispatched to. #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] @@ -314,7 +313,7 @@ pub struct UncheckedTransaction { impl Slicable for UncheckedTransaction { fn decode(input: &mut I) -> Option { - // This is a little more complicated than usua since the binary format must be compatible + // This is a little more complicated than usual since the binary format must be compatible // with substrate's generic `Vec` type. Basically this just means accepting that there // will be a prefix of u32, which has the total number of bytes following (we don't need // to use this). diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index b4b77e5ec9e4c2a74a57d38ded342bd8de036607..c6fc9b035c57be18a2c7c8e8686935e994fc47dc 100644 GIT binary patch literal 80217 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

1pYlHczCYNfqIV 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

Pp* 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 Ol^6!hl&e2}h4eqwXm@)6 literal 75751 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 diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index 2b5124161a1f76f50f483c1c8bf74aa9942dd88a..9f4e4cc836056cee61e8be0cab4c4a64044b6789 100644 GIT binary patch literal 80296 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 PT!CT0Ou70KmrMTx)ZdN4 literal 75800 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 diff --git a/polkadot/statement-table/Cargo.toml b/polkadot/statement-table/Cargo.toml new file mode 100644 index 0000000000000..5c8a61e81d33c --- /dev/null +++ b/polkadot/statement-table/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "polkadot-statement-table" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +substrate-primitives = { path = "../../substrate/primitives" } +polkadot-primitives = { path = "../primitives" } diff --git a/polkadot/candidate-agreement/src/table.rs b/polkadot/statement-table/src/generic.rs similarity index 97% rename from polkadot/candidate-agreement/src/table.rs rename to polkadot/statement-table/src/generic.rs index 2909d219c6fbb..11665fe114636 100644 --- a/polkadot/candidate-agreement/src/table.rs +++ b/polkadot/statement-table/src/generic.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! The statement table. +//! The statement table: generic implementation. //! //! This stores messages other authorities issue about candidates. //! @@ -32,7 +32,21 @@ use std::collections::hash_map::{HashMap, Entry}; use std::hash::Hash; use std::fmt::Debug; -use super::StatementBatch; +/// A batch of statements to send out. +pub trait StatementBatch { + /// Get the target authorities of these statements. + fn targets(&self) -> &[V]; + + /// If the batch is empty. + fn is_empty(&self) -> bool; + + /// Push a statement onto the batch. Returns false when the batch is full. + /// + /// This is meant to do work like incrementally serializing the statements + /// into a vector of bytes while making sure the length is below a certain + /// amount. + fn push(&mut self, statement: T) -> bool; +} /// Context for the statement table. pub trait Context { @@ -380,7 +394,7 @@ impl Table { &self.detected_misbehavior } - /// Fill a statement batch and note messages seen by the targets. + /// Fill a statement batch and note messages as seen by the targets. pub fn fill_batch(&mut self, batch: &mut B) where B: StatementBatch< C::AuthorityId, @@ -709,9 +723,28 @@ impl Table { #[cfg(test)] mod tests { use super::*; - use ::tests::VecBatch; use std::collections::HashMap; + #[derive(Debug, Clone)] + struct VecBatch { + pub max_len: usize, + pub targets: Vec, + pub items: Vec, + } + + impl ::generic::StatementBatch for VecBatch { + fn targets(&self) -> &[V] { &self.targets } + fn is_empty(&self) -> bool { self.items.is_empty() } + fn push(&mut self, item: T) -> bool { + if self.items.len() == self.max_len { + false + } else { + self.items.push(item); + true + } + } + } + fn create() -> Table { Table { authority_data: HashMap::default(), diff --git a/polkadot/statement-table/src/lib.rs b/polkadot/statement-table/src/lib.rs new file mode 100644 index 0000000000000..e3abf95686900 --- /dev/null +++ b/polkadot/statement-table/src/lib.rs @@ -0,0 +1,108 @@ +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The statement table. +//! +//! This stores messages other authorities issue about candidates. +//! +//! These messages are used to create a proposal submitted to a BFT consensus process. +//! +//! Proposals are formed of sets of candidates which have the requisite number of +//! validity and availability votes. +//! +//! Each parachain is associated with two sets of authorities: those which can +//! propose and attest to validity of candidates, and those who can only attest +//! to availability. + +extern crate substrate_primitives; +extern crate polkadot_primitives as primitives; + +pub mod generic; + +pub use generic::Table; + +use primitives::parachain::{Id, CandidateReceipt}; +use primitives::{SessionKey, Hash, Signature}; + +/// Statements about candidates on the network. +pub type Statement = generic::Statement; + +/// Signed statements about candidates. +pub type SignedStatement = generic::SignedStatement; + +/// Kinds of misbehavior, along with proof. +pub type Misbehavior = generic::Misbehavior; + +/// A summary of import of a statement. +pub type Summary = generic::Summary; + +/// Context necessary to construct a table. +pub trait Context { + /// Whether a authority is a member of a group. + /// Members are meant to submit candidates and vote on validity. + fn is_member_of(&self, authority: &SessionKey, group: &Id) -> bool; + + /// Whether a authority is an availability guarantor of a group. + /// Guarantors are meant to vote on availability for candidates submitted + /// in a group. + fn is_availability_guarantor_of( + &self, + authority: &SessionKey, + group: &Id, + ) -> bool; + + // requisite number of votes for validity and availability respectively from a group. + fn requisite_votes(&self, group: &Id) -> (usize, usize); +} + +impl generic::Context for C { + type AuthorityId = SessionKey; + type Digest = Hash; + type GroupId = Id; + type Signature = Signature; + type Candidate = CandidateReceipt; + + fn candidate_digest(candidate: &CandidateReceipt) -> Hash { + candidate.hash() + } + + fn candidate_group(candidate: &CandidateReceipt) -> Id { + candidate.parachain_index.clone() + } + + fn is_member_of(&self, authority: &SessionKey, group: &Id) -> bool { + Context::is_member_of(self, authority, group) + } + + fn is_availability_guarantor_of(&self, authority: &SessionKey, group: &Id) -> bool { + Context::is_availability_guarantor_of(self, authority, group) + } + + fn requisite_votes(&self, group: &Id) -> (usize, usize) { + Context::requisite_votes(self, group) + } +} + +/// A batch of statements to send out. +pub trait StatementBatch { + /// Get the target authorities of these statements. + fn targets(&self) -> &[SessionKey]; + + /// If the batch is empty. + fn is_empty(&self) -> bool; + + /// Push a statement onto the batch. Returns false when the batch is full. + /// + /// This is meant to do work like incrementally serializing the statements + /// into a vector of bytes while making sure the length is below a certain + /// amount. + fn push(&mut self, statement: SignedStatement) -> bool; +} + +impl generic::StatementBatch for T { + fn targets(&self) -> &[SessionKey] { StatementBatch::targets(self ) } + fn is_empty(&self) -> bool { StatementBatch::is_empty(self) } + fn push(&mut self, statement: SignedStatement) -> bool { + StatementBatch::push(self, statement) + } +} diff --git a/substrate/bft/Cargo.toml b/substrate/bft/Cargo.toml new file mode 100644 index 0000000000000..f1af1cda411ce --- /dev/null +++ b/substrate/bft/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "substrate-bft" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +futures = "0.1.17" +substrate-client = { path = "../client" } +substrate-codec = { path = "../codec" } +substrate-primitives = { path = "../primitives" } +substrate-state-machine = { path = "../state-machine" } +ed25519 = { path = "../ed25519" } +tokio-timer = "0.1.2" +parking_lot = "0.4" +error-chain = "0.11" + +[dev-dependencies] +substrate-keyring = { path = "../keyring" } +substrate-executor = { path = "../executor" } +tokio-core = "0.1.12" diff --git a/substrate/bft/src/error.rs b/substrate/bft/src/error.rs new file mode 100644 index 0000000000000..1f5286f5e665e --- /dev/null +++ b/substrate/bft/src/error.rs @@ -0,0 +1,57 @@ +// Copyright 2017 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 . + +//! Error types in the BFT service. + +error_chain! { + errors { + /// Missing state at block with given Id. + StateUnavailable(b: ::client::BlockId) { + description("State missing at given block."), + display("State unavailable at block {:?}", b), + } + + /// I/O terminated unexpectedly + IoTerminated { + description("I/O terminated unexpectedly."), + display("I/O terminated unexpectedly."), + } + + /// Unable to schedule wakeup. + FaultyTimer { + description("Faulty timer: unable to schedule wakeup"), + display("Faulty timer: unable to schedule wakeup"), + } + + /// Unable to propose a block. + CannotPropose { + description("Unable to create block proposal."), + display("Unable to create block proposal."), + } + + /// Error dispatching the agreement future onto the executor. + Executor(e: ::futures::future::ExecuteErrorKind) { + description("Unable to dispatch agreement future"), + display("Unable to dispatch agreement future: {:?}", e), + } + } +} + +impl From<::generic::InputStreamConcluded> for Error { + fn from(_: ::generic::InputStreamConcluded) -> Error { + ErrorKind::IoTerminated.into() + } +} diff --git a/polkadot/candidate-agreement/src/bft/accumulator.rs b/substrate/bft/src/generic/accumulator.rs similarity index 98% rename from polkadot/candidate-agreement/src/bft/accumulator.rs rename to substrate/bft/src/generic/accumulator.rs index ab035737fb84e..273fc658478e9 100644 --- a/polkadot/candidate-agreement/src/bft/accumulator.rs +++ b/substrate/bft/src/generic/accumulator.rs @@ -1,18 +1,18 @@ // Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. +// This file is part of Substrate. -// Polkadot is free software: you can redistribute it and/or modify +// 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. -// Polkadot is distributed in the hope that it will be useful, +// 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 Polkadot. If not, see . +// along with Substrate. If not, see . //! Message accumulator for each round of BFT consensus. @@ -20,7 +20,7 @@ use std::collections::{HashMap, HashSet}; use std::collections::hash_map::Entry; use std::hash::Hash; -use super::{Message, LocalizedMessage}; +use generic::{Message, LocalizedMessage}; /// Justification for some state at a given round. #[derive(Debug, Clone, PartialEq, Eq)] diff --git a/polkadot/candidate-agreement/src/bft/mod.rs b/substrate/bft/src/generic/mod.rs similarity index 91% rename from polkadot/candidate-agreement/src/bft/mod.rs rename to substrate/bft/src/generic/mod.rs index f131e44e1f8b9..f5cd34b8b69fd 100644 --- a/polkadot/candidate-agreement/src/bft/mod.rs +++ b/substrate/bft/src/generic/mod.rs @@ -1,25 +1,21 @@ // Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. +// This file is part of Substrate. -// Polkadot is free software: you can redistribute it and/or modify +// 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. -// Polkadot is distributed in the hope that it will be useful, +// 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 Polkadot. If not, see . +// along with Substrate. If not, see . //! BFT Agreement based on a rotating proposer in different rounds. - -mod accumulator; - -#[cfg(test)] -mod tests; +//! Very general implementation. use std::collections::{HashMap, VecDeque}; use std::fmt::Debug; @@ -31,6 +27,11 @@ use self::accumulator::State; pub use self::accumulator::{Accumulator, Justification, PrepareJustification, UncheckedJustification}; +mod accumulator; + +#[cfg(test)] +mod tests; + /// Messages over the proposal. /// Each message carries an associated round number. #[derive(Debug, Clone, PartialEq, Eq)] @@ -46,7 +47,8 @@ pub enum Message { } impl Message { - fn round_number(&self) -> usize { + /// Extract the round number. + pub fn round_number(&self) -> usize { match *self { Message::Propose(round, _) => round, Message::Prepare(round, _) => round, @@ -119,18 +121,14 @@ pub enum Communication { Auxiliary(PrepareJustification), } -/// Type alias for a localized message using only type parameters from `Context`. -// TODO: actual type alias when it's no longer a warning. -pub struct ContextCommunication(pub Communication); +/// Hack to get around type alias warning. +pub trait TypeResolve { + /// Communication type. + type Communication; +} -impl Clone for ContextCommunication - where - LocalizedMessage: Clone, - PrepareJustification: Clone, -{ - fn clone(&self) -> Self { - ContextCommunication(self.0.clone()) - } +impl TypeResolve for C { + type Communication = Communication; } #[derive(Debug)] @@ -326,7 +324,11 @@ impl Strategy { // rounds if necessary. // // only call within the context of a `Task`. - fn poll(&mut self, context: &C, sending: &mut Sending>) + fn poll( + &mut self, + context: &C, + sending: &mut Sending<::Communication> + ) -> Poll, E> where C::RoundTimeout: Future, @@ -359,7 +361,11 @@ impl Strategy { // perform one round of polling: attempt to broadcast messages and change the state. // if the round or internal round-state changes, this should be called again. - fn poll_once(&mut self, context: &C, sending: &mut Sending>) + fn poll_once( + &mut self, + context: &C, + sending: &mut Sending<::Communication> + ) -> Poll, E> where C::RoundTimeout: Future, @@ -412,7 +418,11 @@ impl Strategy { Ok(Async::NotReady) } - fn propose(&mut self, context: &C, sending: &mut Sending>) + fn propose( + &mut self, + context: &C, + sending: &mut Sending<::Communication> + ) -> Result<(), ::Error> { if let LocalState::Start = self.local_state { @@ -461,7 +471,7 @@ impl Strategy { // broadcast the justification along with the proposal if we are locked. if let Some(ref locked) = self.locked { sending.push( - ContextCommunication(Communication::Auxiliary(locked.justification.clone())) + Communication::Auxiliary(locked.justification.clone()) ); } @@ -472,7 +482,11 @@ impl Strategy { Ok(()) } - fn prepare(&mut self, context: &C, sending: &mut Sending>) { + fn prepare( + &mut self, + context: &C, + sending: &mut Sending<::Communication> + ) { // prepare only upon start or having proposed. match self.local_state { LocalState::Start | LocalState::Proposed => {}, @@ -511,7 +525,11 @@ impl Strategy { } } - fn commit(&mut self, context: &C, sending: &mut Sending>) { + fn commit( + &mut self, + context: &C, + sending: &mut Sending<::Communication> + ) { // commit only if we haven't voted to advance or committed already match self.local_state { LocalState::Committed | LocalState::VoteAdvance => return, @@ -538,7 +556,11 @@ impl Strategy { } } - fn vote_advance(&mut self, context: &C, sending: &mut Sending>) + fn vote_advance( + &mut self, + context: &C, + sending: &mut Sending<::Communication> + ) -> Result<(), ::Error> { // we can vote for advancement under all circumstances unless we have already. @@ -606,11 +628,11 @@ impl Strategy { &mut self, message: Message, context: &C, - sending: &mut Sending> + sending: &mut Sending<::Communication> ) { let signed_message = context.sign_local(message); self.import_message(signed_message.clone()); - sending.push(ContextCommunication(Communication::Consensus(signed_message))); + sending.push(Communication::Consensus(signed_message)); } } @@ -621,7 +643,7 @@ pub struct Agreement { input: I, output: O, concluded: Option>, - sending: Sending>, + sending: Sending<::Communication>, strategy: Strategy, } @@ -630,8 +652,8 @@ impl Future for Agreement C: Context, C::RoundTimeout: Future, C::CreateProposal: Future, - I: Stream,Error=E>, - O: Sink,SinkError=E>, + I: Stream::Communication,Error=E>, + O: Sink::Communication,SinkError=E>, E: From, { type Item = Committed; @@ -656,7 +678,7 @@ impl Future for Agreement Async::NotReady => break, }; - match message.0 { + match message { Communication::Consensus(message) => self.strategy.import_message(message), Communication::Auxiliary(lock_proof) => self.strategy.import_lock_proof(&self.context, lock_proof), @@ -705,8 +727,8 @@ pub fn agree(context: C, nodes: usize, max_faulty: usize, i C: Context, C::RoundTimeout: Future, C::CreateProposal: Future, - I: Stream,Error=E>, - O: Sink,SinkError=E>, + I: Stream::Communication,Error=E>, + O: Sink::Communication,SinkError=E>, E: From, { let strategy = Strategy::create(&context, nodes, max_faulty); diff --git a/polkadot/candidate-agreement/src/bft/tests.rs b/substrate/bft/src/generic/tests.rs similarity index 83% rename from polkadot/candidate-agreement/src/bft/tests.rs rename to substrate/bft/src/generic/tests.rs index 10ef9321242b1..41d79dcca3782 100644 --- a/polkadot/candidate-agreement/src/bft/tests.rs +++ b/substrate/bft/src/generic/tests.rs @@ -1,32 +1,90 @@ // Copyright 2017 Parity Technologies (UK) Ltd. // This file is part of Polkadot. -// Polkadot is free software: you can redistribute it and/or modify +// 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. -// Polkadot is distributed in the hope that it will be useful, +// 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 Polkadot. If not, see . +// along with Substrate. If not, see . //! Tests for the candidate agreement strategy. use super::*; -use tests::Network; - use std::sync::{Arc, Mutex}; use std::time::Duration; use futures::prelude::*; -use futures::sync::oneshot; +use futures::sync::{oneshot, mpsc}; use futures::future::FutureResult; +struct Network { + endpoints: Vec>, + input: mpsc::UnboundedReceiver<(usize, T)>, +} + +impl Network { + fn new(nodes: usize) + -> (Self, Vec>, Vec>) + { + let mut inputs = Vec::with_capacity(nodes); + let mut outputs = Vec::with_capacity(nodes); + let mut endpoints = Vec::with_capacity(nodes); + + let (in_tx, in_rx) = mpsc::unbounded(); + for _ in 0..nodes { + let (out_tx, out_rx) = mpsc::unbounded(); + inputs.push(in_tx.clone()); + outputs.push(out_rx); + endpoints.push(out_tx); + } + + let network = Network { + endpoints, + input: in_rx, + }; + + (network, inputs, outputs) + } + + fn route_on_thread(self) { + ::std::thread::spawn(move || { let _ = self.wait(); }); + } +} + +impl Future for Network { + type Item = (); + type Error = (); + + fn poll(&mut self) -> Poll<(), Self::Error> { + match try_ready!(self.input.poll()) { + None => Ok(Async::Ready(())), + Some((sender, item)) => { + { + let receiving_endpoints = self.endpoints + .iter() + .enumerate() + .filter(|&(i, _)| i != sender) + .map(|(_, x)| x); + + for endpoint in receiving_endpoints { + let _ = endpoint.unbounded_send(item.clone()); + } + } + + self.poll() + } + } + } +} + #[derive(Debug, PartialEq, Eq, Clone, Hash)] struct Candidate(usize); diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs new file mode 100644 index 0000000000000..f4b1f72a0112d --- /dev/null +++ b/substrate/bft/src/lib.rs @@ -0,0 +1,473 @@ +// Copyright 2017 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 . + +//! BFT Agreement based on a rotating proposer in different rounds. + +pub mod error; +pub mod generic; + +extern crate substrate_codec as codec; +extern crate substrate_client as client; +extern crate substrate_primitives as primitives; +extern crate substrate_state_machine as state_machine; +extern crate ed25519; +extern crate tokio_timer; +extern crate parking_lot; + +#[macro_use] +extern crate futures; + +#[macro_use] +extern crate error_chain; + +use std::collections::HashMap; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; + +use client::{BlockId, Client}; +use client::backend::Backend; +use codec::Slicable; +use ed25519::Signature; +use primitives::block::{Block, Header, HeaderHash}; +use primitives::AuthorityId; +use state_machine::CodeExecutor; + +use futures::{stream, task, Async, Sink, Future, IntoFuture}; +use futures::future::Executor; +use futures::sync::oneshot; +use tokio_timer::Timer; +use parking_lot::Mutex; + +pub use generic::InputStreamConcluded; +pub use error::{Error, ErrorKind}; + +/// Messages over the proposal. +/// Each message carries an associated round number. +pub type Message = generic::Message; + +/// Localized message type. +pub type LocalizedMessage = generic::LocalizedMessage< + Block, + HeaderHash, + AuthorityId, + Signature +>; + +/// Justification of some hash. +pub type Justification = generic::Justification; + +/// Justification of a prepare message. +pub type PrepareJustification = generic::PrepareJustification; + +/// Result of a committed round of BFT +pub type Committed = generic::Committed; + +/// Communication between BFT participants. +pub type Communication = generic::Communication; + +/// Logic for a proposer. +/// +/// This will encapsulate creation and evaluation of proposals at a specific +/// block. +pub trait Proposer: Sized { + type CreateProposal: IntoFuture; + + /// Initialize the proposal logic on top of a specific header. + // TODO: provide state context explicitly? + fn init(parent_header: &Header, sign_with: Arc) -> Self; + + /// Create a proposal. + fn propose(&self) -> Self::CreateProposal; + /// Evaluate proposal. True means valid. + // TODO: change this to a future. + fn evaluate(&self, proposal: &Block) -> bool; +} + +/// Block import trait. +pub trait BlockImport { + /// Import a block alongside its corresponding justification. + fn import_block(&self, block: Block, justification: Justification); +} + +/// Trait for getting the authorities at a given block. +pub trait Authorities { + /// Get the authorities at the given block. + fn authorities(&self, at: &BlockId) -> Result, Error>; +} + +impl BlockImport for Client + where + B: Backend, + E: CodeExecutor, + client::error::Error: From<::Error> +{ + fn import_block(&self, block: Block, _justification: Justification) { + // TODO: use justification. + let _ = self.import_block(block.header, Some(block.transactions)); + } +} + +impl Authorities for Client + where + B: Backend, + E: CodeExecutor, + client::error::Error: From<::Error> +{ + fn authorities(&self, at: &BlockId) -> Result, Error> { + self.authorities_at(at).map_err(|_| ErrorKind::StateUnavailable(*at).into()) + } +} + + +/// Instance of BFT agreement. +struct BftInstance

{ + key: Arc, + authorities: Vec, + parent_hash: HeaderHash, + timer: Timer, + round_timeout_multiplier: u64, + proposer: P, +} + +impl generic::Context for BftInstance

{ + type AuthorityId = AuthorityId; + type Digest = HeaderHash; + type Signature = Signature; + type Candidate = Block; + type RoundTimeout = Box + Send>; + type CreateProposal = ::Future; + + fn local_id(&self) -> AuthorityId { + self.key.public().0 + } + + fn proposal(&self) -> Self::CreateProposal { + self.proposer.propose().into_future() + } + + fn candidate_digest(&self, proposal: &Block) -> HeaderHash { + proposal.header.hash() + } + + fn sign_local(&self, message: Message) -> LocalizedMessage { + use primitives::bft::{Message as PrimitiveMessage, Action as PrimitiveAction}; + + let action = match message.clone() { + ::generic::Message::Propose(r, p) => PrimitiveAction::Propose(r as u32, p), + ::generic::Message::Prepare(r, h) => PrimitiveAction::Prepare(r as u32, h), + ::generic::Message::Commit(r, h) => PrimitiveAction::Commit(r as u32, h), + ::generic::Message::AdvanceRound(r) => PrimitiveAction::AdvanceRound(r as u32), + }; + + let primitive = PrimitiveMessage { + parent: self.parent_hash, + action, + }; + + let to_sign = Slicable::encode(&primitive); + let signature = self.key.sign(&to_sign); + + LocalizedMessage { + message, + signature, + sender: self.key.public().0 + } + } + + fn round_proposer(&self, round: usize) -> AuthorityId { + use primitives::hashing::blake2_256; + + // repeat blake2_256 on parent hash round + 1 times. + // use as index into authorities vec. + // TODO: parent hash is really insecure as a randomness beacon as + // the prior can easily influence the block hash. + let hashed = (0..round + 1).fold(self.parent_hash.0, |a, _| { + blake2_256(&a[..]) + }); + + let index = u32::decode(&mut &hashed[..]) + .expect("there are more than 4 bytes in a 32 byte hash; qed"); + + self.authorities[(index as usize) % self.authorities.len()] + } + + fn candidate_valid(&self, proposal: &Block) -> bool { + self.proposer.evaluate(proposal) + } + + fn begin_round_timeout(&self, round: usize) -> Self::RoundTimeout { + use std::time::Duration; + + let round = ::std::cmp::min(63, round) as u32; + let timeout = 1u64.checked_shl(round) + .unwrap_or_else(u64::max_value) + .saturating_mul(self.round_timeout_multiplier); + + Box::new(self.timer.sleep(Duration::from_secs(timeout)) + .map_err(|_| ErrorKind::FaultyTimer.into())) + } +} + +type Input = stream::Empty; + +// "black hole" output sink. +struct Output; + +impl Sink for Output { + type SinkItem = Communication; + type SinkError = Error; + + fn start_send(&mut self, _item: Communication) -> ::futures::StartSend { + Ok(::futures::AsyncSink::Ready) + } + + fn poll_complete(&mut self) -> ::futures::Poll<(), Error> { + Ok(Async::Ready(())) + } +} + +/// A future that resolves either when canceled (witnessing a block from the network at same height) +/// or when agreement completes. +pub struct BftFuture { + inner: generic::Agreement, Input, Output>, + cancel: Arc, + send_task: Option>, + import: Arc, +} + +impl Future for BftFuture { + type Item = (); + type Error = (); + + fn poll(&mut self) -> ::futures::Poll<(), ()> { + // send the task to the bft service so this can be cancelled. + if let Some(sender) = self.send_task.take() { + let _ = sender.send(task::current()); + } + + // service has canceled the future. bail + if self.cancel.load(Ordering::Acquire) { + return Ok(Async::Ready(())) + } + + // TODO: handle this error, at least by logging. + let committed = try_ready!(self.inner.poll().map_err(|_| ())); + + // If we didn't see the proposal (very unlikely), + // we will get the block from the network later. + if let Some(justified_block) = committed.candidate { + self.import.import_block(justified_block, committed.justification) + } + + Ok(Async::Ready(())) + } +} + +struct AgreementHandle { + cancel: Arc, + task: Option>, +} + +impl Drop for AgreementHandle { + fn drop(&mut self) { + let task = match self.task.take() { + Some(t) => t, + None => return, + }; + + // if this fails, the task is definitely not live anyway. + if let Ok(task) = task.wait() { + self.cancel.store(true, Ordering::Release); + task.notify(); + } + } +} + +/// The BftService kicks off the agreement process on top of any blocks it +/// is notified of. +pub struct BftService { + client: Arc, + executor: E, + live_agreements: Mutex>, + timer: Timer, + round_timeout_multiplier: u64, + key: Arc, // TODO: key changing over time. + _marker: ::std::marker::PhantomData

, +} + +impl BftService + where + P: Proposer, + E: Executor>, + I: BlockImport + Authorities, +{ + /// Signal that a valid block with the given header has been imported. + /// + /// This will begin the consensus process to build a block on top of it. + /// If the executor fails to run the future, an error will be returned. + pub fn build_upon(&self, header: &Header) -> Result<(), Error> { + let hash = header.hash(); + let mut _preempted_consensus = None; + + let proposer = P::init(header, self.key.clone()); + + // TODO: check key is one of the authorities. + let authorities = self.client.authorities(&BlockId::Hash(hash))?; + let n = authorities.len(); + let max_faulty = n.saturating_sub(1) / 3; + + let bft_instance = BftInstance { + proposer, + parent_hash: hash, + round_timeout_multiplier: self.round_timeout_multiplier, + timer: self.timer.clone(), + key: self.key.clone(), + authorities: authorities, + }; + + let agreement = generic::agree( + bft_instance, + n, + max_faulty, + stream::empty(), + Output, + ); + + let cancel = Arc::new(AtomicBool::new(false)); + let (tx, rx) = oneshot::channel(); + + self.executor.execute(BftFuture { + inner: agreement, + cancel: cancel.clone(), + send_task: Some(tx), + import: self.client.clone(), + }).map_err(|e| e.kind()).map_err(ErrorKind::Executor)?; + + { + let mut live = self.live_agreements.lock(); + live.insert(hash, AgreementHandle { + task: Some(rx), + cancel, + }); + + // cancel any agreements attempted to build upon this block's parent + // as clearly agreement has already been reached. + _preempted_consensus = live.remove(&header.parent_hash); + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashSet; + use primitives::block; + use self::tokio_core::reactor::{Core, Handle}; + use self::keyring::Keyring; + + extern crate substrate_keyring as keyring; + extern crate tokio_core; + + struct FakeClient { + authorities: Vec, + imported_heights: Mutex> + } + + impl BlockImport for FakeClient { + fn import_block(&self, block: Block, _justification: Justification) { + assert!(self.imported_heights.lock().insert(block.header.number)) + } + } + + impl Authorities for FakeClient { + fn authorities(&self, _at: &BlockId) -> Result, Error> { + Ok(self.authorities.clone()) + } + } + + struct DummyProposer(block::Number); + + impl Proposer for DummyProposer { + type CreateProposal = Result; + + fn init(parent_header: &Header, _sign_with: Arc) -> Self { + DummyProposer(parent_header.number + 1) + } + + fn propose(&self) -> Result { + Ok(Block { + header: Header::from_block_number(self.0), + transactions: Default::default() + }) + } + + fn evaluate(&self, proposal: &Block) -> bool { + proposal.header.number == self.0 + } + } + + fn make_service(client: FakeClient, handle: Handle) + -> BftService + { + BftService { + client: Arc::new(client), + executor: handle, + live_agreements: Mutex::new(HashMap::new()), + timer: Timer::default(), + round_timeout_multiplier: 4, + key: Arc::new(Keyring::One.into()), + _marker: Default::default(), + } + } + + #[test] + fn future_gets_preempted() { + let client = FakeClient { + authorities: vec![ + Keyring::One.to_raw_public(), + Keyring::Two.to_raw_public(), + Keyring::Alice.to_raw_public(), + Keyring::Eve.to_raw_public(), + ], + imported_heights: Mutex::new(HashSet::new()), + }; + + let mut core = Core::new().unwrap(); + + let service = make_service(client, core.handle()); + + let first = Header::from_block_number(2); + let first_hash = first.hash(); + + let mut second = Header::from_block_number(3); + second.parent_hash = first_hash; + let second_hash = second.hash(); + + service.build_upon(&first).unwrap(); + assert!(service.live_agreements.lock().contains_key(&first_hash)); + + // turn the core so the future gets polled and sends its task to the + // service. otherwise it deadlocks. + core.turn(Some(::std::time::Duration::from_millis(100))); + service.build_upon(&second).unwrap(); + assert!(!service.live_agreements.lock().contains_key(&first_hash)); + assert!(service.live_agreements.lock().contains_key(&second_hash)); + + core.turn(Some(::std::time::Duration::from_millis(100))); + } +} diff --git a/substrate/codec/src/slicable.rs b/substrate/codec/src/slicable.rs index fcce7806c1ad7..b2aeb08035bfa 100644 --- a/substrate/codec/src/slicable.rs +++ b/substrate/codec/src/slicable.rs @@ -53,6 +53,7 @@ pub trait Slicable: Sized { } /// Trait to mark that a type is not trivially (essentially "in place") serialisable. +// TODO: under specialization, remove this and simply specialize in place serializable types. pub trait NonTrivialSlicable: Slicable {} impl Slicable for T { @@ -213,6 +214,8 @@ macro_rules! tuple_impl { self.0.using_encoded(f) } } + + impl<$one: NonTrivialSlicable> NonTrivialSlicable for ($one,) { } }; ($first:ident, $($rest:ident,)+) => { impl<$first: Slicable, $($rest: Slicable),+> @@ -248,6 +251,11 @@ macro_rules! tuple_impl { } } + impl<$first: Slicable, $($rest: Slicable),+> + NonTrivialSlicable + for ($first, $($rest),+) + { } + tuple_impl!($($rest,)+); } } @@ -256,7 +264,7 @@ macro_rules! tuple_impl { mod inner_tuple_impl { use rstd::vec::Vec; - use super::{Input, Slicable}; + use super::{Input, Slicable, NonTrivialSlicable}; tuple_impl!(A, B, C, D, E, F, G, H, I, J, K,); } diff --git a/substrate/ed25519/src/lib.rs b/substrate/ed25519/src/lib.rs index 4953aa957448d..30496adefff22 100644 --- a/substrate/ed25519/src/lib.rs +++ b/substrate/ed25519/src/lib.rs @@ -41,7 +41,7 @@ pub fn verify(sig: &[u8], message: &[u8], public: &[u8]) -> bool { /// A public key. #[derive(PartialEq, Clone, Debug)] -pub struct Public ([u8; 32]); +pub struct Public(pub [u8; 32]); /// A key pair. pub struct Pair(signature::Ed25519KeyPair); diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index 39b6f737efc2312f442206f6204d317487855cba..d5fd4dfb021bc0d9dc3253288694113321c46df3 100644 GIT binary patch literal 13451 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 literal 14152 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 Iau@V}0qPGAUH||9 diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm index 7a21c422087bd00293fd1508f1542997922d3c44..2623dc31b8a59c862375e4abce3c9f6bf086602b 100644 GIT binary patch literal 13576 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 literal 14248 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. + +//! Message formats for the BFT consensus layer. + +use block::{Block, HeaderHash}; +use codec::{Slicable, Input}; +use rstd::vec::Vec; + +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +#[repr(u8)] +enum ActionKind { + Propose = 1, + Prepare = 2, + Commit = 3, + AdvanceRound = 4, +} + +/// Actions which can be taken during the BFT process. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Action { + /// Proposal of a block candidate. + Propose(u32, Block), + /// Preparation to commit for a candidate. + Prepare(u32, HeaderHash), + /// Vote to commit to a candidate. + Commit(u32, HeaderHash), + /// Vote to advance round after inactive primary. + AdvanceRound(u32), +} + +impl Slicable for Action { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Action::Propose(ref round, ref block) => { + v.push(ActionKind::Propose as u8); + round.using_encoded(|s| v.extend(s)); + block.using_encoded(|s| v.extend(s)); + } + Action::Prepare(ref round, ref hash) => { + v.push(ActionKind::Prepare as u8); + round.using_encoded(|s| v.extend(s)); + hash.using_encoded(|s| v.extend(s)); + } + Action::Commit(ref round, ref hash) => { + v.push(ActionKind::Commit as u8); + round.using_encoded(|s| v.extend(s)); + hash.using_encoded(|s| v.extend(s)); + } + Action::AdvanceRound(ref round) => { + v.push(ActionKind::AdvanceRound as u8); + round.using_encoded(|s| v.extend(s)); + } + } + + v + } + + fn decode(value: &mut I) -> Option { + match u8::decode(value) { + Some(x) if x == ActionKind::Propose as u8 => { + let (round, block) = try_opt!(Slicable::decode(value)); + Some(Action::Propose(round, block)) + } + Some(x) if x == ActionKind::Prepare as u8 => { + let (round, hash) = try_opt!(Slicable::decode(value)); + + Some(Action::Prepare(round, hash)) + } + Some(x) if x == ActionKind::Commit as u8 => { + let (round, hash) = try_opt!(Slicable::decode(value)); + + Some(Action::Commit(round, hash)) + } + Some(x) if x == ActionKind::AdvanceRound as u8 => { + Slicable::decode(value).map(Action::AdvanceRound) + } + _ => None, + } + } +} + +/// Messages exchanged between participants in the BFT consensus. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Message { + /// The parent header hash this action is relative to. + pub parent: HeaderHash, + /// The action being broadcasted. + pub action: Action, +} + +impl Slicable for Message { + fn encode(&self) -> Vec { + let mut v = self.parent.encode(); + self.action.using_encoded(|s| v.extend(s)); + v + } + + fn decode(value: &mut I) -> Option { + Some(Message { + parent: try_opt!(Slicable::decode(value)), + action: try_opt!(Slicable::decode(value)), + }) + } +} diff --git a/substrate/primitives/src/block.rs b/substrate/primitives/src/block.rs index 3f1f04474c802..225b86def8894 100644 --- a/substrate/primitives/src/block.rs +++ b/substrate/primitives/src/block.rs @@ -145,6 +145,12 @@ impl Header { digest: Default::default(), } } + + /// Get the blake2-256 hash of this header. + #[cfg(feature = "std")] + pub fn hash(&self) -> HeaderHash { + ::hashing::blake2_256(Slicable::encode(self).as_slice()).into() + } } impl Slicable for Header { diff --git a/substrate/primitives/src/lib.rs b/substrate/primitives/src/lib.rs index 1c282fe42e92e..9563b4fad76b1 100644 --- a/substrate/primitives/src/lib.rs +++ b/substrate/primitives/src/lib.rs @@ -80,10 +80,11 @@ pub use hashing::{blake2_256, twox_128, twox_256}; #[cfg(feature = "std")] pub mod hexdisplay; -pub mod storage; +pub mod bft; +pub mod block; pub mod hash; +pub mod storage; pub mod uint; -pub mod block; #[cfg(test)] mod tests; diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 7713a89ab36efbd5f52bf99e39100af9b34272c4..2f9b66ebfe8a8f3fc3852e05336ce2aee7b90701 100644 GIT binary patch literal 32856 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 DiK}pl literal 31904 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 OvwDB-GR^YcivJ6?m)|x3 diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index ec5638e1c183ce98875d9e6fe4db58fd09e01f70..160eaf04215b29354fc6aaece97eeebb9b003093 100644 GIT binary patch literal 32936 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 literal 31984 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 Date: Thu, 15 Feb 2018 16:38:19 +0100 Subject: [PATCH 3/3] Block builder (substrate) (#73) * Block builder (substrate) * Fix wasm build * Bulid on any block * Test for block builder. * Block import tests for client. * Tidy ups * clean up block builder instantiation * Propert block generation for tests * Fixed rpc tests --- Cargo.lock | 7 +- .../release/polkadot_runtime.compact.wasm | Bin 80217 -> 75751 bytes .../release/polkadot_runtime.wasm | Bin 80296 -> 75800 bytes substrate/client/Cargo.toml | 6 +- substrate/client/src/backend.rs | 14 +- substrate/client/src/block_builder.rs | 90 +++++++++ substrate/client/src/in_mem.rs | 62 ++---- substrate/client/src/lib.rs | 183 ++++++++++++++++-- substrate/executor/src/native_executor.rs | 8 +- substrate/executor/src/wasm_executor.rs | 2 +- substrate/network/Cargo.toml | 4 + substrate/network/src/lib.rs | 18 +- substrate/network/src/test/mod.rs | 69 +++++-- substrate/network/src/test/sync.rs | 32 +-- substrate/primitives/src/block.rs | 12 +- substrate/primitives/src/lib.rs | 4 +- substrate/rpc/Cargo.toml | 1 + substrate/rpc/src/chain/tests.rs | 3 +- substrate/rpc/src/lib.rs | 2 + substrate/rpc/src/state/tests.rs | 5 +- substrate/state-machine/src/backend.rs | 2 +- substrate/state-machine/src/lib.rs | 29 ++- substrate/test-runtime/src/genesismap.rs | 5 +- .../substrate_test_runtime.compact.wasm | Bin 32856 -> 31904 bytes .../release/substrate_test_runtime.wasm | Bin 32936 -> 31984 bytes 25 files changed, 422 insertions(+), 136 deletions(-) create mode 100644 substrate/client/src/block_builder.rs diff --git a/Cargo.lock b/Cargo.lock index 0af4fe42e80e0..b12e79f998993 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1423,8 +1423,8 @@ dependencies = [ "substrate-executor 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", "substrate-runtime-support 0.1.0", - "substrate-serializer 0.1.0", "substrate-state-machine 0.1.0", "substrate-test-runtime 0.1.0", "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1483,10 +1483,14 @@ dependencies = [ "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 0.1.0", + "substrate-codec 0.1.0", "substrate-executor 0.1.0", + "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-support 0.1.0", "substrate-serializer 0.1.0", "substrate-state-machine 0.1.0", + "substrate-test-runtime 0.1.0", ] [[package]] @@ -1519,6 +1523,7 @@ dependencies = [ "substrate-client 0.1.0", "substrate-executor 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-support 0.1.0", "substrate-state-machine 0.1.0", ] diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index c6fc9b035c57be18a2c7c8e8686935e994fc47dc..84e52dbc50cfa544c0a8899aa70d307a4b0562d5 100644 GIT binary patch literal 75751 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 literal 80217 zcmeFa3yfXIndf&N_kC}7-)=U^CYz7Ce0GzfM9C7#ku95t8OxHN+KIC3I6y?lqp{r7 zgQRGU2Jo6a6Ja9Ecn6%oNQA`LWp=eO7Z@R&jT0yfWtY1U5+Um>n2odJMT~%$7>NQ* z0%B(Z2v}#F-~aon&b^mx%95;EOoAbC`}$J$E5%D7&NVUpfEelUY-b+w}O=Coeql<)@#1?ko1f^B0~w|K+bf znPtjfO!+bOiLX6-;km4(te&!-vG=m}IN`}>zVggjf7wfraQ4@x6P|zaf+x(VjR^ z_4=JokJMhT(ag{06fE;>zI{3Gx1M?Ondi>`T9M74|N8R~@5!%z?b#>3{_L-Q?b%<> zwzneE_B4zRd+G3#U-|llC!z6kUpbTg;->U`;ry4Meg4Z|x$w2;p3Ocv`zv32_RCLy z?fF#f;kg%h{N*px(lc0v zbUc6I$@AH#yR&&#W&O^-b>PU|_ZcIB;++6Zkxp`Di6LE!p;9oA?p zuTHPgSU!{W`=Ps9W&oD~6}4E6%}~-&o-(@OcMi1hRvo41jsBes85(B*gBJBFiNbvz8rJ>dr2nUa@^duY7R;*h;%8^5^^-Gs zD2FX@+oEmgG=sSG=>qL%gQ8#MqgJ1;@J1*;vka@Wz^vgphY5u9GeQ;3fp%+ACDoGG z5n97?kW*tQ1zi?eDsCtuA?vHhup4=E{pwG)3|F)M|K2Qy7aNgZFXd-O^Awt=M3s$Z z0}scFPM8;~k{t5ki7+n;3`GIqmZvNX;i$FITzQfgu4ijuwt8c0)fw*aNAYK&f{%fV z`RXPGfLb*93?=im(JYmb{kZBY#XIv5zFHEiTXEfjzR-Yu3=U-v*T9cwbK8Oxt;uZK zY{zVFJ1}Y|Wrz9I^6c^QDA@q3%DZrRnX)aBDtn<9nlZ5m?Ub#zj~*`{b7o$E6bpi> zNB(FN1ly#iLQjjK6BZp_L>wskp+Av86N51D^7B#x05TJ1ygC|rY_tHzseI^{vtdTH z)-4XETI^4?*!FgsUVB;BIZSoZc_p5m==g`$TYtQY-mxCT6ywzNj; z+|5%6Am*ei=HTnuPoXEmFu)W;u>nY%qo$$Qcn*%?$w^M7b4mnHLPiqtwfch2Jjpj<}fwPLBU1Jhf8KQ zQ0#4)jkUQ5rmC?x?k?ayL{n|PNJsWfzThaw3wTkMtF?h|WVO}pn+131 z&7niDCEw`RJ4LJZH?L*4x;22|wp*C5F4A1`QPLGCTA!K8Kz(brjZ5EXw%T+Mr^pcA z7O21|qj z1MP}uR=i(V7{6%C42YIDfRI`Q-{HKT)LnUTz z0+p)7Smu*6xP3Ts_<|cz!BOh3MwC|bplHzCxco*`3m=ebjrZQf=mR!^cx=?`je4=i znvmNLS2*KI?2T6)OBy+i8BZL6o4sNE8)0>?u!?$kukalG0Ps+|OHKx}8B6*wu|=!S zsbe4B?wl#n0PX5pM)w;1-)cS%UN!M=O8g5~yA6cC5yhX%$KnsGOXvf**9{V&f;J3;sjZ;ukl5u_cWpJxc;02n&HzDpujM5O1Gsvs{JWskxcYXK3ZWF~Jb%xh$bBy?3S!#|#s-VeA>+glR+G zSoCqTjcng50QZ_Gf*J|ed*=gs=r1sImNbg}#nFIFXAINAz6Tw2$EXuaA%Qb~Z}k6O zZo!J^yOhOAb>vJaz95eVpK27vPmK7e#=BLnV2l`3Da*RAvPWj}D4hfiXwRjJ=)tE5 zA)xNWuQ`zfUIIDd#`q*7LW{KdndM;s;~0`q&Xj$emg;CVKfI6YKm-4P1bSbvm9k#_ z{vULTeyvEZ<4X+a*g%?u8^r+zu1R<@VIL?G&x5~T-o1&(Cz|+CT|;c+#}f(G#vj!Q)Q=9+l-uQ#6W{2*9R;L_@}|)`ECr0@P*Kpmd5V+zuNFkK!5$=r|O>J#_eR z?n-BdpqB&i;SGj_5r8s5Z zsHYx#982;810zf=#o;=A#pnzW!Sjni0B4?z2nKpcVSa{UIyM$*`RIpwPg*>Q7MrfZ zNczQ*;*mX}wW$Gs$RXDdKBgkw05j!=25i2@z@lTo!tdm?4JXvlR}Ed&(7+#tI%P%R zO%g802BD@7DOj({9v8(6(k)3mOv+5zN?<98OYV@;fW>beM3=z~&M^K-iZHR5lWD98 zorR<@6hK315Mne%gXY=pL4F5~`PYl0s5K_h ze$11(USQIKzL_zY>2L*pvDP!WG;uzX10hqs$OQ=<%CsuVZ+1pu&}BE4m_u}W2|}0L z=)*Yp0AdcA9LbDXOby%dyTq~Pv)RzZo-`b{@TfwOX0L*phVCeoWgoXH=Io<Y;XwmBYs+RM ztfy8jT~ByWYnE$%ZN#a(is&R59!$&Ljt7YSU;KZYN5qN71sIIe!>u$ou*^S?7C2QEnt!ABc4b$ortnr(CK1kuaI&X5L2^GArg8ploZvD`i|Uv5dIASB^sxEw0m`VpA;Irag0a| zml%Q3osh&>O!a-gF+7;{e`^Yu5@66Ms2hg~KUVFRlfW=k83R++z~D#=n6i46W;v~alE#y`sqLXgL^(h<((1Qh=?K8ao6F(U_nt0+{SU*=VyppsAyJoKkfN#8lfhj zdY1GEtsXaMmA5{t8sa;tYjPN}Dfm1*LR?WnW$(WiI=Y4qP-GQux}VGU!m;8g*Y))` zNjXs+3~geS?gbLdFk?W~=gh&W4$GOfATM^ZOPj?DuLN9c{CVpu333%xj?d}A3 z5P&q9pGPLCwDCREh%si5D#}G{e2%ddy8PS>hD5Wx45f}_M@K*fA+xG{c)2Ri38kN8 zG8d2@o+&GWq8f{J<#*#^t<1~{!X@xT-{4KG3v{Z7 z5{7Z@%u>@u6zuI#8OY^Ez$s=^~ktvwO*)ppR2AZ;j>jyzoXiIT7Cw1TZPgqpHHu( z1g~T8LN#};y5V({R!2j)MX)3I+`TZeFhFVG;|3@25pH=Z8}^{3T7U%Drvcdz_LfG| z0(aqs>ZSoR1^gH630S9r2LUPJ^HoE@GcFe$6AK{uVvLbkCM!>(f4UVzO-Vi6G1H_$ zh7mAVXrNNGR-$Gpl;F4;m{QdckvAS|=w+1UCufRSF$*_h#g->djTIMEOd!gaMmS-N z&SS{m6Jc65WAbw%h>+gxood2k@|9yxv{FVWLT7p}>z;G|)H^(bfv`U1SFC;WIg03;UQY#z)85@fmzf(sJ_D&{V+?2J842=PEdT$h&!PropmUYM?7 zLWBnuA}mf(J4uuXR7|uwXHOHNRD+Rfos}qwPV&xLcpy^Du1}FJIs;-FXhRtdZaYpP zkM%0x3tno;kq&0XnTTJA>Me#D!fnxiw#YA*;}u&unYa>QeUx^{q<(IevEdQXu~sh&ks%dB%z3|Cr;@W93A zISXJ|@>HHA5gkQD=PrmeqjtiKf}jK+s-NcPh*R|_+EpQpyv1m&P%ktj25_s^ z()8d2Sb78yqn=Y*hHlWOmfh!YHu_eX9<5UE4^KBN5<5_3giazTu`;S1b$rsObs_Z6 z-wI2?OeUS-WyOs86@><>{=6bSu_rgJeq>$scT_*oq*(uq>XxH5xNxVst@p9+cC~N; z@xPg!JMZ1lOEXa+$N_Q`eR2kqhiN$zh!PR3liwKzkZI6SlnA=QxN`NU#A7hP?nsY@ zT!esX)x}TGpaa2rLv%rSbJsf{91n)pVmG=VUEMZZHdw_(Ukd;;vd+|fElvCgS2Y2o zhP$L@TcF6ifU4*61?E6==Fx$p`UeE;GzBCrFw<~+)4)jFW^Fot?H-`JmIfV+%;3kU z5LqShNZ0uTuxFfPW3<})=Oap^zK~hM+sIHsax;2XrDIB*E_MbTqXDc;*jnAa1}@g~ zhlM8NDBv;zXno(znb7+JTuhBcmGSWCjQsaI5rtx+RdaZk%$3u@i1dD&rn8}-Ik7}0 z*Vf|uz!zOxlXQt{20;)iXhC}oaj4cqnDeN+7hJP9WggMb0kxrlA00s23^mZgyvW%w zaN{F+v`XcLp=78&DftY&2(s{=aPJ?WodkOpIcw1d$ra$I7c;moLa$toJOd^+E&N@+3J7S~O9` zfGkShr^T6VEgT^}Nd=6_B-kuyu(%^il`)0%ilWb6LLAZc325ACSwh64LK!WKNi-6y zF5|xP)Da>l|HI|E*n=fU*izsz5hKx+4p=2-Xn>ODfFgYi-ds%xSiK~0Sv%vp3Jd=* zMcQZ&NS34F)H_Ll;`SQq6`z_Z<@AGwi9|+sVth}$?FAcg8<;Gbs!ogp683x*54ac~qrep$yug*zeO#{bxI+KC=0u#(T^iad*!hTMX}GJgG?o8eTUOi< z0EO}q&WjDDp_a^NQ@W5&8l;P$WF1rF;~^m-qkAndCjZz~FT+|*9w{LzZ4lFx`IKX; z%J5)K!OCc=H9Xf5gp@BQDiPVxyj&~3jqYkl!IpaGeEqUCcFD`)Mm!h2m<%G^V{b43 zt1X?ic%FW^>-#C_T)olun7nFlkSC@C>E20cS5oAG$gbXk0F-($%2nA=Vo+A_2>M=Y zzL7E(yemf44a~cM=p7*1=^F{h15~uoT(|l`R+E}(ziF!5vi3yv_z!EuY=Za*?7Wx_#Tf zhEf_#r2Su%m1wo9A7$u`{#1RfGzM)|>wj9Ft2)Fcs`Wmh4LKa-!fjDSlqaF2i8^)* zutgmUi@|1sGQgd3LWx2>N^quK{XQOq+zMNx-mPx*VRltQ`OtZIW?&pX0$I`(dEB1R zrr9Qm&FY`_nP?XWQSWDFV1%h04bKgDq@ubs3##%_huY;2p;(9-X{SWHTDnjzeLb3s zuBIKSn#KV046V@3N03Fci_Pkv4Qm~T5>{VT5MLw%F&9FcI?uS{6E#|^wZJj7MdwiW)EMD>l~t*E9C?;Xur5%(XWg;B`~%~$8A(cJwR zX#Sh?cS5srrqFzS;paiKf<}PZtX|*zzR--ndMlb=-)xXUaz$VBbGWi7xpws*;G|H~ipFzfe!`co17uixwm%vSYx z{_fY;s#VYW$G^*ckIf!xTD*y>J^xijM%&N7c50n}*Rz*Ky{ZH-=CXmR`WF&ER2q-4 zZ0}Tf`Ma=H@4L>EP+L9$3hCWo(+w5s`H7h|a~B#_`C#@)Xc#fq6-9BU*6ri{M% zi2K)jc&Pbszg$w@iQ&Dx-vJk-ABYPQma3~;DgySCgW&#!J5P==x8?MgR{kApqs^F zxZE0WGRq@bz+$O$VsD#@1D`Q)R_`EVn&%&U0PwFCPfx=CO3o@HcR+6Kz>UVAc?Vd9 zGO;u8z2Sdp3Vtn;+8F$!|0hdAq_qoefm5mhFWO-R<__>jIl3QEt(`Wgb$R;M$)>W;A!)y<#1zXTrZI@#| zsCFs9kdOMMLQx%Ai%kBo&6juliFNr}qlA6b`jdet+VZnWP^A8;0A&LNkJ+|PEjk7& z4Sh+oeWyJws>7HNh9BCzejDkd-0ZQ$~p>$l|DtGjw0^r4LMTo!CwHjsh-d(ixKB=c5ML*&}vT* zkb?7$dN#{2V^&XXzi5E!+3annPO#P(&N!|oI3U?ExVMM(c0x}8NG(FJ0K{h6YRg+V zN&C#Hwv5CYQ_5Cm*6$`7P4!CqNq&xAWr;S{A=~gy5~H8cV;ee%HC6(38pWWP2GtE) z6xsjj&Z2j*8Rh3{^Nji)dXk@Bb(ttkR=r~D-bp@ITrY6iSyuZN*Xpfetx~f~p|?T~ zBn&}AC8*WwU8zoH2_3hG-LoaaSv${r+7XEEf z2ca+3p$4dvu#lF)W?JdktA2=JX3(14AKP+DTLjC~_ltT(Jy9o0z9S?KZQMTzPQt49 zyj*iMpHesRcr-D{yJP56ae-^;HCe0z(ZY(H(w1Z@;C1cnOFr790 zJtWd)sIpWBZ6b9gWFmMrR6igpItd&$L_g@(jVY^HhkR;1UcLjT>S{cxg2M=L2W8be zl3lToN{ri>p6|pBMq{Le4qJ^HMVU9zV>DN)*Z&Z9WPO|g0A{cXB>q>oBpUXAf1F5> zzZ0L-*Xk9vUS`#g4mp}GYt9ICz0wqu3iU25t_dP$U^L4EC7IOO7&Fu8cps>c-lo~_ z;B(K5FZA$6F|#n(r0%k?#$a`D;Pgpwsy7Z*?F5ety^+W??axc1yvl~nnQ2ZRYI_dw zA)ifMk=OiPK$?c*z3~U$o9TaQcj3)t%NQ?iuiC@U4*&Itp83H-1Z~1jIYd$i1|t@r zm{bF{oz}@-3^%C^G}llVtCC1>BOC&A7#a5KTJW-{!ZV!lVPYu>YnvRis;I>GgjZN5 z_b@Y%C@K`LrVhY-m3`{9Z%9hCKhrd(=`NK+g;_b!As5BVbybdrY=9pKf4={6IrTv^ zuWyd9jcjHc+5Rd2=Kfs)6Kzp%tp#^ zQef6u===1OWOJrfNbgq1oNF^n#;g753pQVJaG|_L;Jh)+MKAY4lLQQIPx~2D7y<O zZl(AZPqPz>Zf?K^4@c(Mp#yg}kUnV2-P`4Rl4PyYoseYVg2=d{^cWa1|CAJ?XKD$a z=I)xGqsVG!y@{+cq70EDd3YZg2+EzLt}Ce{{Ap4r`ywrKyVTWi$q2ce8If?|P&xv| z7loTqgqavA<&R)DO(FF2A)U_u^q-hK7NUV znvRcQoQ-j*qi+;llm6II!6zB$3B{~B8=#hwH;gkaCW@>r( z5x>&86^3lacKBTqS(k#YR_f1CK(aq)JR?G z!HU#l-L8me6xIQ5PI67!I}apsmkKCI*-uiPb*&py-RvGzM@UayG(u0ghJpA8RhiwG zcEhmA=CQv=L$Lu}-3U5e;oaJ0wQw=|`VAlBCfF`a1PiPcqZnv-7tq*v< zXZO5PSs@)+*69DQOU0&ox#dk3pll*{lPx+FffmQ3gxl}J;$t+j3CAQXp1Syr;m)v0 zr+O^t62S8&X{xKaUtechD3B%Su(X>hTn@1ZhhnW}ujd@k)$~)cHtC2cvgU+DA!eQ486{wPK^VA>p9%vIj}3kF@QlU#IkFnd5%%Dl!cg~iz-)T zsDjxl==Ui5wzqrNdEBiql!H#CXz4H)IolJF0oe&1gQdorVIgJHOKOi`-y}%I`!KrU z7#GF+sl(W$7txo>*o-g3fm~`)8K4CJPZ?XV+FLy1s^d!j&O{1z48t(JtTIt#BR;`i z!l&q?=Fid!kub{HrsM>-(x?rk9EOu=0HdMqY)VuAuG*GkFyY

1pYlHczCYNfqIV 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

Pp* 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 Ol^6!hl&e2}h4eqwXm@)6 diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index 9f4e4cc836056cee61e8be0cab4c4a64044b6789..a92614dcc2d6fc281b868d3754d5c972ece62333 100644 GIT binary patch literal 75800 zcmeFad#qj8edo6y=XKAyk8{a;`F^Z(Ok4LVltnudsZg@T%~-Nz*|C!Gc$`dH(X|!Z zmwHmP;uMK_lW083#7UIG$Ouz6VW$Gj0jv%asHtYgO_+?5sFN3gx`>J~2An{D2&hr8 zi6;;;Zq(2B_gib9eJ-ygO0ow*J0#9sd#$}5zx7+c*ZQr;&OZLg{dtyU`8~rE<(V^Q z@-rt2`>RNHqQzgOS(u&3Nop%eX?e^{^5?S?Sw=y^uD!MlS^jye?DHqG{7mtG7K`P* z4?H@5@8?e6^IzTf@sszy`<{2-csMJRxJ8Nge)8Qn-uSNXyXVn+PkrXcej+RNVu!tW z;IsGNd+Ot-@BQRGr%!$6-g{0x_~7ZRrPn>Z{;^Z{-kY@*-KprO?md0a$M3uE!B1F$ zM@~O@>f@ifH_P;XDZP)W_k8Ao(+_4Hz3S`L{Z=mPP7?0D{}cB=^!!3RBfR zsSnoWp{07S923^{StXzT@drP5&%54z6G;8g2Yc-v{|bJsqBUq0406_O=Xsvxd9TH< zP>$JNf3D5H{=EO=u_$_jd_jf#z4;=a&s+UgJAWvjnQ51Kw%Gl>e4%syz4t$O>L-e9 z@ziG@VL0#o)Mp;J=d%y|_-7vYWVTx`g`|-^fWC2;6vNWnlqBpN=tNwCZg)KvvEF*k>O2_wwejIe% z^N9yP`@re!`}=juBiZ`~AOGy>Pd|9-Gp9du?<3i5gHL|;^iP1ZM^4{+D!YAVAt7d{k#b0ExJKUA@B?9Hr69gi>=+kop?x^Z!b~Wt)|%z6!WuP<%b4MC!CNJ?LSfHV zddzd66qPKEyN8PdJQK835xI(Ep?%w27IFcShj!IIJ?biRZ`3P~QD0aK`S9;5<-n+; zAdCvi_CiUCaob_cLQApUS|~z$INB9jWN5FAd)`7vEfm9YK$pWB&2+01Yvb-*HW-A` zi{^qD_*ctp+&`jcdJ-&kCiIV#p;G4#(ec*c`}5)qaD&UHyT+~E^qB7D zfZaYR)bc)b)YZ0iwK(SggEiI@Xk~TggLAD=-Zn?6VQ1W;C*|-uF$cPvn*(TP*$Yy=ZVr^epRKgg1JZ#! zOXH540|YV$l&gqZC7J`>sysdFAl(boQ*NLHsW{V*RsMd2caDBSu8*ig7D-m+!|muR z$@*~@N$;STQNio{D8j+aiXIkDov}?NGEXw}n~V(E5-mC?J$7ZaEmdo|Y1DI985NUP zc8Yo<^CWa>fD{z2fN3MANJ4+3y+b!@QPqd=%{qx@09KrEgHFp&hT_A*Rw&Sel8QWGRph6!VTgZt_c*VzJLZa55_`d|6?%i= z@P4wlMg^7vs<<;Q=JMHgd_;Fpy?!6sJsgeD5JSwB+vcz*u(}L%SrD?N25A37)#C77 z*`S)05dg~m_ioW?*Z~)^lfrBZ8_jHhuGs(%)a0)Z{~3Bxb?%zWpoe0<%M78_?sORi z${H1PP3b!+&{bg^IJ;m3)hI%c2@F<8jEm(${MIC)cPfCnr~;vP1ajzJUF9MMDxWpN zq(${*C0JhqF(cE~aF1#xzEZ4+I7%^87aLgiHMwPvK!*0(bW&F;9sSjIW2(oRCG0?72ecnL4sFP`RGkmj>&j6 zm5;4*jCfc(5?Mp;ls4EkRl+6U1SXrR`Bm`uHsKHXG?h0BzKzs==nX@mdLscsb0U;D zN9sxp^`_@Yn1DyhLs&@N>Oux>v<83KDOwG-4ktB3VSeFU-QI+&Lw;SBRmRip#M2$; zX;_+q#?oyuK%<&p*v`qjV{rGbkYSmZTCjddh+R5_e6RrwWE;GGs{%tGi_ zlUIa33*AoTeHCOH-ENM|v1WKRI$Imi+1h~4)&_L8B-9${M4C7{Nn9~$EEJWSi{b`; z;F7E9hf#i8qE7;SxI?ruM5%e#6x%U&*@hkznU_XWsA!XIKquKoWJxnI;cOrF}6gOj+i%gQ8fxIHk58~cPw+{Sy)Bra=! zN+bKth8EyUb@iYGa5Wd0v)b@aAndG#Iq{~wiJA4hc|UGw^n;mqY$$f*j~WTqljj== z)|KZP3Dy^6T3v^A=9Wp^I&)KsH#_s{@O`8KAAX9uZbS4p8wm#AON|7B@5M%f!FQ>V zVDNpTkzfG6P$xtPG0Z?Wv<4Ai{uqVa6pTU+5kvCJ1877-e5JSvI{_0t4uLEba!c4l zrVx+iFe7Ew=@*BHNA>EEjFe*x9?v((`S?Db36=bW^WT$$;gH_~^@?1lT$`Ygm2MBl* z%vUh#({&t^_}8$?Ro@H-RZnvmMF!EJ8mPh`gQ_29Bt&w#;!33+81>a>_hiYS?qN`O zm)|G?CZ^ za@0Nkw1#t`czQS+O8zj%`1QZ-lcLLcoE3dNkJF<6t|-ceD92~7X)=g2e=ftLM-8rg zy6w4~UP3+C3>`USm*f4Jag8-$XynCE@b})yKo zU;Od^_Lsl#-~Pr?X&8D!e?9vYE(}b=1)R{p1rq1JvDkk2f|^(K$q$>YrAu|MdLci8cu9Q3T@aAk0Akk2<6e*spj zt{DwXAZm4OoK;W!Nruy3shAF0>cG3nGuRKslseD0{~Y14up?4Nqd+AmbjrUYsQLL zp_va%$}s&!B50*iQ#EE9le#Ru3G<-3CS)f^Gu8K0>+8?C_8X%G9v=60Wm~n;KmO#(=SJI)V&obtn}4Dfj{uIpfHn8 zkmGhfL~sady*jwA#7rk)CbhU3R%kE-tqIW;v)_Y0e6scpU2^C;CRty`uFH#K<*~p} ze3$_T?OH^He;5)f67ksh$h2a77#Ic^>km-|ou~qTF<0V*pzT?o9_Npau$!r@;;F3{ zB4tK@#TZpK8pQKThNA~^K%%cO-t&~T*IBhb#93Vxqj{1$)rEZ2ulA3+jrZ#uz_vdO=TGRNFnXwg zRc44`Agfb?O2zmCBxb0EY$CE>naTUL$i@+9E(zF}X+si2uNL|y3);{^PoFsw6Ah*` zfS%!H0%%Reqd-G@F{nwMDHG%w)H_QVEsV}~>v@HB+es6RUxgn~5?L1$G7#Qb2!RIxhq0je$3 zC#J9n>h`F^jEWHhlpSi6t_IstLhxZIG!OkXidMhP^pXCv0cJ4Q(Ncszw&jOZJM^92 zdW+YQ|JH}8y+7jZO!Z3sFdTwf6sj5cwsx$@L!o}EP$!mXse}(GPO?ei%PLGo`yU?7 zU?Ni=QxVnLIeltWzFw_uuaWslNdcgv%_cq36!AeE zZzEFL2CcbJzJ^9J-Qoi#@Gk()dVV|V9v*4OLDX24uQ^t1f1x5q!2dIvgOg!K@`Yru zMT;=s8)}i^hXAN$ZB)V)ne=8KfTG^)OK&o)x4~kPN|1s4vad=_yelP1nNviWDmNs> zOx}Yt(REMYtB%&VA4My;Jer~3M>Ax%*Zo?w&XC-bXl)}}TaEWgw9X(bRn|nSaNR<* zN(O6)YSGFvDkext&L~=u`s6gxDHaQ@Q;5#KiPm-!t!>`pv$pq$R%p&dtG)MB3L<|e zqE)D|0q=*%YV2e}v}QhLV%gARl_{&kernHg07mrOF8N_q8- z3{y=Hue?&;B^IhKE>x@4`C)aws4i`(exDsabA`0{U({w?4qIXuWMn?ST#c&rZPl;j z)!FUUOUj&!X7lQaZ@+(yKZ83#Szi75&!1ka{{1f;yo={wJIC{{?$G1E`*R-W^z=8c zypla!{p#iZ`-%Ls-}vlWwW8!d{AHf{cRj3su!ZzWXCPujexCYNg)Q5C96+SWhmc*2q*;{|{4k#)(xIo+r9jm>gYN_1bOjYg*?X@efE1sQH zj5Vw27Me)4(&$E2##B=oATmZ=h(+nk>VQHai1H-Pwv)d7BlMUBl1JNd2fs0scWN`~ zGD|l~RT245*-(O#rd!<*rAYPDg(kUFdlGTGj;I#pGm;qk;#ds&Xf%8PZUWXbYi203 zR4YC}@{xhPza8eZU{zXDVzI(51}xbOzKsCEDHqyIg$9694;OoQKHIL&vxSA&4#z3& z!u)sP$A%1fAfT&=8NGG|%6pN8_L{(cJQ#S#?hu+vDSGQ_P-d1Sm6<;bw`5&uwWN+g zQXRL4)HT(w&ao}h8C*lk@b|Ej*!i2IiiHb|8aNO%Nod(XgdXs(&>I$j&;k`^q-a?& z48<4&`yV6`?B75sZH+!$+^t+#nKxO=3MqGxa-I}ze4N3!JY0N?kaY^GH7}r&saT$T zOQ!)(SEgq=!|%nGtN}6i&*p%TNzOys<7t*BVBtwn(IQW3`vf6tM5znU;W-Ad3Rft7 zs9q!r>H)w2pGZDmT zTwOS`YwC;T$(V+W&BZPzWPvgzP3EUfsIf6&Yb(m&Q_8Aw`xPDl6iIr`K}Av81_05v zqCk*UZcN`crUyvHmH09A|HOV>|NQ`k`YZiO7 z@(?SwTotY(Y`x<$1lC(RuE3;U-g*my*S11HV~4zs1KRPc+PoQF+(h&i=(jRX>sK!_ zCH)|2Unjhy`u46-UOjszfv^Lj=iLPyXtHB(LeeCem%{RxTwvIqE5#jbP9gZxT7$^qv>x(wnOc=H zX^N_VQh^b~v7&Cf8JMe4hn#fyYYZCL9T=+4`{!({BY-f?5_xCUrQN3dXKe4on7Jp5 zkG!T}$;w|UW_uoEv0~6H2{RmLz5uslfC~z&_~Pl~;R|8#7(4kl>4vR8f2X_g!p3f} z-OxCgT6ecZRz2_SarT5(#!MX1plYuW+Q2RHC5?%#7W-O{{0-Ws^-Mq@^5&=?^FT_f}>wq($%3=aJf%^y^XQ<^kkm5*|u zkrd<)?|l(9QBm#&@e1K(7;b1Ol4F6C19e%*=jB<+n#c3$Hc_0gkS{slNU<37 zF1cd-Tq-!AB_&DO5`I=Amdc7S4-zwh@cf+M)pFdVEK!Ns9fWiv)(079g5;UJVWQPL zRl)TvwuTrNe~U0L7b}QoIJ*MOPL5;*IxtaUMJW;ei5ewHi6OJ6Ab}teWg94NAv54X z2igFnWk8Dqkd|63&Z&_y9HArZ0bMO`N_mKaoZ;?l@JNxLDVwLisJ^AvhCodqsMWSP zhA~VSMF=P$Tybq_2 z78fQw;$Zep`7wiLvJim$`;>H>T2?a1Co|QWX|4Sl1DXEj)2AZM;rqOufp(eT;G)#j zYAQvi=44mP9EwY0uapl{Muy#}sOVmK%w(jdXc&S!PFFiVi%SacWfqu}nK2j!rjt|z zd!39(Bl!h-m{iD1;KNaD8`8sEl|RC!u(paIW383hOmh|XiVgJoVdU52yCk$I*dHDy z1Ovkxv%#M?Id)iYEq`XEdU03P8Sd8(m>z_$jWEED;{yhR0Yq`ygFd@9Y{4G9o>eY? zrDWs-tFqXhwl>1y5gS?;gnzCXW`F>|7#I81h3Z z$#5HFdkv(qL8hgfFr2T8#1nPe&kZ9DezD1Gl1ji&brpx4W(m$;BQnj<4w7;<7f0;K z?952Li7E~eiraP&!aYm&LP}+Ygm0Skl=P~Fq{_LxmbP*sX&Ii|Eh_)@+_tV1$A%vs zqkJ?al$-;18Bal$1C)sBP;|8%%6l9Nd8YL)jO} zNVwccV4vSY_02{C0)L@;sgVH1EmSWy5>NpP)ul!P-jRjs8+F2hNk!3uAYLuc=A$Jt z0I^161H?F)mb43nr8q`PJ91R0x>Tx8P(b2vr@C~BnR=|HRQ#oKoT;v09j5Q|w)u_H z9A6Sj*iH*8W!hV`P`v=RYnXZSqHSKXL%GEMs7Q;`$gG^4FAMEMql6|HX&k)s<(d!7 zadk~cQV>;}e&wuhrc?legZL~_xE`?c-fmy}2 zc%VUL>afj&?E&S;Bjd%9N25=TCsk*|@sex~%C;C;|%c6T_QVnzt zYMGzlVfra7T$i0=UnA^XZL({hdW?jAC%4V?*1T#o^8Oba5^Yd^eUeD)|18D~5l^yF zF{>`GI`+=CMTslLlkJf@g=n*V91GQalr#&~mO4#Vjdl?&RNHvcM61T@_Lz`ei8nGa z%vflsu_@eLHRdF>f$__naYw3hE{e$4in-<4ZBQ!Ji?uKdvE+QL-)b+amsYE;fz9xX zc&6chLqi^6U7B5vTveepzp4|e`}OKlDYB9T7=BF5t7m6w({u}!hN~DZEB(p#*zj<+ z&74~&wy`Hi1$Ie}m_S;VC#!IOReop=S9)Nw$}$%t9fq7R*NPW&**BGp%S9GRsthxy zqjf+h>bKIFwmL;;I&=n!hyT^raSPBeudbLC;PS3((xq*O)VpC`o^`RPb#Gi&+54Xk zOFxPHK_1GkO?{Q|=6U8PdFGX8f{)k9GcQ#3z_8Z?&aJKS(pNN1xovI+Df0^d7JioI zTLPS2KRy!pZ>3!geFHj$F(gl$d|nzp2?)t@6f;9ekK|9CKpRR{Jp;hveDE&em(a4r z6W5uIwwYA8Y;vM05?->D*N_Jn5e}t9_d@l!iH7snx@dU3jd{!nJptJbKROXvmks0h}J|t}*nYL+>tydJ; z61IL6t96l4A8!eZAH&D85CHL~j+E!1D+C!Tq84SWNtw+cVFvHS^d;tw>3JLLAy3ALbIoZTXRN8(?SGz7PBoGSth6*x=wnBf-g@N{rXKa#Q# z&NrwFp`N7bn{S(l+FH}P@CCo)nYvfC#_eAfaz#r(Gi-}88Yb9KhnMK%OXbM=dP$~O z>`v@S>_mir8uU$|#{X0Uc{Q-H3NA}PKs3xZ{9h|oclgoahx7vNHk@75lFLGM-Waq_ zUzp_r2D{-!V&9Y>OIJyRXugF(cE_5gmeLA{5Q)R4{6>U4e=v#=NSOOBBzAU8Yzq=` zw&WzDRoRwX2n;9ol0;MGZuDgKnx!uR{bhE;6xv%P(Wq@vs3MJ|hJr>k)h#9XFmi~t z>YDYQ_Oy6QAY^)rN{0mcq!SEMx^ERmbDAKJ$Uw7i(T~KB@e!3H`r9?t^>6lIY@;jh*!kHAp4~;p2RpZ zi=9ehm~oq>B#jNHX>B?g>5ZM_>8+6mkzVTqmj$>F}Rm8$@ddjx?+r>)XY=W~TOXU|x8IQz{Q|CcfRnuSNR--_XH=aOHP zLHaTY*jiyGNwO@2t*hCyxld%a>LMGZmadYv>g9QRd69aQ_=MGmBS4{Y$GY%`^#tI> ze54e;f$SHLo9K%<*T!2sUdChvRw3Ehe-JQuhSmPN#&Zqd*_<%z;8NjGH~GXmFRFFj zTePJn_{2T}oSKg~n4F~)Ff(CTmsOJSV7kj_t8Ru;*RcpwE>&`oN*<#9^WLHP`r;)| zq7Hn5set984m_AM$ny>G3!Y>=&P6UQwjeDa2cCiL>OAQ?U&Sr%Iiou(V$mnvfMkQLN+!MV<5_xm#?w){OP)*bY6#=F*eB zRho)Gg)yDBOg42~Hf=>oW1h0sE0CB64!iO!46#L(TtO z8-?JvC-eKq`P0W|KR;g5jyaZum%c(4-16-(^h;gX#LkYmg6V9IFr54k3oiDk6i0tC z;!3tr7t76g0~%aFRAEqTm1mR@@N_>xjGsdg4RPO&wF%M1v(#RSI)}OKC#SoI(uAc}_UjzB zW$l(a&fA+(r1Z&Vg4bNA30^S3y40j=2vF-9l8Y+LdFmpQ*`H(whYgZoHr!a>aknWl zhh3<;$YN*;TNoX!Fev_YbBS(ono~vdfZxO%otZ-2ctH?w{9E}(yFfIyZAoQJI@tqZ zBcNu+Ho_%DBEuUo@{F9SOo#=_B4g)@Vo@IVMHWKH)@8rzOB`~V)gCJdf?T$hxlQdX zk=(~zYp_;r7x9(V?ET~R)5ps%MB2j>^%aN)+GEV2Jr5(n1EedGJ zlFg)?BLL_{*6RVfd#YM+pnLa^`%fP)63{qIBG5=PfS$Q+ZeVPJ#zp6H#_aa-7JAFI zjSdObEpnSvRX)o4)r|MSHh&n{4)208>&nB=p+)hM03fHF)rmpaVmp?GN&-Y|%?TRj z5_7^%mNvf2ts)$-XDmEbw%87Tf#hdJk1N`$Y-Bq4Yi;)Kjd(>WTt+0 zh0`$1B5#KbtWAnk-Dr!P>tr3z;)CKzm+7&ZE=pcBx&l0n2{>ofu-;23xLGfhB_nMk zOD2z&Odc(nJX$jOCYB8Ok7gIF+|lfJV)(l;{MRvjE{4As!{3kLAH?wa82+y@{5LWD z!x;Wi4F5QWe-gt#)#~UBGc9A;VL=E#%fK)Oc^PrXJlf4!5>)LU=XnOkUou%rOXtlE15wAu<(ok6B6 z8HB~%RoaXaG@T*Tl?@mSJ(Ga=gml6vN4DBQApE=90H7@<(nM@e^e46fP@mSw!N1*c zVeVi~0W1v5iACPSk3H6*dEu7;$WhGeq%8@I?Qr?qE`zqH4;XJJC=$o<3AO>lGmK8ta7 z$YLMxKs$dCKtJHYhdp55r4oP8gCFwX?|ASL54f*bSw8B)-}8W7no9g(4}Qdhzwg11 zdhlO(@Lzgx4*}|YxIlQxCj>ni%pa57@g!JUPP_tJJ|)3_oZww8?yw|19XnE-Ab*IH zl63j2rBK1d+P4(SGpdox*$KK@oH$YhtQuL8kH$X9A=5`IY8rs13%q!u0r49yUZ)DPO619SH zY&@zZ|LPn2M3%qYn!0{ae5H#v(C3<=GbQhcS^UKPh^e)NPsoPclp(7dUB6O1B+V>i z_K<>`vl~2i*keaMxJALy?7be`>Vepf#L9!?9(=zC@AKd`4{rD1{T|%m!JQs_z=OLy z_@D} z5e6_#JT1-`rm3dI8AjXErphQOA{{a=VC=MsRp3Q4LXUK=7n z_2zDxCU}T4rfdk=$ilL$17bUHBnu#qP9%@PFV7b{8g87kki>S8#P;gT0Y~=_+tU0A zq73;l1vh8!^Vsbk`+x@@R3PbL!H2Ch&tmBzA;gGuWyNJXgD~D9oNpJC8UuP%ua4=} zdLFh1!r)m{ToQqWd7j=N80W5G-6Da}Y`vux0AkZtk(2^L07l?(1d*^pGREz8%~&l1 z-I5-{E}W~nca4{mhbJs+(6_IWYs9`n3{3T?JVBkz$i{O*Bk!xZB}|eIJOP-9$k|)6Ni*WZCQHTLJosnhdCX9l`0yP1Yl8pXgloJ$I*2t!|gAm|O zFu9$VgGT^}!Z0O0IvZ0J1bZnX7VD}dC+V~0Z zv8ALFcvP`iOYjJ>=8egCpPN*sk|$yZg&~S=t>-4rT(rJe`{kgY1c!>QGmX#|M`je( z{fR4aq4rZ6bjJi8i@9%U5Sf_Lj*r=E4wa2jr1>hhjr!0S3z4;Ya;zAx6WUY1e1zo{ zPS}rc5QZ+CZD)5Bs2j0|>0DPNgxc68U*%@l1An&dfYrcQkU4wZV!FIPArVU41{id3 zc#~`)sE_L_quIL*@r{oVm*6Z1i`@SZmVImYvLESL)+Uj#JiJ@ek&XYuGJA+}xA&LhR!10rIc{=< z`IlGA7xK||lGfR{v8?@(9BY%aVYzx4 zH7<9Ly}FQxj2j1diw{Jn^fHH5n{qN0dAT<(pFaL%{`v6^bDeg=j<2Al@TGK>b8?U0 za4we*wI}z;vJN0T(^aK7KM+I+CxqDH;#msCsw;N6AZ0i`pGj7h$H<|LFU!Lp487~J ztm^8JN2Z|ykcbGC@y&-#M5L69Y&CR5Sc;%i7oO>A2Dn_E@2(B+^e{?JdwsrZAjcM{ z<5gSGmD2cury8m2;~k5K?C;M4lV`kW=6n+jMt&+tN94SXyL$8LAv+dq%WXMMFa`=Z znE~2P-<<20c$8LAtCRv6aypWUnZ5N(zN{fKW5!SEnUGw@f!W2*NC=YgmuSaG2Lg%- z%s5N(IgQn+sUXR9K^qv6UY+8&)_A1KoiK&Jl;RaPOL;xbnmx~z^)&MsFHN=X^^jh- zbtODsgmwBF4(AqBr=3M!)<<|)$zKlJvD*l%FBy*|z>QSDO_JG4M!_$)aWo9&Xz0Nu z6w?|W3Wm+xGS-%>Cp)GX*xSSKN;H)z73rou?DYW{&r4a|+f<)`L3miHCp+evM$oY@ zlA4Fi`oH%o#(WPBeq4Ml9K*?h=WQuuqh1Al0O%@*Z-Rc~=LW@l9jJaYk7D z)~%VX-a;=1bFSLZPj@JGy$6rY#N$}Y2zX`y0ubi@wi@RM!DEW+RM)x$_g8t4z~zyi zLtaY!;-m(F_(ISLfl__~{7ka+FJ@_{j);NP8Z2~~NZw~?L?_%(ktvzjO&*~wyDxa# zv}z$k&qN9o!1saJ%2*YnrQ_LXyM}PSlXdl-04XcU!iwwfCD9gCM6(G`Wvyx}sdH=B zbNygWDiOZ`97)cz?Kv9lV2>B5Vx6)QBl`o~~kH$h5fGm&obC<%-VH|Zsd9!qbz zr)qigo^sKdZOxSYeN%lNyjq{>QPmzTF_LzBq4W8$>geoDx^l~wGzFaB5QY7tffsXY zm6O$~*?C)K5d}yuFle?up;1OtpC;f~;zRMRN_{}ya2N(-&rcE0O7lE4-nz!>fEMR8 zG^a;9f$n%AI&1!i=DO{fj6*RkZo4qjVb|);_UcxPjJ zmjqLYP@z?Yl{C=$%tlJ+jFzM%t7ly@<1?+rvXT(XEO1OEfr~j`fS2%Aw_b+io;4vw z37BQR9@8{N)yuqrVHV<>mffjnOaqoKL(VU&{5j{3p>i44CB$PZ<1*OU?RJk0wj}VyYF$c_E_#+b*^PZ+J6fWl1m-!HHtf}_!Bi4p0(le6vxwGnk^oQg znil9qvxO%B^GUrH-T{-v!}Qvc0CSOPRRUAFsH6e8z`V@Gx;88j0#!*yBsecSI_Xyp zr;>mZ(3^0clcW;9E;%~sMru_}JV_Im^!iDMv(XJp0?sDr$_1Pa&{fIHpc8|@XokN) zTf_N+!%4?#IF$sPfZl}jGWdK!fIRPTYPV#A_AY_X=k;0?3O*a%uq5D|fUc=)qb!z( z6Rr`Z=-RQ!c3M*=VH;@Ho_(;Kgqp2i&k8`)4H}(;Vs^3mOxS9N%(ur~`8qO>p4_Rx zKAMo|41-`5h?TxYJ~Wv=IAc?%wC+=ngf_j_R1Qn80Pr@;abn>(3$MJjB6HExTkmvJot=~P#i8H~~tIigN zVy=C!zU+@I`mL5v6d0Ag>LqBWr%Q6<1cQr>`br_aPJz}exlXu<+_UCv2Kz#{f|_!G zv_;pp8>B^zElX}LAuTZk3f95 zctVL^n$$pNqCx68_zUn*gfx1yuPH^c(mR_{978xEeYTehNlc|IPjbQCG|H~5#)pWU zbv<5jvmVDQIqN)=!ANa=6@QC&BEeG+Ps;K|>`hQpPa1oYsie?{l;s=_2vE%lz*LLF z*M#P>RYT4?&jh|ykN2U8(yue4>{XQYQbqHKaG24Q($Q;DxL1)KhLnNAguve*jCEI- z-uQH~euM7N0<_-Ln;01S)#B@IJePfh$SsnQRF+9#GN&{boJE*Z+LlL)FsG!{df)P` zWHwjS^#dG_Udi_0s>ZpjYp{p~W@N}xT}>cC>l09Fhwn83)feOn9G^A;ozQ>VCY`T- zp1G|_XB!brrFNxGymd(|dlhGz6A^;`dPpIa;myq7xf4dq--Wux8oeY1H*%<3>@b&4 zV2@&fnJ7E3{KkdUEv{LJ-O@ChZZR$9uer$B9&z8*&!vOzX^>>^N+8>czYbQAqFJZ4 zGd-WSW5T`4IY|SY=u#ZararqU2|Z%q<{%PeJZt%qMT{U}D@(^|%&8Y$e&?I57PN#?=D4Aly^G z(Sq?~ts}+bw9sVSLX2z6${A$Lnvwg%Edt|G>T&y?f_IRr6F6!g3X>}gfL|^d>kc>F za7I6|(J)Ze%z9weLHL7G@p#Uf8~!AUIe zx0w;W|3mHixl#-x6(bgs*!4W5Yk$#=P@L-|9?!M0I}r0vuuKU@c2Mlnmws1@U6R7^ zy%8nF?krbQo$5>Vxu&?85jn1Jyqm6~sb?4`>;w&&Z0^ev*2InRvAMscxNL6Gs@dEo zGHv8p>r&#^CN*f#-3ff80z)+@Hf zF}^y~8JjZX17PX|XEy~r+X8eC4gonn;8(SIHGKXK^A6hLyQ=aYVCu0PM^3w5CzMb7 z{NebrK8KEdbv-F9{#vj`$YV4kM_*_nFA&ml4 zM_u7bXcX?Bn@Xbc_k>$gQn+fM5#L>;T{pf&(C%+&F&@SbKJ+DSqm zZ?zp3RB}rgrPr23B{zrFsU#{n8s3$X1jtz`IYAc_biHtMeEptqw3+dQL9FjtPk^1k z_-ddD^8H!?Vr*s13m^EfJ0078Vsd z5Vk0Id)TVr9YG61qie#lf|anUU^Q%0aBbMG;CsRj1qZ`U1=odL3f>uZE4V)FQE(`{ zOToLsUIp)tqtY>`zc( z!0$$Whxr}hcN4$w<9C$b&HQfR_a1)QN1^jQEUW}=nh2t5J~}D8*)ECLAHGkH+5Nl> zH~ABDog@ClY~Zjzp%QNNCuUDK_!DlD@AW4KQR zqQIZ_Gq3h1mZSHF5Okt&5Z)VzzE>g_9@`(@D>du93|jU}Pw)4nb>rpWF^z}45g#kk z8e=>>r3m3;3dy)GCWn*wOKFtktv4FuV+!S_CXe~Z`nE%AS&!RzkzuxHDI6R8)wbfA zhQm~vaz&aFTVhmY!yg&5&|KPtdETbG{p0lOqKben}WtkwWBvH zVPMx^h5iG6LwlbZ(XvnGVdXe?Xg)!x7Pvd(gI*`{z}kpsHu=5@w29O$xmjnnJa!ze z@Fr(jcOYl)zR=hDCKu}HPT~0nMl;9r(Y365gc(~fxb`v0bbU+%rPtR6oPOYI42%$x zhy4QsAi!R9H%ZG*;azLnn2K=iSH^ZRW9eO#@sT>#$ByEYJKE0F(g!|QRQ^l!M*B&u zSFxAYyOw(A{iAiPC_FGifgzJ)(&}C8rM#<#&{2xINP2 zi1v8O+~ee*aqYFD0EiZ-<(9NjfP>Ar3gWJT86x;2d}qN55nK?8SU0q4Lu1^w5@r92 z?-kd2S2};?Ni;e11yk@%Z~cJOLja8RM-_ZmwXT8`Al_eZgtR{nRR z@A&{S%yHNU4H^gYu#p&a?2Zib9_Zt9<-lO2j9&H$Wr6i|21l82BF<_Zhivoi zaI-o9H0HGS%+p4DkcwJR4MxA8gM2y6tIi2QSrxFF88#ADiqDNXT?wIM=4!zDRPRVI zzn&){de}~AleoUl<{AQQY1`i;>LepPf_$|1e&e-Oi3qkN>!5P2&?gzepQAkl%v>xy z69JN_S+S!HV440~+#uE$r!>-va1=69G2us4r*2ZWa)!ZbiEeUxIF)l)atRcw9^=Ei z?PzYryz~4>@XTw}iCu^>UEaoZ5-}#XDR=zE7*lLw&sYp7K7t*(IhOU!R5C;?gQHpR zx{gn)>#?`&QvmIL@YVYD(3qr2CpoZStV*a(@~+uQ&Ufxfo#e15gsbX?YWVIk>WgFZ zkx4&-L@_`CNZy{)7Rw*?*njQ8PbxT?ecppJ9;{35k^0jy{Fxa3Yzz_f_WmEl@Cz~g zhcU#zV())0hW{vrKOe&{#_$(n_=_?8rJSB^rz}*-U{pi36EQ%X5tzsT;t-zgm`Fu+Lh?{?EEs?4d&WE?s57>}>$&;g=Q#3ja4y(* zloQkv*(=pwvH5EY;a?MOCHyww65-zvE)%{&xQ+0qF==)X{tV$x!k;BXm~wbfQ;C)8 z9}q%6)fWi&68=NNeS|+p7zqCn;fV0(3CDzABzzm;FAyFe{6)gI6aEsROtl$)bId-_ zQ3c6|=zO)~VXnNxI}-*EF@-X@&B5WSb!xnLCko1PEv5{MLPxbjTTfT);JaQA|E@c6g?p z9_;d9w+DMX*y{n)D;YN4FcN&f$Abr033@yB;B6jY$|@0SRsmR2pu^LNzr>)~;Ms#o>%*9iq*F#8HP0FgdBxIg;lWT;iYy!K$;q2BSK4~UPXFl-hMQ#98z&F;YWpphpr^B)6 z_;KQ%g>bF9Ij^sBb>KY$$lY^uNtGS8*WFl-je+N$p^R)(pyyM45L6o#-Cnn9e1 zf*e!uNYc+u+FYy-ppwBgci zMu!a`&HpT8np#i(%N_TP`G(I2AuF_`Cd}F$s~aTPIuKg+eW&UW_9#80^mJO~B?# z&?eZ-OTNo+Kl_H^K3{BxZ+5~=L4HY|)bA?Be?8BOGl?#0nkYklGH`r63pv*S>iRT& z%TIS5a*>4|axSvS?QVE4>ub=Fa&Uk-(G<2Lk}eeN_|!&AJsQ2pN0uACFztd~@D@Wa znb!C-gTm-!aOLhCh~)op|F1W!zi$j|J|oip!nmW^7dMs{qQ$R-T-|~C@e^B(=DoJ= zv_V0MKXlwupW1vSQoB6qNJ*cx^;eI0veo-iEEp0Gw?Ju$CtJuqhYyn)f7Pu`OaqoXx`^<-lQ z{=A_SV*H=P5WQhW#;?Zk z*K)u3bDPvRCkD6K)f%YFZL8Un`Pi(>ZDz)h<}tm(qd??5l_*h$i!2=#N7;hBA$+D5 z&SMiyToK#sW}ZPHd{(ZAF673uD|0()X(d9J)r4*S#urR1!lgb&(N-D<@iq~7Pl3}E zTV_#^vo*n)cwU_f9CX^Z|cn`*F$v z#<&3)F7qU6iW`vYB&vxUkd*}LsK87i#~77Nt~QHE)Hc#I?@p-4I!Y%HtrD3+!urtW z>61&(ECn#QOg&m6mI4%8YlFxtuz9+T79emjQk~n3r^eAo%R_l?dP;fJiy;OSN`EP) zY2&L~KEwLZq_uO%;f!Wq6Hp}qskWke$!%$}t8L6NNlgLj-GTc-V;Tlje3~5Sw5IMh zyyBJC>r#^Ef%2?aY>ibLb<2LuHFE1&YanM+%IAbq|TCW+0_*>05`P(tB;6yNY;4w{6wVRuQ=8wJx%6?VbMF%49&-pQbQF$x2eufe2R;;K{a5rVeEF4lKP9j!qmY4%iwz6A)0PeQVUB$=bOU&p+@If5Y-{-O*US1sj!URZ20M}k=dOL09m&Gu zpf@gl>XM4$QqHkv^4Uf%P*S!nAWODUGxViV zj!LsPP9$3sg(orI{hB&F35eK46$!?UY+piDoYgG^7rYWSvZmLTL?z6Mr;?~-cKY!A zS#AKnph~n$4@l-};`JmdncQmXNmMe?od(GTDp^-0m%NgR9`z(DnJ6VsqLPXFv`W@> z7qNB6$7iBT>7ftNM1^`1l`Pkq&~c*fh=P(HF68mJ;Mn6Ue=${e$~yyZ zxL-ghqIcceIACEQ=A5|y>n?!I$^ERX<;I*`mlvOEj9n5@IlDK7N2G_1$9d4KAaFlhjAXC~Xg?#)O>!FDO>be(REZchA5 z3fRyw{&*_&i3x5*ylXtWd)zg~U>Z%2xHQTnz0J{dkW)Hc&JPf=N(Fc+jmt!b>2`}Z z#GM!l7$kff`mS-Yd(20ob}<%QJ!NMe)GAlMqA%1clMHqBtP?DHw8plQ7=Sm!e@VbO zOH#=u{MY)<@Ly6QH8nw@e|z|kYY!tnU!VUH(%uaJ;ZaQECQ_FOf!5=7_Kb3q|E|E8 z@!zG)#9osCl(c~WlmrWIB7jdoQ>h1&(cUn~sJB;T!7ITs8E9ZN*zke@RomxKn1OU9 zJK{~0#-i^YY^uge7)2*sV3e6Ak8+ekJSsyRZh>DBJ9_3|csbz~UB45R=tML`wo$gI zP-{tHTn74dQIFp7n8>3RWoNC|&W&tZOrttcWXaZX-l7T)E2Uf-dr4`KTq`mJc6x2P z%|g)z28}!9SMYdEc4%b>#vRrErPofgO#g&>; zcP_ai>(uItGk@_tGl*u+sK{(TuMIqI_4s}=b++CKMe9;zsZ$ez-Cz}{3m}s_dt*&o zYDKp7N{ksJopr5^*FFJPDT&UO6C$-FIy=$N69SNQPUD`g3zRaO9%Zy1fK9BFiE*-t zO>)WT!2oNF!McIf7y%`q*{;CEwd>J*((j}tFpLJMxj zVx@Qvf6t4m+p=pVo9>&Ap27HLodx22u^8>7C0b>-rasd|P4NHl{T@=ajB2FtP@%3ebD^G!YoLS;iC35I>5VEr7R8%T29%PsqT5ErdPBvMvQFZuctUgHhG~e` z-4JF%Wiz^XHdq5S3*oT`gT^I|G>Ky^*Zb~UHZ1L+&x$ml`od?-;CnVK?EvTGB8B1n zQHF2YsZlS%CJ=q!+9TZ7SBsZSSNzqctj#8qc(BJj-`Q}y_TODoY&p}J9HHeqpZY=v3R3r>AQEgY807-j zL$!U{$9s%;-|9V?`uVcM*6M}Un(Jrof}T8HU>O?aneTnmh-Q6gE1t6%T}KSQQfvzQ?4nydRSJu?mX5T9=keSp7T!ER$PD@ zE_0{#YWAlsb`uc(fv*49Dl93pF1G%+EXVm7C{K35Zq?aVR%?jLvOlA;b%FD;gTpDR z>-^#rPoh4SE>rW>y2FEaFA|19bQ%A{%erM-uZ>N5sS*Laj#$IFE1j`35BD-(Y`< zrk+<*$_4Crt5aQuY-H}U)-{mJaIq07zAi#9w!pnSO>8_*ji9ts-?w1xJgZbA7_X=| zX{Wm21IJhQVvV>bn>7l77ql)^kBy;~p)(THB7@HSCb-Sv4_Ve2u#Qj%PT#FsU#Fj; zopKAI7j(>rm(YD_RYG^n6Pf!$)yx*5>UKR_l+J*8Y%M~TC`@JZHmB=VDj4B&Wzm$U96Grcz=RS`ydPPqg@FY?Q|ixsJl@x!zix{oTiZIzQ}HtzW{$ z`bBBD|ur*LB3hh;16q~#N3A6z> zSEaozQ++IcWnA52Rzmk^*5esKK$)EC#=StpQcX+xneu9Lsxa5Nw5_s<7}67o4>2vT zMt9k5M}13c&5yHU`d_bXPbGA6KzSVr7JahQ5^PY(VPP(__U>^jjWubldYBk@v!U?b zGdR^{qdJo|P|GIrD@iuS!*0jeD8H&dZE0}{1#e@h$L%~uDW>}ht`uTAD{i+zxd7{# zkZa1XcF@PiU5-km(KzOJEeh6Mejy#2{B@=LYNbky(Kg60#w@)~@~dC7t}**Y`8C(% z+=l$R)bk=ziwPjdnOW7dwfSC)`LWD*7Hdum3DP( zCcoHo6v5?tglV7>;Aj&kwX}T| zhDOmEOPj#XSp;MBQ6sn{-ndaRrLmJy(qw9hg|4x9gRgZp$(4Mqn;u@1uekys5w)2r zz|F)s4SW^(8qREz-IaXZO_glM*8q`TC%*25Dbcl&uV*JvP1z-pubB(i6-K_EudN0o zoinq9Y2@oQAo zpCx&zh(5=5m^H_WumPKhy`Ul}^k(<5^O8aGf{Qh-o=E`f=2(V3w9|+s{J$WoLd5*nIFZdF!5z`CBrr@&MY$be+_VF~StK2ud!V(bU?jmDssvM{ zq6pBmnfL;zqsO(0t49Yrbx}P+&LJ6_=BN*BXr(q%zZnLz57cj&1+{#`wne0vFtNEs zKKvmYZTemt6%^9(YZRvo3^vypw4*MU>GiQG{3|w$rM2SpQOiRu2uq2Wes&Tpo8W11 zFKSq1mZDEoomiR2cDySKYEsKUYA8trSPx(#ZS-EV=8Hn2KoYxB9Rh!NkwmgilMNrw~aK40RCFGC}|foz3?v!0K+7Ag{%ct~GT~3_BwYN=B zU2$rCsR7|Sc)B3+WdbdRWe0Dn(~{`%!j(P#Q3`M!r|>?!vd4D_*y{lPXm-0EuLpj8 zMa8-x32}_#H(2S#X+{PA#SJi7x~z{auFW3&sBq09SF;0m*f?8*xBHha)!_SXwogV0 zEyrxqg~KxSOA_G*T%?%NuZOBli9>z+tvn76ZGA1D4A8SaK&&7%TLa0Ob8TfoTsUS8 zFTGU?D4xF(#Rtj0$8faZ7M1` z*OrNWXrd9&q%d7er4$69N+BXr3NYDE!a$PO9`!@ex0jDamhe&rv##1oBW+*Ir2mEpQG`Ol38 zGx)^V*blkNpNIR;=FE0ipe+UIcBvqT_IoV@4!?jZq)|^1x)n^pncgN|BT1PG+D*xI;;)*Fm|M$0NqlDXb4 z5B-W8!r9s?r#Cwv-QlOVa`-W-{srE@=oG!i-3Z(tfy+SWfwf^VZsd}u4;gNrK5m0} z|F}0C={9EcM9*D(JY$NumtuOJePzr~J4=zl5ykQKv(K&nH_tu)%ZJoqme27tsEm0V z@LJ=UGfzWa-~^}4xL3W)Jq;*pofiU3_cUzs!aWVsFIXYRVW8f*r=gqb(-n@O(C%7h z%acq2wT~x1`u?r?sqE%kIOHCL89-^zzbnh9{}nUSajvxOG*h~`6F?;^6!Q1!a(_M{ zy;@*LRgA$b9}diPO<%?hydcYV9cnXb?KkS~*7h4P8Qq~XQU0LiO#V=zwr*j|aLkno znUKBJYPbkWD>R!`gJ*+14GIw}PH0A+PDxAK`qI^P z3VfM4Hp8efJ)9ARzscG#P`tM8Xof*WxXZ`QVwSTe7Gxg@;ww}(8n!}ZPjn%U5cA0R zWQ=HU&C9MQFr#(=vT6K2{!iWpJAeOMCW94*tkC~$h7$VocAgAWvdKLzag zR50fOJ3bX#@F4E^FP}}&bRS(Ou*LDR@q5f_RXHQ0`?Pe$# z0}kY93~cA8?X2A+m!mwOt+2-jBCLfyK7e~E9%NaFtQc7iBy-GgFFI1jhY! zad+4o2oCvs4Ka6b3)%y>L0O`-PyqL?P#_#dBwUyuYai_*$_{Jp@P^3aBOyJsSIVjM zDZJ{taMYd&7t*r93p7x|$E*@Q_>@)ZK1*Zik{9>1d)UPv9G>(N zlgOIZ6cBM9W$*^zFEw$ zYUw0l0P2zwq+D1VK^~%iaIVkc6p)8R++N)&BN_KkzrWbuka172Ot()mj^m?;v&)6T zo3n3OcsTp382{@Se%r#M+26$QmBNpZ?5i%b&_1Ma5O0NjtJ%xNc)tjIU-c4XK$^$& z>ax8GVV}}IZ7pk|$#bfbXE~43q9gmlJ{=bs@3O;?`?LX<-R$`t``EPnQuhJ0##I)FN|z!qTfNMPW6Yx-jj5(P?Rp0T!LPi| z^nJ88z%m3dp5Y&*X2?gY?W@2%YHeQy+RI*Z zv{RH)*;7!^bbWNk^TNH_25y65dD#iCQfEc5RD^1d`w#Z1hP<98?4t}7rhRWvUR;l- zoQ9dQ9VAo{Ay5+K`D(^g5_RAjOi8MP{KixetLoTYZzeMORUMtMGZnDIMbxpg-Zx-y zTxMT@(Y+k0RMHK*>k>+$l4iY1qLN0v0z}7#aH;OAE_!cv*1M=YiAtLFDi@VB>QyC| zsN|whsY$J&WCFXA3?*rImgl09M!l-!BHdX>A=IeIYYa@b$63d<;VTh5+kXxHoaAwO z)^t#4s1uMehI%D9>PwRs$FQK{JE{7O?GM5{*Y zG8+UQ$S$uC0}SJ9%e+7}CJzYtW?u_M22^3Ri#U=%0g!tPQF?x`k-G^0OR(0;8>sy`<+jNrrvC)2N z$mYA5W^~;i){*p#lL87vNM}RI0R@NicX;et4-P6gn!VG5>nr>Gq>YWVl6q~rtyoF& zUSgoB+PK}uRhmZL_}&Bsg;8ntjZ;3}(wpT9q9LEI-@@a}pn7Sg;u8j(FyqVib6sYZ z!&~)@m-cM;Er9+4H|5f-eG2kB2YO30tv8L%XTK{jm74SJ3w*@Sxcv@w_V{+PRScWoNFhZm<8V;s#R3z0xym8EHp8B>c>}%5MW?XpQ!Z5^yVb0BX;2#@gRc~) zD~U>Cy>$|m#QrErm9Vqc4FK6wUhe$09J_{kKTU&4L5}56AAZy<2wvSMGsHYf5WSoy zHigh6ffY$JOlh1Md>y4>9iNSFX_!VmqihF&Z-C{NUp?mlQg#EX;|XS-WC1?!C1btT zM!qI@O?nh9Y3}1osl5ZgTdUQR3<0J_$r&1Y;7O9A!n3uyQB_FFYZis{o zX{EP`kasyPCH#pS#BZq%kPA1|gzN;BrPqm|G)+wq3VBqbX=E7k8d;-Y=kBQGZ~Lp8-^&^B(tc;WP*}RDA_R7 zN%UXhHs(^dBpXb!O$3AGrZ9^xNd^k{Ed8e_1trZaV{`|w^C!JchukLOyw(+sDpd!- zUTSy)8ZDS+HSsd3HY(6YwW=d(k*o%mgRKz~mLL;M$|)`KEEfZ@r(z4dI?hg3EB9l2 zENTMR!xhlu8lGJ+E%c5?zmv5yyIsib1}<-pc0-#frha>{Rm|-tGhz?xR>aqy()U>A}5xYF@(^A)Sz!vt{qWnHxc<_8t_-2Lb^Z3icXkKW+Dq>Yd z-`K{#HxW}v<%x8P93Y(Hgor?Be>QRcu?!>5Q(j`w>p8#e@QY_5JOj0$U5_7if{CFN2b5-(;GOZp%qn~*9g;y*zfWz^*Ks9Aopi7$%mu@Ex2hAEv+ z6Uu?KueyL|ux(Pw1yY~0r3<gzkS z5@_AImM4w;K5cA_Pw(U@dHoCZ@A{aKA;`azos-?+E8A0DWB}QTqn#M6pb4D^oRi+6 z?IZGT87CcdPI{+v()Hq`JtN#oaoy|+yx{67DXny9$UesNG20_iw;h+bk(HYek1d)| zfgzT??~bgUj>if62$zv>B6+YPA!K5Geg|>Kbi7Fz%_+Ju0c5DDU@pNIJB=`VaaYx0 z0}p+GNEmbLOAg9p`N8rK3Y^0;1H)pBkr5xMQi{K|H~5gW0V$jQm=FhU| z!nXCi6tiw&NJyUJF{$M-BuSmsOJ4V2XQqRo0wK=HM9H7YUika&a5DqI=q` zVppbpD=+fKm1&3U_^s-uQ$qzeXG z9B}u95ueKD>RT2^bb|YElZp<9c^O@78r) z9N{t5#rAHZmN!-e9?CGQ&((krea`|?O83)Q6azheq|2f-5idcsyMTg~fhq$q=DPH! zU4Np>6re$^I_*=D=3Vh5>g9M=G@?C;y7jehx4>s*YX@Ci=pCktZtZ&ZB%3=V7X|vP zS@MMU+`39pb|j~_-g`}_Qd7`jdZ|X&nX(956ys!kdIQnfyf8ussZm4nlo+tbG!Q6Y zFp;j2Z(b6W{P~s_M4aF}Lvp20))qGHhHa6z4rHQBINCtBh;aZwDH5U2bpJ$g%s1EB zE$o>HPDPoInN>D_*b*4gT;UGzElzo$QGh^*jT9%2!NDjA8qAdtMU*fx*h zwQ_kuAbDYd%L@rE_(tN$!x#Y2J9>dV`fhN#E zTfjiG!m2N1GSKZf&}|KLM@-q)K>HIeO$M6hfEOXYw1K9um1LmtXZt`?w{(UoM7qEF zKwEYl$!;hG*|Q98J1GUELb-eJm)8}$8hY?78#i$Y+SdpWpUY?%YEezS66auOJuH`C zaaI5A`WIz|F!P6Hv*cCrDDDV8JFp~WRY%85^4N0o_lM{Dq|TiV`6J_gwfJc0D{P-u zxD%HO&fc|8Jv!d{FsW3BMwJmLdE5ULR^F4oA&D>y*;n@4f!+?|a{S-Thup=kYZ7z7E^B zU`(L-8oY)fC54e@2#YUbWleStghNn-8zO))AQ>Abt)?34&XAgr7$s8zzmnFRC*hqKlCzC;8RzQ zqAG;`teV6UfST}io{9v;2*UEw1cxplzO-Nu7tRT|kgzzu}4^70<-Tn}! zYUy1utn`HiKO` zF_a2|4M5f?AgsgyXS+lKi4m`$F2b*gUu#rNBvhG6s0ImAsJWJVk)IGEnMOxnon-h7 zNv__gI}()bw{3ubSoekbu6yKckOpJ{8Q}#uc(3Xn5E8isC?R*C2}~l&a0&GWZXMX} z3g$tMn&-6euK}Dm{s73S^9Cw>aM4_awi12OrA7&0;=3c% zsOo911|`*CnDB!UoNdFWSJk9RnruXC#2k9L93>%Svv|*mkjo)@zX&tk^eBRBoIAY; z8DNtg-SbsPC(ghk_~tmnbxZj^mzR{ZQ4US*Zp0Knw;wkrj#SdP9d-2}lQORW2sWP5 z@G~%*=!ONv(+m9TyoE1zkQrfk)+*B$jv@Mr^>tWSAxY>W`ZO1a0N^ zK>u;o>1GIvP|c96g*I8lBm_y$O+BD4AU9|<`u}(jLd*R ziUkbpV!5b@Tb*H5y8NN*YQqAs&X#sdzz|$LwLD4JW^Agi&B#<;drK_nxMKG83 zG=&F~0{NDc>pE#`c5{6l@l7Vf zo52%eSxM!kwH0~fs6_~a1>ikmd<{lniDGsw_j+!J^yhgmZASK^)WN7|KD2A_nwjEb0j$9Q#`;2R;7D z+?tew)KstiO63?9Wmb-EP9^2QZFF!;D93k-aw<+yPUWfOl6;^X%*Z#FQRw6u9eGcX z_v2<~<_?Tk2B;(Qs}78B$n_iqbZP-WB0opZRCW=M`EYUd1%8@d)?x#t9cVD%rR<}8 z!0X|C155;SLX=@pI*VywvKKs@Kw&NVv@-6-uI2#p3%?u~ra+XTte3ldb@Gup%LQRC zk)AAm58VYmn{*FgURN3jSLMPCsU#TWTMgI3ma33+;ef>;Lzt>Yt8=}4JyptTkzyew zs$ps|pV+9S&W$n_^2=}?SPC=;K?r)lehab-utwV1PRs_mLMPjBhS0lptP*BtjX9!`Ln9))WK(`cqf8D3Dj1EQy0)M>Dm zHy{8dayY#6Mk3)foRf--6zDia% zbPiEIj;}uHfX_w{?lekBbUFheAfrZfKqFd;UnfM`6v9(oL?gLom=_WaZWQ`u7?0Y2 zz#M45FI6qF#Fe26iAGEqjL`aPoD=ApIDwEUN>NH`NKMUfFdQXc0i6KK5jF>CXdECf zfw2HLP?04OTnTWw5g@*EkUYyR@dz1lG-M~#1#sj*O?_(!mQI*JBJ@twH3zUli`ut3 zjdw{ztZA)Ad%Vu5ojEW&FV{zGd?8~Dv+)do=HIP=D z7>i+A^C}D)C~K_Q;;r%ck>CLarq)p&Y=&|$X@dESE#7JmJk?6U2WH5}M}9afSs@Q* z>bwT++lJ&L$Af?yriCnok6QTr0JM%pFMyHXbUOj(J8AM$D?dHj4lSss$EbmNdT%??%^UDjqk-Obp`G#v z-T=30rLY`7O9CRSP_NQjVGFWy+V&GB==b$lSQ2+ZxxCf8?R;O)qwRPiX5l3c^>r6| zy+t4IsvXW!|H}UuPubh`YeA4$Vx_0%@BOEjS?{15OS+7?M$U zMR5pOAH@RhuKY7L5;$$WN}SngDxd*hKJf#e3}~R&uk9$rn@04)kp-)`&_C5p;BgdN zDQBUn2;Ngtpr`o}&4=M4V2vD-XB>+M`si|&8vHFW&?iZm27gF@7Z3jGjCX^%swtxk z8KP5*kQ0C1;7?EW)Q}Ds9uruK@_?CrlQWfrN=nNiq-l_-kxBdHgjtee8sO zr8MM&=~n4E7IIEbpKU#h;Zk0Z+r(;m#+mc)@~+a=?e~+QR}-i^Wob-&Xvp z@O#~6vAA%wB%`ciFg2DMOcxHw*?mfG_egd>O@Ohgk@T+A$VhguBbVC0W1lkEp37UX zb>))n4_R4Y4B!aIEPjN;0~|pdE!b}F)Y=jSv)0q#dJDHL;C=$?vz|=&f^|tsCT*vI zcErYxS)+bCC>hA9D>5g|Nx_i6(dZInC zp3a`Gp6;HWo_J59r?;ms9*xK1o$;=Ccf2Pak0;{2@xDYf5leI?x)R-qo-gs}Kx3{;i4=(a#~H8@(5e}#`M^?SN-PlT7wh^!L29?a&Hj@_e$j?wH8SM{98+6G|( z%8u`3)S-l%3hH zYHx49#*&<|!xZf>Q6QEb7KkU_Kx4lMtVfbeDJu-|Q}+w2a_`N=VA$!_kLhiP{exY|=_((4WlzKRqeb?(5oo z9k~R9#PC&cEXmKDC6=B7OW*^dJtVQf6i&%5=5SnW7k?wMNED@{mJK+r#BmHq+-@o2 z2;NPMza+7z|KBlA!XZ7$_|c!)UX1JH=dO})UND3+=`J}yzK}BmgKybRm!`-0hOxFdHH96xxuMg?N%Ja9Oj`ihRyRVmTFv87-UVA zv1&bJk$eYs@~f!ETovf>V?vm(LwyL66^C zS>`XtT1J(XRW84^)*i40g*s=0wF%?MHv4MZ8rE)&3NfM6_K0=b_NeVK@h8$BZ2xQj zqxhw8!i9+JV>7lVZa8rJoqrd-{ED4Fxc!dF`i6fiE5G2v_Kx*eU$f(9|9ovq*&6Fk^sikvaQ-!i?n2em&;9(B*N?yP;YSwHTgGeq*KXW2 zaQ?MJ%Av#eKk(Y|H$-nm>&Ai0aee3EN74M{*FO00qXm?192ioH6Nmo(`4?V%`<;bP zZ@T&Wx88ooy;DaXo__T4=U#a6f@Zr*am_N%YG z@q0ge`K`C#U-Mt+dCe4^4S+(edC=E?%QzBy&ciJn@&9W<%#1b zHgDN}l~XGBwRC*)+e|jGZv9ysCl7yl;*ve%$6lLz^WA^>k1tQa_A1#cc-dh`_}~ZP z!E>aL-Ci;Ac-dO}a8IMZ_<<0VtYTPji`}AAusR)1AKO}9>AY03iS=%mAPG(Z!z95Y z+6CsYmett%g$k#`?vpNa+MG4st>W3j8o?@7ILbZ!V#5lr<3f2y984%aj;f~Qh2k2aAe|wU3uh!G zX_e#PiHd;KQLzRer8Jip?+_2(6J#~FY#01N(O3M;-eF(sw3P*1#mC|WPw`iE9((bG zz4(lMx##{@-2dEGbLdVX;hMO*x_DG79$nufx*fgJCTw|CV2#3d@k&?mra-;h@7m-p z-sbqp5l^icdq|vkZ>7^?w-9?_NMJE&)cqF+1|0eXPviyZ2LrB5I?p4 z4-(#@pZ(D4X<2*b<}G(W_~73ELy-$Z;4#`z|=!OI`YW$6VE-5w7^r-(7%4; z#ScI7PrsaU2J6BrUdFB>%T}z6boKV1cm9Q2FS+zGvbUXs%I@L(4d4CVZATt^a%Og} zV?9D{E&JGZZTQda0`#GX){ge#!3H5#UN0_pHQL+k=ZIyiijO&#i_67`)Xl8L$%%x^ z@0N=9_6dWME9$p53n9C8L$7#&Jt7LCOL93k$StDB6&L#LbxzUa+&Ylx@^(2L6FZwG zCN_(WfDo)*_QTc2FzSZjAXE_PV$KEYnR{o3$(lDqiuwc(A-?eJFhO73`_ zfKW2A^AeAB!g8K;NkiX+bCbJ4ICmf+lu7P`58rg(?r~Op>9*$&b=>{t!E+z_hl732 zRibU@O7|vr#9npN*hbdjtJq*`yyriw4*u@P-ifA*C+@ga9JYG}m(%x`JBz<}=cP>T zrs8v#yDE!!O`I#-d{%kQ&0E`UdAs;d>jieVXgf4@hQlgeY7ceWCdyWeL!QgrUg2tS zU0;KDwdjInI*Rw*^fn`a1<$2z9uagqB2wdbJmNZ`zB&-Gme+nih$r`T3=ad%%(c=ueFo_VyzouVX$nWkl3R>ZtaOU(~VlC^w-$ng73ZZbEJ7 z_f>7Ml~#!P<~44fGP;uaP>Hylk{=%_@VvWN&usnZO%Bzwz$6G-1@L1y(pca}_yLXu zV>8rlKxsQJ^x8*pu9E+BJ(KbW^8Fbk|LB+MS$lG1L@uBc%%=uvNRXHFd$Z#sL-O9# zK85$h7)Ruk!2*(`%pe8@3-zofpTi(>JX1)IDjk4UP)0d{lMQUu>A>w$9~QZ z*u)~26tcM#Qil?P(Ntk@FJy*3ALFdS@sU(PA#Br45W14@2X+X3rilgS0GWo;3)-<2 z=Z*LwGizeOQ~?qlLmrfshtm5f{oHjx{xc<)g#b`(mi|~OmqOl(ER}2E4w*R#6EYZ# z4)u$XL70VhffUGs)%Tb*h0zbs@sf|@s)(x)C*WzBEhodJKbil(w1H!hXDr@4hWp%T zMe_svuH=Hu+(cn&EUj8?GYg%S8bVeyhSY8-RY;K`5LZLQAOdMKb1auLsZki$bTe~; zrT)R}I0V(qs=2~ako1mRc0}1RmP*s4#Y@f1w-fm&WrBS$>}5n}@-0(ozft;O^Qq!q zf#%Kpo-a@<15zKZbYMc!KCw$jwiZa}TH`kH!-#r?RR8`oMZKpZOyE)JXav-v7!#48OS{OA!TFDA7Z3qdrZ-d2>|O05 zlSi|8?P6aFH6KTq9noTlI;IHB2)vO2&*4aewrTv-AUE0iC%N)mD@J$bUaycE#@L&i z&&RFIiLQ{sJE&+?V}0g^0=WLXwM3H-LMNJrOEj%I38<3KLjxS>^eWX)Q)3ve&#Y2K ziTPUqJ-P~>2T0_#vl>tZ=c+R2P&<#(xT$upQTs7!i>Qs6YSTt-v5mz}HH1QT2N09D z$ZhJ>pnN8*TQ7tb+fL%cB%Jv+7C#l_t}G^5_9&5(*R|60hF&}bi))3St!6E!-n%=O z9o2EmXRgyHE03+loHV4;Wa6w~a5leMlOWG~7FM&Svr`$G_JJu5BUMV3IAH=yD9H-Y{q64*yyP(-M-z?%UtYIrO0>(22349t#^Ie0Cd)t|>SgZDN zj{rUOPUt92r9VYMl$Rbw=>pm=ChC}}wA3%Y+s*4RfmS&Pfb;4I#~Uwnj1|Ik(PNFnCm#*M9o6SH<9800VeeZSO5S3 literal 80296 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 PT!CT0Ou70KmrMTx)ZdN4 diff --git a/substrate/client/Cargo.toml b/substrate/client/Cargo.toml index b9e0135b9e97a..ad9fa2d2ad12e 100644 --- a/substrate/client/Cargo.toml +++ b/substrate/client/Cargo.toml @@ -13,8 +13,10 @@ ed25519 = { path = "../ed25519" } substrate-codec = { path = "../codec" } substrate-executor = { path = "../executor" } substrate-primitives = { path = "../primitives" } +substrate-runtime-io = { path = "../runtime-io" } substrate-runtime-support = { path = "../runtime-support" } -substrate-serializer = { path = "../serializer" } substrate-state-machine = { path = "../state-machine" } -substrate-test-runtime = { path = "../test-runtime" } substrate-keyring = { path = "../../substrate/keyring" } + +[dev-dependencies] +substrate-test-runtime = { path = "../test-runtime" } diff --git a/substrate/client/src/backend.rs b/substrate/client/src/backend.rs index fad0f203e8c64..4421c82b3742f 100644 --- a/substrate/client/src/backend.rs +++ b/substrate/client/src/backend.rs @@ -21,22 +21,24 @@ use error; use primitives::block; use blockchain::{self, BlockId}; -/// Block insertion transction. Keeps hold if the inserted block state and data. +/// Block insertion operation. Keeps hold if the inserted block state and data. pub trait BlockImportOperation { /// Associated state backend type. type State: state_machine::backend::Backend; /// Returns pending state. - fn state(&self) -> error::Result; + fn state(&self) -> error::Result<&Self::State>; /// Append block data to the transaction. - fn import_block(&mut self, header: block::Header, body: Option, is_new_best: bool) -> error::Result<()>; + fn set_block_data(&mut self, header: block::Header, body: Option, is_new_best: bool) -> error::Result<()>; + /// Inject storage data into the database. + fn set_storage, Vec)>>(&mut self, iter: I) -> error::Result<()>; /// Inject storage data into the database. fn reset_storage, Vec)>>(&mut self, iter: I) -> error::Result<()>; } /// Client backend. Manages the data layer. pub trait Backend { - /// Associated block insertion transaction type. + /// Associated block insertion operation type. type BlockImportOperation: BlockImportOperation; /// Associated blockchain backend type. type Blockchain: blockchain::Backend; @@ -44,9 +46,9 @@ pub trait Backend { type State: state_machine::backend::Backend; /// Begin a new block insertion transaction with given parent block id. - fn begin_transaction(&self, block: BlockId) -> error::Result; + fn begin_operation(&self, block: BlockId) -> error::Result; /// Commit block insertion. - fn commit_transaction(&self, transaction: Self::BlockImportOperation) -> error::Result<()>; + fn commit_operation(&self, transaction: Self::BlockImportOperation) -> error::Result<()>; /// Returns reference to blockchain backend. fn blockchain(&self) -> &Self::Blockchain; /// Returns state backend for specified block. diff --git a/substrate/client/src/block_builder.rs b/substrate/client/src/block_builder.rs new file mode 100644 index 0000000000000..323fb61c29fc1 --- /dev/null +++ b/substrate/client/src/block_builder.rs @@ -0,0 +1,90 @@ +// Copyright 2017 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 . + +//! Utility struct to build a block. + +use std::vec::Vec; +use codec::{Joiner, Slicable}; +use state_machine::{self, CodeExecutor}; +use primitives::{Header, Block}; +use primitives::block::Transaction; +use {backend, error, BlockId, Client}; +use triehash::ordered_trie_root; + +/// Utility for building new (valid) blocks from a stream of transactions. +pub struct BlockBuilder where + B: backend::Backend, + E: CodeExecutor + Clone, + error::Error: From<<::State as state_machine::backend::Backend>::Error>, +{ + header: Header, + transactions: Vec, + executor: E, + state: B::State, + changes: state_machine::OverlayedChanges, +} + +impl BlockBuilder where + B: backend::Backend, + E: CodeExecutor + Clone, + error::Error: From<<::State as state_machine::backend::Backend>::Error>, +{ + /// Create a new instance of builder from the given client, building on the latest block. + pub fn new(client: &Client) -> error::Result { + client.info().and_then(|i| Self::at_block(&BlockId::Hash(i.chain.best_hash), client)) + } + + /// Create a new instance of builder from the given client using a particular block's ID to + /// build upon. + pub fn at_block(block_id: &BlockId, client: &Client) -> error::Result { + Ok(BlockBuilder { + header: Header { + number: client.block_number_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(*block_id))? + 1, + parent_hash: client.block_hash_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(*block_id))?, + state_root: Default::default(), + transaction_root: Default::default(), + digest: Default::default(), + }, + transactions: Default::default(), + executor: client.clone_executor(), + state: client.state_at(block_id)?, + changes: Default::default(), + }) + } + + /// Push a transaction onto the block's list of transactions. This will ensure the transaction + /// can be validly executed (by executing it); if it is invalid, it'll be returned along with + /// the error. Otherwise, it will return a mutable reference to self (in order to chain). + pub fn push(&mut self, tx: Transaction) -> error::Result<()> { + let output = state_machine::execute(&self.state, &mut self.changes, &self.executor, "execute_transaction", + &vec![].and(&self.header).and(&tx))?; + self.header = Header::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); + self.transactions.push(tx); + Ok(()) + } + + /// Consume the builder to return a valid `Block` containing all pushed transactions. + pub fn bake(mut self) -> error::Result { + self.header.transaction_root = ordered_trie_root(self.transactions.iter().map(Slicable::encode)).0.into(); + let output = state_machine::execute(&self.state, &mut self.changes, &self.executor, "finalise_block", + &self.header.encode())?; + self.header = Header::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); + Ok(Block { + header: self.header, + transactions: self.transactions, + }) + } +} diff --git a/substrate/client/src/in_mem.rs b/substrate/client/src/in_mem.rs index ce1aaf3db5d71..6097d12e51962 100644 --- a/substrate/client/src/in_mem.rs +++ b/substrate/client/src/in_mem.rs @@ -21,13 +21,13 @@ use parking_lot::RwLock; use state_machine; use error; use backend; -use primitives; -use ser; +use runtime_support::Hashable; use primitives::block::{self, HeaderHash}; use blockchain::{self, BlockId, BlockStatus}; +use state_machine::backend::Backend as StateBackend; fn header_hash(header: &block::Header) -> block::HeaderHash { - primitives::hashing::blake2_256(&ser::encode(header)).into() + header.blake2_256().into() } struct PendingBlock { @@ -41,7 +41,7 @@ struct Block { body: Option, } -/// In-memory transaction. +/// In-memory operation. pub struct BlockImportOperation { pending_block: Option, pending_state: state_machine::backend::InMemory, @@ -156,12 +156,12 @@ impl blockchain::Backend for Blockchain { impl backend::BlockImportOperation for BlockImportOperation { type State = state_machine::backend::InMemory; - fn state(&self) -> error::Result { - Ok(self.pending_state.clone()) + fn state(&self) -> error::Result<&Self::State> { + Ok(&self.pending_state) } - fn import_block(&mut self, header: block::Header, body: Option, is_new_best: bool) -> error::Result<()> { - assert!(self.pending_block.is_none(), "Only one block per transaction is allowed"); + fn set_block_data(&mut self, header: block::Header, body: Option, is_new_best: bool) -> error::Result<()> { + assert!(self.pending_block.is_none(), "Only one block per operation is allowed"); self.pending_block = Some(PendingBlock { block: Block { header: header, @@ -172,6 +172,11 @@ impl backend::BlockImportOperation for BlockImportOperation { Ok(()) } + fn set_storage, Vec)>>(&mut self, changes: I) -> error::Result<()> { + self.pending_state.commit(changes); + Ok(()) + } + fn reset_storage, Vec)>>(&mut self, iter: I) -> error::Result<()> { self.pending_state = state_machine::backend::InMemory::from(iter.collect()); Ok(()) @@ -192,39 +197,6 @@ impl Backend { blockchain: Blockchain::new(), } } - - /// Generate and import a sequence of blocks. A user supplied function is allowed to modify each block header. Useful for testing. - pub fn generate_blocks(&self, count: usize, edit_header: F) where F: Fn(&mut block::Header) { - use backend::{Backend, BlockImportOperation}; - let info = blockchain::Backend::info(&self.blockchain).expect("In-memory backend never fails"); - let mut best_num = info.best_number; - let mut best_hash = info.best_hash; - let state_root = blockchain::Backend::header(&self.blockchain, BlockId::Hash(best_hash)) - .expect("In-memory backend never fails") - .expect("Best header always exists in the blockchain") - .state_root; - for _ in 0 .. count { - best_num = best_num + 1; - let mut header = block::Header { - parent_hash: best_hash, - number: best_num, - state_root: state_root, - transaction_root: Default::default(), - digest: Default::default(), - }; - edit_header(&mut header); - - let mut tx = self.begin_transaction(BlockId::Hash(best_hash)).expect("In-memory backend does not fail"); - best_hash = header_hash(&header); - tx.import_block(header, None, true).expect("In-memory backend does not fail"); - self.commit_transaction(tx).expect("In-memory backend does not fail"); - } - } - - /// Generate and import a sequence of blocks. Useful for testing. - pub fn push_blocks(&self, count: usize) { - self.generate_blocks(count, |_| {}) - } } impl backend::Backend for Backend { @@ -232,7 +204,7 @@ impl backend::Backend for Backend { type Blockchain = Blockchain; type State = state_machine::backend::InMemory; - fn begin_transaction(&self, block: BlockId) -> error::Result { + fn begin_operation(&self, block: BlockId) -> error::Result { let state = match block { BlockId::Hash(h) if h.is_zero() => Self::State::default(), _ => self.state_at(block)?, @@ -244,10 +216,10 @@ impl backend::Backend for Backend { }) } - fn commit_transaction(&self, transaction: Self::BlockImportOperation) -> error::Result<()> { - if let Some(pending_block) = transaction.pending_block { + fn commit_operation(&self, operation: Self::BlockImportOperation) -> error::Result<()> { + if let Some(pending_block) = operation.pending_block { let hash = header_hash(&pending_block.block.header); - self.states.write().insert(hash, transaction.pending_state); + self.states.write().insert(hash, operation.pending_state); self.blockchain.insert(hash, pending_block.block.header, pending_block.block.body, pending_block.is_best); } Ok(()) diff --git a/substrate/client/src/lib.rs b/substrate/client/src/lib.rs index 530288ca29edb..54f93405e1b8f 100644 --- a/substrate/client/src/lib.rs +++ b/substrate/client/src/lib.rs @@ -18,13 +18,13 @@ #![warn(missing_docs)] +extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_io as runtime_io; extern crate substrate_primitives as primitives; extern crate substrate_state_machine as state_machine; -extern crate substrate_serializer as ser; extern crate substrate_codec as codec; #[cfg(test)] #[macro_use] extern crate substrate_executor as executor; extern crate ed25519; -#[cfg(test)] extern crate substrate_runtime_support as runtime_support; #[cfg(test)] extern crate substrate_test_runtime as test_runtime; #[cfg(test)] extern crate substrate_keyring as keyring; @@ -39,6 +39,7 @@ pub mod blockchain; pub mod backend; pub mod in_mem; pub mod genesis; +pub mod block_builder; pub use blockchain::Info as ChainInfo; pub use blockchain::BlockId; @@ -50,6 +51,8 @@ use codec::{KeyedVec, Slicable}; use blockchain::Backend as BlockchainBackend; use backend::BlockImportOperation; use state_machine::backend::Backend as StateBackend; +use state_machine::{Ext, OverlayedChanges}; +use runtime_support::Hashable; /// Polkadot Client #[derive(Debug)] @@ -59,6 +62,7 @@ pub struct Client where B: backend::Backend { } /// Client info +// TODO: split queue info from chain info and amalgamate into single struct. #[derive(Debug)] pub struct ClientInfo { /// Best block hash. @@ -134,10 +138,10 @@ impl Client where if backend.blockchain().header(BlockId::Number(0))?.is_none() { trace!("Empty database, writing genesis block"); let (genesis_header, genesis_store) = build_genesis(); - let mut tx = backend.begin_transaction(BlockId::Hash(block::HeaderHash::default()))?; - tx.reset_storage(genesis_store.into_iter())?; - tx.import_block(genesis_header, None, true)?; - backend.commit_transaction(tx)?; + let mut op = backend.begin_operation(BlockId::Hash(block::HeaderHash::default()))?; + op.reset_storage(genesis_store.into_iter())?; + op.set_block_data(genesis_header, Some(vec![]), true)?; + backend.commit_operation(op)?; } Ok(Client { backend, @@ -167,6 +171,11 @@ impl Client where self.storage(id, &StorageKey(b":code".to_vec())).map(|data| data.0) } + /// Clone a new instance of Executor. + pub fn clone_executor(&self) -> E where E: Clone { + self.executor.clone() + } + /// Get the current set of authorities from storage. pub fn authorities_at(&self, id: &BlockId) -> error::Result> { let state = self.state_at(id)?; @@ -183,10 +192,8 @@ impl Client where /// No changes are made. pub fn call(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result { let mut changes = state_machine::OverlayedChanges::default(); - let state = self.state_at(id)?; - let return_data = state_machine::execute( - &state, + &self.state_at(id)?, &mut changes, &self.executor, method, @@ -195,6 +202,33 @@ impl Client where Ok(CallResult { return_data, changes }) } + /// Set up the native execution environment to call into a native runtime code. + pub fn using_environment T, T>( + &self, f: F + ) -> error::Result { + self.using_environment_at(&BlockId::Number(self.info()?.chain.best_number), &mut Default::default(), f) + } + + /// Set up the native execution environment to call into a native runtime code. + pub fn using_environment_at T, T>( + &self, + id: &BlockId, + overlay: &mut OverlayedChanges, + f: F + ) -> error::Result { + Ok(runtime_io::with_externalities(&mut Ext { backend: &self.state_at(id)?, overlay }, f)) + } + + /// Create a new block, built on the head of the chain. + pub fn new_block(&self) -> error::Result> where E: Clone { + block_builder::BlockBuilder::new(self) + } + + /// Create a new block, built on top of `parent`. + pub fn new_block_at(&self, parent: &BlockId) -> error::Result> where E: Clone { + block_builder::BlockBuilder::at_block(parent, &self) + } + /// Queue a block for import. pub fn import_block(&self, header: block::Header, body: Option) -> error::Result { // TODO: import lock @@ -204,13 +238,22 @@ impl Client where blockchain::BlockStatus::Unknown => return Ok(ImportResult::UnknownParent), } - let mut transaction = self.backend.begin_transaction(BlockId::Hash(header.parent_hash))?; - let mut _state = transaction.state()?; - // TODO: execute block on _state + let mut transaction = self.backend.begin_operation(BlockId::Hash(header.parent_hash))?; + let mut overlay = OverlayedChanges::default(); + + state_machine::execute( + transaction.state()?, + &mut overlay, + &self.executor, + "execute_block", + &block::Block { header: header.clone(), transactions: body.clone().unwrap_or_default().clone() }.encode() + )?; let is_new_best = header.number == self.backend.blockchain().info()?.best_number + 1; - transaction.import_block(header, body, is_new_best)?; - self.backend.commit_transaction(transaction)?; + trace!("Imported {}, (#{}), best={}", block::HeaderHash::from(header.blake2_256()), header.number, is_new_best); + transaction.set_block_data(header, body, is_new_best)?; + transaction.set_storage(overlay.drain())?; + self.backend.commit_operation(transaction)?; Ok(ImportResult::Queued) } @@ -238,6 +281,22 @@ impl Client where self.backend.blockchain().hash(block_number) } + /// Convert an arbitrary block ID into a block hash. + pub fn block_hash_from_id(&self, id: &BlockId) -> error::Result> { + match *id { + BlockId::Hash(h) => Ok(Some(h)), + BlockId::Number(n) => self.block_hash(n), + } + } + + /// Convert an arbitrary block ID into a block hash. + pub fn block_number_from_id(&self, id: &BlockId) -> error::Result> { + match *id { + BlockId::Hash(_) => Ok(self.header(id)?.map(|h| h.number)), + BlockId::Number(n) => Ok(Some(n)), + } + } + /// Get block header by id. pub fn header(&self, id: &BlockId) -> error::Result> { self.backend.blockchain().header(*id) @@ -254,11 +313,38 @@ mod tests { use super::*; use codec::Slicable; use keyring::Keyring; + use primitives::block::Transaction as PrimitiveTransaction; use test_runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; + use test_runtime::{UncheckedTransaction, Transaction}; use test_runtime; native_executor_instance!(Executor, test_runtime::api::dispatch, include_bytes!("../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm")); + fn genesis_config() -> GenesisConfig { + GenesisConfig::new_simple(vec![ + Keyring::Alice.to_raw_public(), + Keyring::Bob.to_raw_public(), + Keyring::Charlie.to_raw_public() + ], 1000) + } + + fn prepare_genesis() -> (primitives::block::Header, Vec<(Vec, Vec)>) { + let mut storage = genesis_config().genesis_map(); + let block = genesis::construct_genesis_block(&storage); + storage.extend(additional_storage_with_genesis(&block)); + (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) + } + + #[test] + fn client_initialises_from_genesis_ok() { + let client = new_in_mem(Executor::new(), prepare_genesis).unwrap(); + let genesis_hash = client.block_hash(0).unwrap().unwrap(); + + assert_eq!(client.using_environment(|| test_runtime::system::latest_block_hash()).unwrap(), genesis_hash); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Alice.to_raw_public())).unwrap(), 1000); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Ferdie.to_raw_public())).unwrap(), 0); + } + #[test] fn authorities_call_works() { let genesis_config = GenesisConfig::new_simple(vec![ @@ -275,10 +361,79 @@ mod tests { }; let client = new_in_mem(Executor::new(), prepare_genesis).unwrap(); + assert_eq!(client.info().unwrap().chain.best_number, 0); assert_eq!(client.authorities_at(&BlockId::Number(0)).unwrap(), vec![ Keyring::Alice.to_raw_public(), Keyring::Bob.to_raw_public(), Keyring::Charlie.to_raw_public() ]); } + + #[test] + fn block_builder_works_with_no_transactions() { + let genesis_config = GenesisConfig::new_simple(vec![ + Keyring::Alice.to_raw_public(), + Keyring::Bob.to_raw_public(), + Keyring::Charlie.to_raw_public() + ], 1000); + + let prepare_genesis = || { + let mut storage = genesis_config.genesis_map(); + let block = genesis::construct_genesis_block(&storage); + storage.extend(additional_storage_with_genesis(&block)); + (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) + }; + let client = new_in_mem(Executor::new(), prepare_genesis).unwrap(); + + let builder = client.new_block().unwrap(); + let block = builder.bake().unwrap(); + + client.import_block(block.header, Some(block.transactions)).unwrap(); + + assert_eq!(client.info().unwrap().chain.best_number, 1); + assert_eq!(client.using_environment(|| test_runtime::system::latest_block_hash()).unwrap(), client.block_hash(1).unwrap().unwrap()); + } + + trait Signable { + fn signed(self) -> PrimitiveTransaction; + } + impl Signable for Transaction { + fn signed(self) -> PrimitiveTransaction { + let signature = Keyring::from_raw_public(self.from.clone()).unwrap().sign(&self.encode()); + PrimitiveTransaction::decode(&mut UncheckedTransaction { signature, tx: self }.encode().as_ref()).unwrap() + } + } + + #[test] + fn block_builder_works_with_transactions() { + let genesis_config = GenesisConfig::new_simple(vec![ + Keyring::Alice.to_raw_public(), + Keyring::Bob.to_raw_public(), + Keyring::Charlie.to_raw_public() + ], 1000); + + let prepare_genesis = || { + let mut storage = genesis_config.genesis_map(); + let block = genesis::construct_genesis_block(&storage); + storage.extend(additional_storage_with_genesis(&block)); + (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) + }; + let client = new_in_mem(Executor::new(), prepare_genesis).unwrap(); + + let mut builder = client.new_block().unwrap(); + + builder.push(Transaction { + from: Keyring::Alice.to_raw_public(), + to: Keyring::Ferdie.to_raw_public(), + amount: 42, + nonce: 0 + }.signed()).unwrap(); + let block = builder.bake().unwrap(); + client.import_block(block.header, Some(block.transactions)).unwrap(); + + assert_eq!(client.info().unwrap().chain.best_number, 1); + assert!(client.state_at(&BlockId::Number(1)).unwrap() != client.state_at(&BlockId::Number(0)).unwrap()); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Alice.to_raw_public())).unwrap(), 958); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Ferdie.to_raw_public())).unwrap(), 42); + } } diff --git a/substrate/executor/src/native_executor.rs b/substrate/executor/src/native_executor.rs index 99773b9f761ba..a759c046c662b 100644 --- a/substrate/executor/src/native_executor.rs +++ b/substrate/executor/src/native_executor.rs @@ -45,12 +45,18 @@ pub trait NativeExecutionDispatch { /// A generic `CodeExecutor` implementation that uses a delegate to determine wasm code equivalence /// and dispatch to native code when possible, falling back on `WasmExecutor` when not. -#[derive(Default)] +#[derive(Debug, Default)] pub struct NativeExecutor { /// Dummy field to avoid the compiler complaining about us not using `D`. pub _dummy: ::std::marker::PhantomData, } +impl Clone for NativeExecutor { + fn clone(&self) -> Self { + NativeExecutor { _dummy: Default::default() } + } +} + impl CodeExecutor for NativeExecutor { type Error = Error; diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index eef0df976d54e..00bdb55865644 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -276,7 +276,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, /// Wasm rust executor for contracts. /// /// Executes the provided code in a sandboxed wasm runtime. -#[derive(Debug, Default)] +#[derive(Debug, Default, Clone)] pub struct WasmExecutor; impl CodeExecutor for WasmExecutor { diff --git a/substrate/network/Cargo.toml b/substrate/network/Cargo.toml index 55edfb7d5487e..5e3314e7b7b3c 100644 --- a/substrate/network/Cargo.toml +++ b/substrate/network/Cargo.toml @@ -22,7 +22,11 @@ substrate-primitives = { path = "../../substrate/primitives" } substrate-client = { path = "../../substrate/client" } substrate-state-machine = { path = "../../substrate/state-machine" } substrate-serializer = { path = "../../substrate/serializer" } +substrate-runtime-support = { path = "../../substrate/runtime-support" } [dev-dependencies] +substrate-test-runtime = { path = "../test-runtime" } substrate-executor = { path = "../../substrate/executor" } +substrate-keyring = { path = "../../substrate/keyring" } +substrate-codec = { path = "../../substrate/codec" } env_logger = "0.4" diff --git a/substrate/network/src/lib.rs b/substrate/network/src/lib.rs index d7053272cebad..bc2ebe7196573 100644 --- a/substrate/network/src/lib.rs +++ b/substrate/network/src/lib.rs @@ -27,6 +27,7 @@ extern crate substrate_primitives as primitives; extern crate substrate_state_machine as state_machine; extern crate substrate_serializer as ser; extern crate substrate_client as client; +extern crate substrate_runtime_support as runtime_support; extern crate serde; extern crate serde_json; #[macro_use] extern crate serde_derive; @@ -34,6 +35,12 @@ extern crate serde_json; #[macro_use] extern crate bitflags; #[macro_use] extern crate error_chain; +#[cfg(test)] extern crate env_logger; +#[cfg(test)] extern crate substrate_test_runtime as test_runtime; +#[cfg(test)] extern crate substrate_keyring as keyring; +#[cfg(test)] #[macro_use] extern crate substrate_executor as executor; +#[cfg(test)] extern crate substrate_codec as codec; + mod service; mod sync; mod protocol; @@ -44,13 +51,7 @@ mod config; mod chain; mod blocks; -#[cfg(test)] -mod test; - -#[cfg(test)] -extern crate substrate_executor; -#[cfg(test)] -extern crate env_logger; +#[cfg(test)] mod test; pub use service::Service; pub use protocol::{ProtocolStatus}; @@ -59,5 +60,6 @@ pub use network::{NonReservedPeerMode, ConnectionFilter, ConnectionDirection, Ne // TODO: move it elsewhere fn header_hash(header: &primitives::Header) -> primitives::block::HeaderHash { - primitives::hashing::blake2_256(&ser::encode(header)).into() + use runtime_support::Hashable; + header.blake2_256().into() } diff --git a/substrate/network/src/test/mod.rs b/substrate/network/src/test/mod.rs index d5010ed2bf45a..86c8cd91bdf81 100644 --- a/substrate/network/src/test/mod.rs +++ b/substrate/network/src/test/mod.rs @@ -19,13 +19,21 @@ mod sync; use std::collections::{VecDeque, HashSet, HashMap}; use std::sync::Arc; use parking_lot::RwLock; -use client::{self, BlockId}; -use primitives::block; -use substrate_executor as executor; +use client::{self, BlockId, genesis}; +use client::block_builder::BlockBuilder; +use primitives; +use executor; use io::SyncIo; use protocol::Protocol; use config::ProtocolConfig; use network::{PeerId, SessionInfo, Error as NetworkError}; +use test_runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; +use runtime_support::Hashable; +use test_runtime; +use keyring::Keyring; +use codec::Slicable; + +native_executor_instance!(Executor, test_runtime::api::dispatch, include_bytes!("../../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm")); pub struct TestIo<'p> { pub queue: &'p RwLock>, @@ -92,7 +100,7 @@ pub struct TestPacket { } pub struct Peer { - pub chain: Arc>, + chain: Arc>>, pub sync: Protocol, pub queue: RwLock>, } @@ -149,6 +157,36 @@ impl Peer { fn flush(&self) { } + + fn generate_blocks(&self, count: usize, mut edit_block: F) where F: FnMut(&mut BlockBuilder>) { + for _ in 0 .. count { + let mut builder = self.chain.new_block().unwrap(); + edit_block(&mut builder); + let block = builder.bake().unwrap(); + trace!("Generating {}, (#{})", primitives::block::HeaderHash::from(block.header.blake2_256()), block.header.number); + self.chain.import_block(block.header, Some(block.transactions)).unwrap(); + } + } + + fn push_blocks(&self, count: usize, with_tx: bool) { + let mut nonce = 0; + if with_tx { + self.generate_blocks(count, |builder| { + let tx = test_runtime::Transaction { + from: Keyring::Alice.to_raw_public(), + to: Keyring::Alice.to_raw_public(), + amount: 1, + nonce: nonce, + }; + let signature = Keyring::from_raw_public(tx.from.clone()).unwrap().sign(&tx.encode()); + let tx = primitives::block::Transaction::decode(&mut test_runtime::UncheckedTransaction { signature, tx: tx }.encode().as_ref()).unwrap(); + builder.push(tx).unwrap(); + nonce = nonce + 1; + }); + } else { + self.generate_blocks(count, |_| ()); + } + } } pub struct TestNet { @@ -158,6 +196,19 @@ pub struct TestNet { } impl TestNet { + fn genesis_config() -> GenesisConfig { + GenesisConfig::new_simple(vec![ + Keyring::Alice.to_raw_public(), + ], 1000) + } + + fn prepare_genesis() -> (primitives::block::Header, Vec<(Vec, Vec)>) { + let mut storage = Self::genesis_config().genesis_map(); + let block = genesis::construct_genesis_block(&storage); + storage.extend(additional_storage_with_genesis(&block)); + (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) + } + pub fn new(n: usize) -> Self { Self::new_with_config(n, ProtocolConfig::default()) } @@ -168,17 +219,9 @@ impl TestNet { started: false, disconnect_events: Vec::new(), }; - let test_genesis_block = block::Header { - parent_hash: 0.into(), - number: 0, - state_root: 0.into(), - transaction_root: Default::default(), - digest: Default::default(), - }; for _ in 0..n { - let chain = Arc::new(client::new_in_mem(executor::WasmExecutor, - || (test_genesis_block.clone(), vec![])).unwrap()); + let chain = Arc::new(client::new_in_mem(Executor::new(), Self::prepare_genesis).unwrap()); let sync = Protocol::new(config.clone(), chain.clone()).unwrap(); net.peers.push(Arc::new(Peer { sync: sync, diff --git a/substrate/network/src/test/sync.rs b/substrate/network/src/test/sync.rs index 54167a2c5e394..3e77c01c75fc8 100644 --- a/substrate/network/src/test/sync.rs +++ b/substrate/network/src/test/sync.rs @@ -22,8 +22,8 @@ use super::*; fn sync_from_two_peers_works() { ::env_logger::init().ok(); let mut net = TestNet::new(3); - net.peer(1).chain.backend().push_blocks(100); - net.peer(2).chain.backend().push_blocks(100); + net.peer(1).push_blocks(100, false); + net.peer(2).push_blocks(100, false); net.sync(); assert!(net.peer(0).chain.backend().blockchain().equals_to(net.peer(1).chain.backend().blockchain())); let status = net.peer(0).sync.status(); @@ -34,9 +34,9 @@ fn sync_from_two_peers_works() { fn sync_from_two_peers_with_ancestry_search_works() { ::env_logger::init().ok(); let mut net = TestNet::new(3); - net.peer(0).chain.backend().generate_blocks(10, |header| header.state_root = 42.into()); - net.peer(1).chain.backend().push_blocks(100); - net.peer(2).chain.backend().push_blocks(100); + net.peer(0).push_blocks(10, true); + net.peer(1).push_blocks(100, false); + net.peer(2).push_blocks(100, false); net.restart_peer(0); net.sync(); assert!(net.peer(0).chain.backend().blockchain().canon_equals_to(net.peer(1).chain.backend().blockchain())); @@ -45,7 +45,7 @@ fn sync_from_two_peers_with_ancestry_search_works() { #[test] fn sync_long_chain_works() { let mut net = TestNet::new(2); - net.peer(1).chain.backend().push_blocks(5000); + net.peer(1).push_blocks(500, false); net.sync_steps(3); assert_eq!(net.peer(0).sync.status().sync.state, SyncState::Downloading); net.sync(); @@ -56,8 +56,8 @@ fn sync_long_chain_works() { fn sync_no_common_longer_chain_fails() { ::env_logger::init().ok(); let mut net = TestNet::new(3); - net.peer(0).chain.backend().generate_blocks(200, |header| header.state_root = 42.into()); - net.peer(1).chain.backend().push_blocks(200); + net.peer(0).push_blocks(20, true); + net.peer(1).push_blocks(20, false); net.sync(); assert!(!net.peer(0).chain.backend().blockchain().canon_equals_to(net.peer(1).chain.backend().blockchain())); } @@ -66,16 +66,16 @@ fn sync_no_common_longer_chain_fails() { fn sync_after_fork_works() { ::env_logger::init().ok(); let mut net = TestNet::new(3); - net.peer(0).chain.backend().push_blocks(30); - net.peer(1).chain.backend().push_blocks(30); - net.peer(2).chain.backend().push_blocks(30); + net.peer(0).push_blocks(30, false); + net.peer(1).push_blocks(30, false); + net.peer(2).push_blocks(30, false); - net.peer(0).chain.backend().generate_blocks(10, |header| header.state_root = 42.into()); // fork - net.peer(1).chain.backend().push_blocks(20); - net.peer(2).chain.backend().push_blocks(20); + net.peer(0).push_blocks(10, true); + net.peer(1).push_blocks(20, false); + net.peer(2).push_blocks(20, false); - net.peer(1).chain.backend().generate_blocks(10, |header| header.state_root = 42.into()); // second fork between 1 and 2 - net.peer(2).chain.backend().push_blocks(1); + net.peer(1).push_blocks(10, true); + net.peer(2).push_blocks(1, false); // peer 1 has the best chain let peer1_chain = net.peer(1).chain.backend().blockchain().clone(); diff --git a/substrate/primitives/src/block.rs b/substrate/primitives/src/block.rs index 225b86def8894..c1799ef551955 100644 --- a/substrate/primitives/src/block.rs +++ b/substrate/primitives/src/block.rs @@ -16,20 +16,20 @@ //! Block and header type definitions. +use rstd::vec::Vec; #[cfg(feature = "std")] use bytes; -use rstd::vec::Vec; +use Hash; use codec::{Input, Slicable}; -use hash::H256; /// Used to refer to a block number. pub type Number = u64; /// Hash used to refer to a block hash. -pub type HeaderHash = H256; +pub type HeaderHash = Hash; /// Hash used to refer to a transaction hash. -pub type TransactionHash = H256; +pub type TransactionHash = Hash; /// Simple generic transaction type. #[derive(PartialEq, Eq, Clone)] @@ -127,9 +127,9 @@ pub struct Header { /// Block number. pub number: Number, /// State root after this transition. - pub state_root: H256, + pub state_root: Hash, /// The root of the trie that represents this block's transactions, indexed by a 32-byte integer. - pub transaction_root: H256, + pub transaction_root: Hash, /// The digest of activity on the block. pub digest: Digest, } diff --git a/substrate/primitives/src/lib.rs b/substrate/primitives/src/lib.rs index 9563b4fad76b1..fe42a997ca385 100644 --- a/substrate/primitives/src/lib.rs +++ b/substrate/primitives/src/lib.rs @@ -91,8 +91,10 @@ mod tests; pub use self::hash::{H160, H256}; pub use self::uint::{U256, U512}; - pub use block::{Block, Header}; +/// General hash type. +pub type Hash = H256; + /// An identifier for an authority in the consensus algorithm. The same as ed25519::Public. pub type AuthorityId = [u8; 32]; diff --git a/substrate/rpc/Cargo.toml b/substrate/rpc/Cargo.toml index 149199546ef13..485e08708c79d 100644 --- a/substrate/rpc/Cargo.toml +++ b/substrate/rpc/Cargo.toml @@ -15,3 +15,4 @@ substrate-executor = { path = "../executor" } [dev-dependencies] assert_matches = "1.1" substrate-executor = { path = "../executor" } +substrate-runtime-support = { path = "../runtime-support" } diff --git a/substrate/rpc/src/chain/tests.rs b/substrate/rpc/src/chain/tests.rs index c62981094c160..f462d759ecdb4 100644 --- a/substrate/rpc/src/chain/tests.rs +++ b/substrate/rpc/src/chain/tests.rs @@ -16,6 +16,7 @@ use substrate_executor as executor; use client; +use runtime_support::Hashable; use super::*; #[test] @@ -31,7 +32,7 @@ fn should_return_header() { let client = client::new_in_mem(executor::WasmExecutor, || (test_genesis_block.clone(), vec![])).unwrap(); assert_matches!( - ChainApi::header(&client, "af65e54217fb213853703d57b80fc5b2bb834bf923046294d7a49bff62f0a8b2".into()), + ChainApi::header(&client, test_genesis_block.blake2_256().into()), Ok(Some(ref x)) if x == &block::Header { parent_hash: 0.into(), number: 0, diff --git a/substrate/rpc/src/lib.rs b/substrate/rpc/src/lib.rs index 05d3d94685100..513bc42d873f8 100644 --- a/substrate/rpc/src/lib.rs +++ b/substrate/rpc/src/lib.rs @@ -33,6 +33,8 @@ extern crate substrate_executor; #[cfg(test)] #[macro_use] extern crate assert_matches; +#[cfg(test)] +extern crate substrate_runtime_support as runtime_support; pub mod chain; pub mod state; diff --git a/substrate/rpc/src/state/tests.rs b/substrate/rpc/src/state/tests.rs index 687c851c5c029..469b794b05899 100644 --- a/substrate/rpc/src/state/tests.rs +++ b/substrate/rpc/src/state/tests.rs @@ -17,6 +17,7 @@ use super::*; use substrate_executor as executor; use self::error::{Error, ErrorKind}; +use runtime_support::Hashable; use client; #[test] @@ -30,7 +31,7 @@ fn should_return_storage() { }; let client = client::new_in_mem(executor::WasmExecutor, || (test_genesis_block.clone(), vec![])).unwrap(); - let genesis_hash = "af65e54217fb213853703d57b80fc5b2bb834bf923046294d7a49bff62f0a8b2".into(); + let genesis_hash = test_genesis_block.blake2_256().into(); assert_matches!( StateApi::storage(&client, StorageKey(vec![10]), genesis_hash), @@ -51,7 +52,7 @@ fn should_call_contract() { }; let client = client::new_in_mem(executor::WasmExecutor, || (test_genesis_block.clone(), vec![])).unwrap(); - let genesis_hash = "af65e54217fb213853703d57b80fc5b2bb834bf923046294d7a49bff62f0a8b2".into(); + let genesis_hash = test_genesis_block.blake2_256().into(); assert_matches!( StateApi::call(&client, "balanceOf".into(), vec![1,2,3], genesis_hash), diff --git a/substrate/state-machine/src/backend.rs b/substrate/state-machine/src/backend.rs index a1dec6dc3a575..f77e9a59d811d 100644 --- a/substrate/state-machine/src/backend.rs +++ b/substrate/state-machine/src/backend.rs @@ -57,7 +57,7 @@ impl error::Error for Void { /// In-memory backend. Fully recomputes tries on each commit but useful for /// tests. -#[derive(Default, Clone)] +#[derive(Debug, PartialEq, Default, Clone)] pub struct InMemory { inner: MemoryState, // keeps all the state in memory. } diff --git a/substrate/state-machine/src/lib.rs b/substrate/state-machine/src/lib.rs index 33dd346c1cd25..a3f2e3dc4b898 100644 --- a/substrate/state-machine/src/lib.rs +++ b/substrate/state-machine/src/lib.rs @@ -42,13 +42,10 @@ pub use testing::TestExternalities; pub use ext::Ext; /// Updates to be committed to the state. -pub enum Update { - /// Set storage of object at given key -- empty is deletion. - Storage(Vec, Vec), -} +pub type Update = (Vec, Vec); // in-memory section of the state. -#[derive(Default, Clone)] +#[derive(Debug, PartialEq, Default, Clone)] struct MemoryState { storage: HashMap, Vec>, } @@ -63,15 +60,11 @@ impl MemoryState { } fn update(&mut self, changes: I) where I: IntoIterator { - for update in changes { - match update { - Update::Storage(key, val) => { - if val.is_empty() { - self.storage.remove(&key); - } else { - self.storage.insert(key, val); - } - } + for (key, val) in changes { + if val.is_empty() { + self.storage.remove(&key); + } else { + self.storage.insert(key, val); } } } @@ -105,10 +98,12 @@ impl OverlayedChanges { /// Commit prospective changes to state. pub fn commit_prospective(&mut self) { - let storage_updates = self.prospective.storage.drain() - .map(|(key, value)| Update::Storage(key, value)); + self.committed.update(self.prospective.storage.drain()); + } - self.committed.update(storage_updates); + /// Drain prospective changes to an iterator. + pub fn drain(&mut self) -> ::std::collections::hash_map::Drain, std::vec::Vec> { + self.committed.storage.drain() } } diff --git a/substrate/test-runtime/src/genesismap.rs b/substrate/test-runtime/src/genesismap.rs index 0dc01c0abce03..1bc24d265763e 100644 --- a/substrate/test-runtime/src/genesismap.rs +++ b/substrate/test-runtime/src/genesismap.rs @@ -62,7 +62,10 @@ macro_rules! map { pub fn additional_storage_with_genesis(genesis_block: &Block) -> HashMap, Vec> { use codec::Slicable; + use primitives::hexdisplay::HexDisplay; + println!("genesis hash {}", HexDisplay::from(&genesis_block.header.blake2_256())); + println!("genesis {}", HexDisplay::from(&genesis_block.header.encode())); map![ - twox_128(&b"latest"[..]).encode() => genesis_block.header.blake2_256().encode() + twox_128(&b"latest"[..]).to_vec() => genesis_block.header.blake2_256().to_vec() ] } diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 2f9b66ebfe8a8f3fc3852e05336ce2aee7b90701..c8ac9359ef120148ebdf8776a28426eea8086d98 100644 GIT binary patch literal 31904 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 literal 32856 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 DiK}pl diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index 160eaf04215b29354fc6aaece97eeebb9b003093..3329885da9a60eb0dbabb75aadba95405ccefe2a 100644 GIT binary patch literal 31984 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 Rh2$Al?@wQ%S-xBGe*ps>^4kCa literal 32936 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