From ca4887584731714291df85b41adf400e9b067edd Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 25 Feb 2018 12:34:22 +0100 Subject: [PATCH 01/20] double-commit and prepare misbehavior --- substrate/bft/src/generic/accumulator.rs | 136 ++++++++++++++++++----- 1 file changed, 111 insertions(+), 25 deletions(-) diff --git a/substrate/bft/src/generic/accumulator.rs b/substrate/bft/src/generic/accumulator.rs index a7b2076bba5e6..93aa55c76b08d 100644 --- a/substrate/bft/src/generic/accumulator.rs +++ b/substrate/bft/src/generic/accumulator.rs @@ -122,6 +122,15 @@ struct VoteCounts { committed: usize, } +/// Misbehavior which can occur. +#[derive(Debug, Clone)] +pub enum Misbehavior { + /// Issued two conflicting prepare messages. + DoublePrepare((Digest, Signature), (Digest, Signature)), + /// Issued two conflicting commit messages. + DoubleCommit((Digest, Signature), (Digest, Signature)), +} + /// Accumulates messages for a given round of BFT consensus. /// /// This isn't tied to the "view" of a single authority. It @@ -132,7 +141,7 @@ pub struct Accumulator where Candidate: Eq + Clone, Digest: Hash + Eq + Clone, - AuthorityId: Hash + Eq, + AuthorityId: Hash + Eq + Clone, Signature: Eq + Clone, { round_number: usize, @@ -144,13 +153,14 @@ pub struct Accumulator vote_counts: HashMap, advance_round: HashSet, state: State, + misbehavior: HashMap>, } impl Accumulator where Candidate: Eq + Clone, Digest: Hash + Eq + Clone, - AuthorityId: Hash + Eq, + AuthorityId: Hash + Eq + Clone, Signature: Eq + Clone, { /// Create a new state accumulator. @@ -165,6 +175,7 @@ impl Accumulator Accumulator &HashMap> { + &self.misbehavior + } + /// Import a message. Importing duplicates is fine, but the signature /// and authorization should have already been checked. pub fn import_message( @@ -227,19 +243,29 @@ impl Accumulator= self.threshold { - Some(digest) - } else { + let threshold_prepared = match self.prepares.entry(sender.clone()) { + Entry::Vacant(vacant) => { + vacant.insert((digest.clone(), signature)); + let count = self.vote_counts.entry(digest.clone()).or_insert_with(Default::default); + count.prepared += 1; + + if count.prepared >= self.threshold { + Some(digest) + } else { + None + } + } + Entry::Occupied(occupied) => { + // if digest is different, that's misbehavior. + if occupied.get().0 != digest { + self.misbehavior.insert( + sender, + Misbehavior::DoublePrepare(occupied.get().clone(), (digest, signature)) + ); + } + None } - } else { - None }; // only allow transition to prepare from begin or proposed state. @@ -270,19 +296,29 @@ impl Accumulator= self.threshold { - Some(digest) - } else { + let threshold_committed = match self.commits.entry(sender.clone()) { + Entry::Vacant(vacant) => { + vacant.insert((digest.clone(), signature)); + let count = self.vote_counts.entry(digest.clone()).or_insert_with(Default::default); + count.committed += 1; + + if count.committed >= self.threshold { + Some(digest) + } else { + None + } + } + Entry::Occupied(occupied) => { + // if digest is different, that's misbehavior. + if occupied.get().0 != digest { + self.misbehavior.insert( + sender, + Misbehavior::DoubleCommit(occupied.get().clone(), (digest, signature)) + ); + } + None } - } else { - None }; // transition to concluded state always valid. @@ -333,7 +369,7 @@ mod tests { #[derive(Hash, PartialEq, Eq, Clone, Debug)] pub struct Digest(usize); - #[derive(Hash, PartialEq, Eq, Debug)] + #[derive(Hash, PartialEq, Eq, Debug, Clone)] pub struct AuthorityId(usize); #[derive(PartialEq, Eq, Clone, Debug)] @@ -606,4 +642,54 @@ mod tests { s => panic!("wrong state: {:?}", s), } } + + #[test] + fn double_prepare_is_misbehavior() { + let mut accumulator = Accumulator::::new(1, 7, AuthorityId(8)); + assert_eq!(accumulator.state(), &State::Begin); + + for i in 0..7 { + accumulator.import_message(LocalizedMessage { + sender: AuthorityId(i), + signature: Signature(999, i), + message: Message::Prepare(1, Digest(999)), + }); + + assert!(!accumulator.misbehavior.contains_key(&AuthorityId(i))); + + accumulator.import_message(LocalizedMessage { + sender: AuthorityId(i), + signature: Signature(123, i), + message: Message::Prepare(1, Digest(123)), + }); + + assert!(accumulator.misbehavior.contains_key(&AuthorityId(i))); + + } + } + + #[test] + fn double_commit_is_misbehavior() { + let mut accumulator = Accumulator::::new(1, 7, AuthorityId(8)); + assert_eq!(accumulator.state(), &State::Begin); + + for i in 0..7 { + accumulator.import_message(LocalizedMessage { + sender: AuthorityId(i), + signature: Signature(999, i), + message: Message::Commit(1, Digest(999)), + }); + + assert!(!accumulator.misbehavior.contains_key(&AuthorityId(i))); + + accumulator.import_message(LocalizedMessage { + sender: AuthorityId(i), + signature: Signature(123, i), + message: Message::Commit(1, Digest(123)), + }); + + assert!(accumulator.misbehavior.contains_key(&AuthorityId(i))); + + } + } } From 5332ae9ecc9fe20d9d008682714bb6e117fa338a Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 25 Feb 2018 12:59:57 +0100 Subject: [PATCH 02/20] get misbehavior on completion --- substrate/bft/src/generic/accumulator.rs | 108 +++++++++++------------ substrate/bft/src/generic/mod.rs | 25 +++++- substrate/bft/src/lib.rs | 6 ++ 3 files changed, 80 insertions(+), 59 deletions(-) diff --git a/substrate/bft/src/generic/accumulator.rs b/substrate/bft/src/generic/accumulator.rs index 93aa55c76b08d..52681f6b47013 100644 --- a/substrate/bft/src/generic/accumulator.rs +++ b/substrate/bft/src/generic/accumulator.rs @@ -126,9 +126,9 @@ struct VoteCounts { #[derive(Debug, Clone)] pub enum Misbehavior { /// Issued two conflicting prepare messages. - DoublePrepare((Digest, Signature), (Digest, Signature)), + DoublePrepare(usize, (Digest, Signature), (Digest, Signature)), /// Issued two conflicting commit messages. - DoubleCommit((Digest, Signature), (Digest, Signature)), + DoubleCommit(usize, (Digest, Signature), (Digest, Signature)), } /// Accumulates messages for a given round of BFT consensus. @@ -153,7 +153,6 @@ pub struct Accumulator vote_counts: HashMap, advance_round: HashSet, state: State, - misbehavior: HashMap>, } impl Accumulator @@ -175,7 +174,6 @@ impl Accumulator Accumulator &HashMap> { - &self.misbehavior - } - /// Import a message. Importing duplicates is fine, but the signature /// and authorization should have already been checked. pub fn import_message( &mut self, message: LocalizedMessage, - ) - { + ) -> Result<(), Misbehavior> { // message from different round. if message.message.round_number() != self.round_number { - return; + return Ok(()); } let (sender, signature) = (message.sender, message.signature); @@ -229,11 +221,13 @@ impl Accumulator Result<(), Misbehavior> { + // TODO: find a way to check for proposal misbehavior without opening up DoS vectors. + if sender != self.round_proposer || self.proposal.is_some() { return Ok(()) } self.proposal = Some(proposal.clone()); self.state = State::Proposed(proposal); + Ok(()) } fn import_prepare( @@ -241,7 +235,7 @@ impl Accumulator Result<(), Misbehavior> { // ignore any subsequent prepares by the same sender. let threshold_prepared = match self.prepares.entry(sender.clone()) { Entry::Vacant(vacant) => { @@ -258,10 +252,11 @@ impl Accumulator { // if digest is different, that's misbehavior. if occupied.get().0 != digest { - self.misbehavior.insert( - sender, - Misbehavior::DoublePrepare(occupied.get().clone(), (digest, signature)) - ); + return Err(Misbehavior::DoublePrepare( + self.round_number, + occupied.get().clone(), + (digest, signature) + )); } None @@ -287,6 +282,8 @@ impl Accumulator Accumulator Result<(), Misbehavior> { // ignore any subsequent commits by the same sender. let threshold_committed = match self.commits.entry(sender.clone()) { Entry::Vacant(vacant) => { @@ -311,10 +308,11 @@ impl Accumulator { // if digest is different, that's misbehavior. if occupied.get().0 != digest { - self.misbehavior.insert( - sender, - Misbehavior::DoubleCommit(occupied.get().clone(), (digest, signature)) - ); + return Err(Misbehavior::DoubleCommit( + self.round_number, + occupied.get().clone(), + (digest, signature) + )); } None @@ -338,15 +336,17 @@ impl Accumulator Result<(), Misbehavior> { self.advance_round.insert(sender); - if self.advance_round.len() < self.threshold { return } + if self.advance_round.len() < self.threshold { return Ok(()) } // allow transition to new round only if we haven't produced a justification // yet. @@ -355,7 +355,9 @@ impl Accumulator State::Advanced(Some(j)), State::Advanced(j) => State::Advanced(j), State::Begin | State::Proposed(_) => State::Advanced(None), - } + }; + + Ok(()) } } @@ -415,7 +417,7 @@ mod tests { sender: AuthorityId(5), signature: Signature(999, 5), message: Message::Propose(1, Candidate(999)), - }); + }).unwrap(); assert_eq!(accumulator.state(), &State::Begin); @@ -423,7 +425,7 @@ mod tests { sender: AuthorityId(8), signature: Signature(999, 8), message: Message::Propose(1, Candidate(999)), - }); + }).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); } @@ -437,7 +439,7 @@ mod tests { sender: AuthorityId(8), signature: Signature(999, 8), message: Message::Propose(1, Candidate(999)), - }); + }).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); @@ -446,7 +448,7 @@ mod tests { sender: AuthorityId(i), signature: Signature(999, i), message: Message::Prepare(1, Digest(999)), - }); + }).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); } @@ -455,7 +457,7 @@ mod tests { sender: AuthorityId(7), signature: Signature(999, 7), message: Message::Prepare(1, Digest(999)), - }); + }).unwrap(); match accumulator.state() { &State::Prepared(ref j) => assert_eq!(j.digest, Digest(999)), @@ -472,7 +474,7 @@ mod tests { sender: AuthorityId(8), signature: Signature(999, 8), message: Message::Propose(1, Candidate(999)), - }); + }).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); @@ -481,7 +483,7 @@ mod tests { sender: AuthorityId(i), signature: Signature(999, i), message: Message::Prepare(1, Digest(999)), - }); + }).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); } @@ -490,7 +492,7 @@ mod tests { sender: AuthorityId(7), signature: Signature(999, 7), message: Message::Prepare(1, Digest(999)), - }); + }).unwrap(); match accumulator.state() { &State::Prepared(ref j) => assert_eq!(j.digest, Digest(999)), @@ -502,7 +504,7 @@ mod tests { sender: AuthorityId(i), signature: Signature(999, i), message: Message::Commit(1, Digest(999)), - }); + }).unwrap(); match accumulator.state() { &State::Prepared(_) => {}, @@ -514,7 +516,7 @@ mod tests { sender: AuthorityId(7), signature: Signature(999, 7), message: Message::Commit(1, Digest(999)), - }); + }).unwrap(); match accumulator.state() { &State::Committed(ref j) => assert_eq!(j.digest, Digest(999)), @@ -531,7 +533,7 @@ mod tests { sender: AuthorityId(8), signature: Signature(999, 8), message: Message::Propose(1, Candidate(999)), - }); + }).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); @@ -540,7 +542,7 @@ mod tests { sender: AuthorityId(i), signature: Signature(999, i), message: Message::Prepare(1, Digest(999)), - }); + }).unwrap(); } match accumulator.state() { @@ -553,7 +555,7 @@ mod tests { sender: AuthorityId(i), signature: Signature(999, i), message: Message::AdvanceRound(1), - }); + }).unwrap(); match accumulator.state() { &State::Prepared(_) => {}, @@ -565,7 +567,7 @@ mod tests { sender: AuthorityId(7), signature: Signature(999, 7), message: Message::AdvanceRound(1), - }); + }).unwrap(); match accumulator.state() { &State::Advanced(Some(_)) => {}, @@ -583,7 +585,7 @@ mod tests { sender: AuthorityId(i), signature: Signature(999, i), message: Message::Prepare(1, Digest(999)), - }); + }).unwrap(); } match accumulator.state() { @@ -596,7 +598,7 @@ mod tests { sender: AuthorityId(i), signature: Signature(999, i), message: Message::Commit(1, Digest(999)), - }); + }).unwrap(); } match accumulator.state() { @@ -615,7 +617,7 @@ mod tests { sender: AuthorityId(i), signature: Signature(1, i), message: Message::AdvanceRound(1), - }); + }).unwrap(); } match accumulator.state() { @@ -634,7 +636,7 @@ mod tests { sender: AuthorityId(i), signature: Signature(999, i), message: Message::Commit(1, Digest(999)), - }); + }).unwrap(); } match accumulator.state() { @@ -653,17 +655,15 @@ mod tests { sender: AuthorityId(i), signature: Signature(999, i), message: Message::Prepare(1, Digest(999)), - }); + }).unwrap(); - assert!(!accumulator.misbehavior.contains_key(&AuthorityId(i))); - - accumulator.import_message(LocalizedMessage { + let res = accumulator.import_message(LocalizedMessage { sender: AuthorityId(i), signature: Signature(123, i), message: Message::Prepare(1, Digest(123)), }); - assert!(accumulator.misbehavior.contains_key(&AuthorityId(i))); + assert!(res.is_err()); } } @@ -678,17 +678,15 @@ mod tests { sender: AuthorityId(i), signature: Signature(999, i), message: Message::Commit(1, Digest(999)), - }); + }).unwrap(); - assert!(!accumulator.misbehavior.contains_key(&AuthorityId(i))); - - accumulator.import_message(LocalizedMessage { + let res = accumulator.import_message(LocalizedMessage { sender: AuthorityId(i), signature: Signature(123, i), message: Message::Commit(1, Digest(123)), }); - assert!(accumulator.misbehavior.contains_key(&AuthorityId(i))); + assert!(res.is_err()); } } diff --git a/substrate/bft/src/generic/mod.rs b/substrate/bft/src/generic/mod.rs index 4ebe508e36b0b..f9129d5adf697 100644 --- a/substrate/bft/src/generic/mod.rs +++ b/substrate/bft/src/generic/mod.rs @@ -18,6 +18,7 @@ //! Very general implementation. use std::collections::{HashMap, VecDeque}; +use std::collections::hash_map; use std::fmt::Debug; use std::hash::Hash; @@ -25,7 +26,7 @@ use futures::{future, Future, Stream, Sink, Poll, Async, AsyncSink}; use self::accumulator::State; -pub use self::accumulator::{Accumulator, Justification, PrepareJustification, UncheckedJustification}; +pub use self::accumulator::{Accumulator, Justification, PrepareJustification, UncheckedJustification, Misbehavior}; mod accumulator; @@ -258,6 +259,7 @@ struct Strategy { current_accumulator: Accumulator, future_accumulator: Accumulator, local_id: C::AuthorityId, + misbehavior: HashMap>, } impl Strategy { @@ -289,6 +291,7 @@ impl Strategy { notable_candidates: HashMap::new(), round_timeout: timeout.fuse(), local_id: context.local_id(), + misbehavior: HashMap::new(), } } @@ -298,10 +301,17 @@ impl Strategy { ) { let round_number = msg.message.round_number(); - if round_number == self.current_accumulator.round_number() { - self.current_accumulator.import_message(msg); + let sender = msg.sender.clone(); + let misbehavior = if round_number == self.current_accumulator.round_number() { + self.current_accumulator.import_message(msg) } else if round_number == self.future_accumulator.round_number() { - self.future_accumulator.import_message(msg); + self.future_accumulator.import_message(msg) + } else { + Ok(()) + }; + + if let Err(misbehavior) = misbehavior { + self.misbehavior.insert(sender, misbehavior); } } @@ -715,6 +725,13 @@ impl Future for Agreement } } +impl Agreement { + /// Drain the misbehavior vector. + pub fn drain_misbehavior(&mut self) -> hash_map::Drain> { + self.strategy.misbehavior.drain() + } +} + /// Attempt to reach BFT agreement on a candidate. /// /// `nodes` is the number of nodes in the system. diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index 977245e26f4ee..b819884e51432 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -100,6 +100,9 @@ pub type Committed = generic::Committed; /// Communication between BFT participants. pub type Communication = generic::Communication; +/// Misbehavior observed from BFT participants. +pub type Misbehavior = generic::Misbehavior; + /// Proposer factory. Can be used to create a proposer instance. pub trait ProposerFactory { /// The proposer type this creates. @@ -265,6 +268,9 @@ impl Future for BftFuture { self.import.import_block(justified_block, committed.justification) } + // TODO: have a trait member to pass misbehavior reports into. + let _misbehavior = self.inner.drain_misbehavior(); + Ok(Async::Ready(())) } } From 4ed9009dae1f908cd9ad7218ac0b50a762a12940 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 25 Feb 2018 13:04:58 +0100 Subject: [PATCH 03/20] collect misbehavior on drop, not only on success --- substrate/bft/src/lib.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index b819884e51432..599a79a90f51a 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -268,10 +268,14 @@ impl Future for BftFuture { self.import.import_block(justified_block, committed.justification) } + Ok(Async::Ready(())) + } +} + +impl Drop for BftFuture { + fn drop(&mut self) { // TODO: have a trait member to pass misbehavior reports into. let _misbehavior = self.inner.drain_misbehavior(); - - Ok(Async::Ready(())) } } From 359bf8222c8ddfb5910d7e0a326fa0f21fb182e1 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 25 Feb 2018 13:31:52 +0100 Subject: [PATCH 04/20] kill unused transaction_index field --- polkadot/runtime/src/environment.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/polkadot/runtime/src/environment.rs b/polkadot/runtime/src/environment.rs index 5b311ce1f98b9..b7fef7cdd87fd 100644 --- a/polkadot/runtime/src/environment.rs +++ b/polkadot/runtime/src/environment.rs @@ -31,8 +31,6 @@ pub struct Environment { pub parent_hash: Hash, /// The current block digest. pub digest: Digest, - /// The current transaction index - pub transaction_index: u64, } /// Do something with the environment and return its value. Keep the function short. From 9bb84bf05f06dc84f1a8f08cc7fb74e89ddf3137 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 25 Feb 2018 17:19:06 +0100 Subject: [PATCH 05/20] add primitive misbehavior report type --- substrate/primitives/src/bft.rs | 134 ++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/substrate/primitives/src/bft.rs b/substrate/primitives/src/bft.rs index 49e14075285bf..6be3ef6b12f1c 100644 --- a/substrate/primitives/src/bft.rs +++ b/substrate/primitives/src/bft.rs @@ -19,6 +19,7 @@ use block::{Block, HeaderHash}; use codec::{Slicable, Input}; use rstd::vec::Vec; +use ::{AuthorityId, Signature}; #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] @@ -152,3 +153,136 @@ impl Slicable for Justification { }) } } + +// single-byte code to represent misbehavior kind. +#[repr(u8)] +enum MisbehaviorCode { + /// BFT: double prepare. + BftDoublePrepare = 0x11, + /// BFT: double commit. + BftDoubleCommit = 0x12, +} + +impl MisbehaviorCode { + fn from_u8(x: u8) -> Option { + match x { + 0x11 => Some(MisbehaviorCode::BftDoublePrepare), + 0x12 => Some(MisbehaviorCode::BftDoubleCommit), + _ => None, + } + } +} + +/// Misbehavior kinds. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum MisbehaviorKind { + /// BFT: double prepare. + BftDoublePrepare((HeaderHash, Signature), (HeaderHash, Signature)), + /// BFT: double commit. + BftDoubleCommit((HeaderHash, Signature), (HeaderHash, Signature)), +} + +/// A report of misbehavior by an authority. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct MisbehaviorReport { + /// The round number consensus was reached in. + pub round_number: u32, + /// The parent hash of the block where the misbehavior occurred. + pub parent_hash: HeaderHash, + /// The authority who misbehavior. + pub target: AuthorityId, + /// The misbehavior kind. + pub misbehavior: MisbehaviorKind, +} + +impl Slicable for MisbehaviorReport { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + self.round_number.using_encoded(|s| v.extend(s)); + self.parent_hash.using_encoded(|s| v.extend(s)); + self.target.using_encoded(|s| v.extend(s)); + + match self.misbehavior { + MisbehaviorKind::BftDoublePrepare((ref h_a, ref s_a), (ref h_b, ref s_b)) => { + (MisbehaviorCode::BftDoublePrepare as u8).using_encoded(|s| v.extend(s)); + h_a.using_encoded(|s| v.extend(s)); + s_a.using_encoded(|s| v.extend(s)); + h_b.using_encoded(|s| v.extend(s)); + s_b.using_encoded(|s| v.extend(s)); + } + MisbehaviorKind::BftDoubleCommit((ref h_a, ref s_a), (ref h_b, ref s_b)) => { + (MisbehaviorCode::BftDoubleCommit as u8).using_encoded(|s| v.extend(s)); + h_a.using_encoded(|s| v.extend(s)); + s_a.using_encoded(|s| v.extend(s)); + h_b.using_encoded(|s| v.extend(s)); + s_b.using_encoded(|s| v.extend(s)); + } + } + + v + } + + fn decode(input: &mut I) -> Option { + let round_number = u32::decode(input)?; + let parent_hash = HeaderHash::decode(input)?; + let target = AuthorityId::decode(input)?; + + let misbehavior = match u8::decode(input).and_then(MisbehaviorCode::from_u8)? { + MisbehaviorCode::BftDoublePrepare => { + MisbehaviorKind::BftDoublePrepare( + (HeaderHash::decode(input)?, Signature::decode(input)?), + (HeaderHash::decode(input)?, Signature::decode(input)?), + ) + } + MisbehaviorCode::BftDoubleCommit => { + MisbehaviorKind::BftDoubleCommit( + (HeaderHash::decode(input)?, Signature::decode(input)?), + (HeaderHash::decode(input)?, Signature::decode(input)?), + ) + } + }; + + Some(MisbehaviorReport { + round_number, + parent_hash, + target, + misbehavior, + }) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn misbehavior_report_roundtrip() { + let report = MisbehaviorReport { + round_number: 511, + parent_hash: [0; 32].into(), + target: [1; 32].into(), + misbehavior: MisbehaviorKind::BftDoubleCommit( + ([2; 32].into(), [3; 64].into()), + ([4; 32].into(), [5; 64].into()), + ), + }; + + let encoded = report.encode(); + assert_eq!(MisbehaviorReport::decode(&mut &encoded[..]).unwrap(), report); + + let report = MisbehaviorReport { + round_number: 511, + parent_hash: [0; 32].into(), + target: [1; 32].into(), + misbehavior: MisbehaviorKind::BftDoublePrepare( + ([2; 32].into(), [3; 64].into()), + ([4; 32].into(), [5; 64].into()), + ), + }; + + let encoded = report.encode(); + assert_eq!(MisbehaviorReport::decode(&mut &encoded[..]).unwrap(), report); + } +} From ef9ac6bf2d93dc292fdee2058d054f89397318de Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 25 Feb 2018 17:29:10 +0100 Subject: [PATCH 06/20] add misbehavior report transaction --- polkadot/primitives/src/transaction.rs | 23 ++++++++++++++++++++--- substrate/primitives/src/bft.rs | 4 ++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/polkadot/primitives/src/transaction.rs b/polkadot/primitives/src/transaction.rs index d0b5ab9557f4f..dc58bada9f42c 100644 --- a/polkadot/primitives/src/transaction.rs +++ b/polkadot/primitives/src/transaction.rs @@ -18,6 +18,7 @@ use rstd::vec::Vec; use codec::{Input, Slicable}; +use primitives::bft::MisbehaviorReport; use ::Signature; #[cfg(feature = "std")] @@ -168,6 +169,8 @@ enum FunctionId { StakingUnstake = 0x21, /// Staking subsystem: transfer stake. StakingTransfer = 0x22, + /// Report misbehavior. + StakingReportMisbehavior = 0x23, /// Make a proposal for the governance system. GovernancePropose = 0x30, /// Approve a proposal for the governance system. @@ -178,9 +181,16 @@ impl FunctionId { /// Derive `Some` value from a `u8`, or `None` if it's invalid. fn from_u8(value: u8) -> Option { use self::*; - let functions = [FunctionId::StakingStake, FunctionId::StakingUnstake, - FunctionId::StakingTransfer, FunctionId::SessionSetKey, FunctionId::TimestampSet, - FunctionId::GovernancePropose, FunctionId::GovernanceApprove]; + let functions = [ + FunctionId::StakingStake, + FunctionId::StakingUnstake, + FunctionId::StakingTransfer, + FunctionId::StakingReportMisbehavior, + FunctionId::SessionSetKey, + FunctionId::TimestampSet, + FunctionId::GovernancePropose, + FunctionId::GovernanceApprove, + ]; functions.iter().map(|&f| f).find(|&f| value == f as u8) } } @@ -222,6 +232,8 @@ pub enum Function { StakingUnstake, /// Staking subsystem: transfer stake. StakingTransfer(::AccountId, u64), + /// Staking subsystem: report misbehavior of a validator. + ReportMisbehavior(MisbehaviorReport), /// Make a proposal for the governance system. GovernancePropose(Proposal), /// Approve a proposal for the governance system. @@ -266,6 +278,7 @@ impl Slicable for Function { Function::StakingTransfer(to, amount) } + FunctionId::StakingReportMisbehavior => Function::ReportMisbehavior(MisbehaviorReport::decode(input)?), FunctionId::GovernancePropose => Function::GovernancePropose(try_opt!(Slicable::decode(input))), FunctionId::GovernanceApprove => @@ -290,6 +303,10 @@ impl Slicable for Function { Function::StakingUnstake => { (FunctionId::StakingUnstake as u8).using_encoded(|s| v.extend(s)); } + Function::ReportMisbehavior(ref report) => { + (FunctionId::StakingReportMisbehavior as u8).using_encoded(|s| v.extend(s)); + report.using_encoded(|s| v.extend(s)); + } Function::StakingTransfer(ref to, ref amount) => { (FunctionId::StakingTransfer as u8).using_encoded(|s| v.extend(s)); to.using_encoded(|s| v.extend(s)); diff --git a/substrate/primitives/src/bft.rs b/substrate/primitives/src/bft.rs index 6be3ef6b12f1c..7bbb5aba036cb 100644 --- a/substrate/primitives/src/bft.rs +++ b/substrate/primitives/src/bft.rs @@ -175,7 +175,7 @@ impl MisbehaviorCode { /// Misbehavior kinds. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum MisbehaviorKind { /// BFT: double prepare. BftDoublePrepare((HeaderHash, Signature), (HeaderHash, Signature)), @@ -185,7 +185,7 @@ pub enum MisbehaviorKind { /// A report of misbehavior by an authority. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub struct MisbehaviorReport { /// The round number consensus was reached in. pub round_number: u32, From 7cb524b0cd1a5f48a8c0c932cd1faff40fe8d071 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 26 Feb 2018 19:34:43 +0100 Subject: [PATCH 07/20] store prior session --- polkadot/runtime/src/lib.rs | 26 +++++++++---- polkadot/runtime/src/runtime/consensus.rs | 6 +-- polkadot/runtime/src/runtime/session.rs | 47 ++++++++++++++++++++--- polkadot/runtime/src/runtime/staking.rs | 10 ++++- polkadot/runtime/src/runtime/system.rs | 3 ++ substrate/bft/src/lib.rs | 1 + substrate/primitives/src/bft.rs | 7 ++++ substrate/runtime-support/src/storage.rs | 46 ++++++++++++++++------ 8 files changed, 118 insertions(+), 28 deletions(-) diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index 4059a16551632..10d8146eae6b1 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -19,23 +19,33 @@ #![cfg_attr(not(feature = "std"), no_std)] extern crate substrate_runtime_std as rstd; -#[macro_use] extern crate substrate_runtime_io as runtime_io; extern crate substrate_runtime_support as runtime_support; -#[cfg(all(feature = "std", test))] extern crate substrate_keyring as keyring; - -#[cfg(feature = "std")] extern crate rustc_hex; - extern crate substrate_codec as codec; -#[cfg(feature = "std")] #[macro_use] extern crate substrate_primitives as primitives; extern crate polkadot_primitives; -#[cfg(test)] #[macro_use] extern crate hex_literal; +#[cfg(all(feature = "std", test))] +extern crate substrate_keyring as keyring; + +#[cfg(feature = "std")] +extern crate rustc_hex; + +#[cfg(feature = "std")] +#[macro_use] +extern crate substrate_primitives as primitives; + +#[macro_use] +extern crate substrate_runtime_io as runtime_io; + +#[cfg(test)] +#[macro_use] +extern crate hex_literal; pub mod environment; pub mod runtime; pub mod api; -#[cfg(feature = "std")] pub mod genesismap; +#[cfg(feature = "std")] +pub mod genesismap; /// Type definitions and helpers for transactions. pub mod transaction { diff --git a/polkadot/runtime/src/runtime/consensus.rs b/polkadot/runtime/src/runtime/consensus.rs index 7d50f6abd418f..0b19f4579207b 100644 --- a/polkadot/runtime/src/runtime/consensus.rs +++ b/polkadot/runtime/src/runtime/consensus.rs @@ -23,7 +23,7 @@ use polkadot_primitives::SessionKey; struct AuthorityStorageVec {} impl StorageVec for AuthorityStorageVec { type Item = SessionKey; - const PREFIX: &'static[u8] = b":auth:"; + const PREFIX: &'static [u8] = b":auth:"; } /// Get the current set of authorities. These are the session keys. @@ -37,8 +37,8 @@ pub mod internal { /// Set the current set of authorities' session keys. /// /// Called by `next_session` only. - pub fn set_authorities(authorities: &[SessionKey]) { - AuthorityStorageVec::set_items(authorities); + pub fn set_authorities<'a, I: IntoIterator>(authorities: I) { + AuthorityStorageVec::set_items::(authorities); } /// Set a single authority by index. diff --git a/polkadot/runtime/src/runtime/session.rs b/polkadot/runtime/src/runtime/session.rs index e9bf5f3765640..c4557436ef7fa 100644 --- a/polkadot/runtime/src/runtime/session.rs +++ b/polkadot/runtime/src/runtime/session.rs @@ -25,14 +25,23 @@ use runtime::{system, staking, consensus}; const SESSION_LENGTH: &[u8] = b"ses:len"; const CURRENT_INDEX: &[u8] = b"ses:ind"; +const CURRENT_SESSION_START: &[u8] = b"ses:sta"; +const LAST_SESSION_START: &[u8] = b"ses:lst"; const LAST_LENGTH_CHANGE: &[u8] = b"ses:llc"; const NEXT_KEY_FOR: &[u8] = b"ses:nxt:"; const NEXT_SESSION_LENGTH: &[u8] = b"ses:nln"; -struct ValidatorStorageVec {} +struct ValidatorStorageVec; impl StorageVec for ValidatorStorageVec { type Item = AccountId; - const PREFIX: &'static[u8] = b"ses:val:"; + const PREFIX: &'static [u8] = b"ses:val:"; +} + +// the session keys before the previous. +struct LastSessionKeys; +impl StorageVec for LastSessionKeys { + type Item = SessionKey; + const PREFIX: &'static [u8] = b"ses:old:"; } /// Get the current set of validators. @@ -50,11 +59,31 @@ pub fn validator_count() -> u32 { ValidatorStorageVec::count() as u32 } -/// The current era index. +/// The current session index. pub fn current_index() -> BlockNumber { storage::get_or(CURRENT_INDEX, 0) } +/// Get the starting block of the current session. +pub fn current_start_block() -> BlockNumber { + // this seems like it's computable just by examining the current block number, session length, + // and last length change, but it's not simple to tell whether we are before or after + // a session rotation on a block which will have one. + storage::get_or(CURRENT_SESSION_START, 0) +} + +/// Get the last session's authority keys. +pub fn last_session_keys() -> Vec { + LastSessionKeys::items() +} + +/// Get the start block of the last session. +/// In general this is computable from the session length, +/// but when the current session is the first with a new length it is uncomputable. +pub fn last_session_start() -> Option { + storage::get(LAST_SESSION_START) +} + /// The block number at which the era length last changed. pub fn last_length_change() -> BlockNumber { storage::get_or(LAST_LENGTH_CHANGE, 0) @@ -90,12 +119,15 @@ pub mod privileged { pub mod internal { use super::*; - /// Set the current set of validators. + /// Transition to a new era, with a new set of valiators. /// /// Called by staking::next_era() only. `next_session` should be called after this in order to /// update the session keys to the next validator set. pub fn set_validators(new: &[AccountId]) { + println!("new era: {:?}", new); + ValidatorStorageVec::set_items(new); + LastSessionKeys::set_items(&consensus::authorities()); consensus::internal::set_authorities(new); } @@ -114,7 +146,6 @@ pub mod internal { fn rotate_session() { // Increment current session index. storage::put(CURRENT_INDEX, &(current_index() + 1)); - // Enact era length change. if let Some(next_len) = storage::get::(NEXT_SESSION_LENGTH) { storage::put(SESSION_LENGTH, &next_len); @@ -122,10 +153,16 @@ fn rotate_session() { storage::kill(NEXT_SESSION_LENGTH); } + storage::put(LAST_SESSION_START, ¤t_start_block()); + storage::put(CURRENT_SESSION_START, &system::block_number()); + LastSessionKeys::set_items(&consensus::authorities()); + // Update any changes in session keys. validators().iter().enumerate().for_each(|(i, v)| { let k = v.to_keyed_vec(NEXT_KEY_FOR); if let Some(n) = storage::take(&k) { + // this is fine because the authorities vector currently + // matches the validators length perfectly. consensus::internal::set_authority(i as u32, &n); } }); diff --git a/polkadot/runtime/src/runtime/staking.rs b/polkadot/runtime/src/runtime/staking.rs index 0bb4372c6d269..c83d18b23d9ea 100644 --- a/polkadot/runtime/src/runtime/staking.rs +++ b/polkadot/runtime/src/runtime/staking.rs @@ -22,6 +22,7 @@ use runtime_io::print; use codec::KeyedVec; use runtime_support::{storage, StorageVec}; use polkadot_primitives::{BlockNumber, AccountId}; +use primitives::bft::{MisbehaviorReport, MisbehaviorKind}; use runtime::{system, session, governance}; /// The balance of an account. @@ -33,7 +34,7 @@ pub type Bondage = u64; struct IntentionStorageVec {} impl StorageVec for IntentionStorageVec { type Item = AccountId; - const PREFIX: &'static[u8] = b"sta:wil:"; + const PREFIX: &'static [u8] = b"sta:wil:"; } const BONDING_DURATION: &[u8] = b"sta:loc"; @@ -132,6 +133,13 @@ pub mod public { IntentionStorageVec::set_items(&intentions); storage::put(&transactor.to_keyed_vec(BONDAGE_OF), &(current_era() + bonding_duration())); } + + /// Report misbehavior. Only validators may do this. + pub fn report_misbehavior(misbehavior: &MisbehaviorReport) { + // 1. check that the target was a validator at the current block. + // 2. check the report. + + } } pub mod privileged { diff --git a/polkadot/runtime/src/runtime/system.rs b/polkadot/runtime/src/runtime/system.rs index b9d28cf18e5ff..098d52fd546f4 100644 --- a/polkadot/runtime/src/runtime/system.rs +++ b/polkadot/runtime/src/runtime/system.rs @@ -156,6 +156,9 @@ fn dispatch_function(function: &Function, transactor: &AccountId) { Function::StakingTransfer(dest, value) => { ::runtime::staking::public::transfer(transactor, &dest, value); } + Function::ReportMisbehavior(ref report) => { + ::runtime::staking::public::report_misbehavior(report) + } Function::SessionSetKey(session) => { ::runtime::session::public::set_key(transactor, &session); } diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index 599a79a90f51a..fb2508413872f 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -275,6 +275,7 @@ impl Future for BftFuture { impl Drop for BftFuture { fn drop(&mut self) { // TODO: have a trait member to pass misbehavior reports into. + // map authority IDs onto validator IDs. let _misbehavior = self.inner.drain_misbehavior(); } } diff --git a/substrate/primitives/src/bft.rs b/substrate/primitives/src/bft.rs index 7bbb5aba036cb..2dcc88c07d4f7 100644 --- a/substrate/primitives/src/bft.rs +++ b/substrate/primitives/src/bft.rs @@ -191,6 +191,8 @@ pub struct MisbehaviorReport { pub round_number: u32, /// The parent hash of the block where the misbehavior occurred. pub parent_hash: HeaderHash, + /// The parent number of the block where the misbehavior occurred. + pub parent_number: ::block::Number, /// The authority who misbehavior. pub target: AuthorityId, /// The misbehavior kind. @@ -202,6 +204,7 @@ impl Slicable for MisbehaviorReport { let mut v = Vec::new(); self.round_number.using_encoded(|s| v.extend(s)); self.parent_hash.using_encoded(|s| v.extend(s)); + self.parent_number.using_encoded(|s| v.extend(s)); self.target.using_encoded(|s| v.extend(s)); match self.misbehavior { @@ -227,6 +230,7 @@ impl Slicable for MisbehaviorReport { fn decode(input: &mut I) -> Option { let round_number = u32::decode(input)?; let parent_hash = HeaderHash::decode(input)?; + let parent_number = ::block::Number::decode(input)?; let target = AuthorityId::decode(input)?; let misbehavior = match u8::decode(input).and_then(MisbehaviorCode::from_u8)? { @@ -247,6 +251,7 @@ impl Slicable for MisbehaviorReport { Some(MisbehaviorReport { round_number, parent_hash, + parent_number, target, misbehavior, }) @@ -262,6 +267,7 @@ mod test { let report = MisbehaviorReport { round_number: 511, parent_hash: [0; 32].into(), + parent_number: 999, target: [1; 32].into(), misbehavior: MisbehaviorKind::BftDoubleCommit( ([2; 32].into(), [3; 64].into()), @@ -275,6 +281,7 @@ mod test { let report = MisbehaviorReport { round_number: 511, parent_hash: [0; 32].into(), + parent_number: 999, target: [1; 32].into(), misbehavior: MisbehaviorKind::BftDoublePrepare( ([2; 32].into(), [3; 64].into()), diff --git a/substrate/runtime-support/src/storage.rs b/substrate/runtime-support/src/storage.rs index 0960ecb0ba284..e5e06d88a5200 100644 --- a/substrate/runtime-support/src/storage.rs +++ b/substrate/runtime-support/src/storage.rs @@ -131,9 +131,26 @@ pub trait StorageVec { } /// Set the current set of items. - fn set_items(items: &[Self::Item]) { - Self::set_count(items.len() as u32); - items.iter().enumerate().for_each(|(v, ref i)| Self::set_item(v as u32, i)); + fn set_items<'a, I>(items: I) + where + I: IntoIterator, + Self::Item: 'a, + { + let mut count: u32 = 0; + + for (v, i) in items.into_iter().enumerate() { + count = count.checked_add(1).expect("exceeded runtime storage capacity"); + put(&v.to_keyed_vec(Self::PREFIX), i); + } + + Self::set_count(count); + } + + /// Push an item. + fn push(item: &Self::Item) { + let len = Self::count(); + put(&len.to_keyed_vec(Self::PREFIX), item); + Self::set_count(len + 1); } fn set_item(index: u32, item: &Self::Item) { @@ -258,9 +275,19 @@ pub mod unhashed { } /// Set the current set of items. - fn set_items(items: &[Self::Item]) { - Self::set_count(items.len() as u32); - items.iter().enumerate().for_each(|(v, ref i)| Self::set_item(v as u32, i)); + fn set_items<'a, I>(items: I) + where + I: IntoIterator, + Self::Item: 'a, + { + let mut count: u32 = 0; + + for (v, i) in items.into_iter().enumerate() { + count = count.checked_add(1).expect("exceeded runtime storage capacity"); + put(&v.to_keyed_vec(Self::PREFIX), i); + } + + Self::set_count(count); } fn set_item(index: u32, item: &Self::Item) { @@ -293,8 +320,8 @@ pub mod unhashed { #[cfg(test)] mod tests { use super::*; - use primitives::hexdisplay::HexDisplay; - use runtime_io::{storage, twox_128, TestExternalities, with_externalities}; + use primitives::hexdisplay; + use runtime_io::{twox_128, TestExternalities, with_externalities}; #[test] fn integers_can_be_stored() { @@ -337,7 +364,6 @@ mod tests { with_externalities(&mut t, || { runtime_io::set_storage(&twox_128(b":test"), b"\x0b\0\0\0Hello world"); let x = b"Hello world".to_vec(); - println!("Hex: {}", HexDisplay::from(&storage(&twox_128(b":test")).unwrap())); let y = get::>(b":test").unwrap(); assert_eq!(x, y); @@ -353,9 +379,7 @@ mod tests { put(b":test", &x); }); - println!("Ext is {:?}", t); with_externalities(&mut t, || { - println!("Hex: {}", HexDisplay::from(&storage(&twox_128(b":test")).unwrap())); let y: Vec = get(b":test").unwrap(); assert_eq!(x, y); }); From 38d0ff572d7cc2031dbb1911ff72e93a50ddfd9c Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 26 Feb 2018 23:27:54 +0100 Subject: [PATCH 08/20] fix set_items --- polkadot/runtime/src/runtime/consensus.rs | 2 +- substrate/runtime-support/src/storage.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/polkadot/runtime/src/runtime/consensus.rs b/polkadot/runtime/src/runtime/consensus.rs index 0b19f4579207b..7841f1d47d5bc 100644 --- a/polkadot/runtime/src/runtime/consensus.rs +++ b/polkadot/runtime/src/runtime/consensus.rs @@ -38,7 +38,7 @@ pub mod internal { /// /// Called by `next_session` only. pub fn set_authorities<'a, I: IntoIterator>(authorities: I) { - AuthorityStorageVec::set_items::(authorities); + AuthorityStorageVec::set_items(authorities); } /// Set a single authority by index. diff --git a/substrate/runtime-support/src/storage.rs b/substrate/runtime-support/src/storage.rs index e5e06d88a5200..8271578315167 100644 --- a/substrate/runtime-support/src/storage.rs +++ b/substrate/runtime-support/src/storage.rs @@ -138,9 +138,9 @@ pub trait StorageVec { { let mut count: u32 = 0; - for (v, i) in items.into_iter().enumerate() { + for i in items.into_iter() { + put(&count.to_keyed_vec(Self::PREFIX), i); count = count.checked_add(1).expect("exceeded runtime storage capacity"); - put(&v.to_keyed_vec(Self::PREFIX), i); } Self::set_count(count); @@ -282,9 +282,9 @@ pub mod unhashed { { let mut count: u32 = 0; - for (v, i) in items.into_iter().enumerate() { + for i in items.into_iter() { + put(&count.to_keyed_vec(Self::PREFIX), i); count = count.checked_add(1).expect("exceeded runtime storage capacity"); - put(&v.to_keyed_vec(Self::PREFIX), i); } Self::set_count(count); From 1f88aa1612a54b2551dcfcce0186bcd259ba85b7 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 28 Feb 2018 14:57:13 +0100 Subject: [PATCH 09/20] basic checks for misbehavior reports --- polkadot/primitives/src/lib.rs | 6 ++ polkadot/runtime/src/genesismap.rs | 3 +- polkadot/runtime/src/runtime/session.rs | 29 ++++++---- polkadot/runtime/src/runtime/staking.rs | 72 +++++++++++++++++++----- polkadot/runtime/src/runtime/system.rs | 2 +- substrate/runtime-std/with_std.rs | 1 + substrate/runtime-std/without_std.rs | 1 + substrate/runtime-support/src/storage.rs | 18 +++--- 8 files changed, 96 insertions(+), 36 deletions(-) diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index d65291476ab71..fb02e3d121117 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -80,3 +80,9 @@ pub type Signature = primitives::hash::H512; /// A timestamp: seconds since the unix epoch. pub type Timestamp = u64; + +/// The balance of an account. +pub type Balance = u64; + +/// The amount of bonding period left in an account. Measured in eras. +pub type Bondage = u64; diff --git a/polkadot/runtime/src/genesismap.rs b/polkadot/runtime/src/genesismap.rs index 4100f411b0d31..d2b370fe4627b 100644 --- a/polkadot/runtime/src/genesismap.rs +++ b/polkadot/runtime/src/genesismap.rs @@ -21,8 +21,7 @@ use std::collections::HashMap; use runtime_io::twox_128; use runtime_support::Hashable; use primitives::Block; -use polkadot_primitives::{BlockNumber, AccountId}; -use runtime::staking::Balance; +use polkadot_primitives::{Balance, BlockNumber, AccountId}; /// Configuration of a general Polkadot genesis block. pub struct GenesisConfig { diff --git a/polkadot/runtime/src/runtime/session.rs b/polkadot/runtime/src/runtime/session.rs index c4557436ef7fa..01a5f78bbc5a0 100644 --- a/polkadot/runtime/src/runtime/session.rs +++ b/polkadot/runtime/src/runtime/session.rs @@ -38,9 +38,9 @@ impl StorageVec for ValidatorStorageVec { } // the session keys before the previous. -struct LastSessionKeys; -impl StorageVec for LastSessionKeys { - type Item = SessionKey; +struct LastValidators; +impl StorageVec for LastValidators { + type Item = (AccountId, SessionKey); const PREFIX: &'static [u8] = b"ses:old:"; } @@ -72,9 +72,9 @@ pub fn current_start_block() -> BlockNumber { storage::get_or(CURRENT_SESSION_START, 0) } -/// Get the last session's authority keys. -pub fn last_session_keys() -> Vec { - LastSessionKeys::items() +/// Get the last session's validators, paired with their authority keys. +pub fn last_session_keys() -> Vec<(AccountId, SessionKey)> { + LastValidators::items() } /// Get the start block of the last session. @@ -124,10 +124,10 @@ pub mod internal { /// Called by staking::next_era() only. `next_session` should be called after this in order to /// update the session keys to the next validator set. pub fn set_validators(new: &[AccountId]) { - println!("new era: {:?}", new); - + LastValidators::set_items( + new.iter().cloned().zip(consensus::authorities()) + ); ValidatorStorageVec::set_items(new); - LastSessionKeys::set_items(&consensus::authorities()); consensus::internal::set_authorities(new); } @@ -153,12 +153,19 @@ fn rotate_session() { storage::kill(NEXT_SESSION_LENGTH); } + let validators = validators(); + storage::put(LAST_SESSION_START, ¤t_start_block()); storage::put(CURRENT_SESSION_START, &system::block_number()); - LastSessionKeys::set_items(&consensus::authorities()); + LastValidators::set_items( + validators.iter() + .cloned() + .zip(consensus::authorities()) + ); + // Update any changes in session keys. - validators().iter().enumerate().for_each(|(i, v)| { + validators.iter().enumerate().for_each(|(i, v)| { let k = v.to_keyed_vec(NEXT_KEY_FOR); if let Some(n) = storage::take(&k) { // this is fine because the authorities vector currently diff --git a/polkadot/runtime/src/runtime/staking.rs b/polkadot/runtime/src/runtime/staking.rs index c83d18b23d9ea..77d5e8d3d95e0 100644 --- a/polkadot/runtime/src/runtime/staking.rs +++ b/polkadot/runtime/src/runtime/staking.rs @@ -21,15 +21,9 @@ use rstd::cell::RefCell; use runtime_io::print; use codec::KeyedVec; use runtime_support::{storage, StorageVec}; -use polkadot_primitives::{BlockNumber, AccountId}; +use polkadot_primitives::{Balance, Bondage, BlockNumber, AccountId}; use primitives::bft::{MisbehaviorReport, MisbehaviorKind}; -use runtime::{system, session, governance}; - -/// The balance of an account. -pub type Balance = u64; - -/// The amount of bonding period left in an account. Measured in eras. -pub type Bondage = u64; +use runtime::{system, session, governance, consensus}; struct IntentionStorageVec {} impl StorageVec for IntentionStorageVec { @@ -81,11 +75,16 @@ pub fn balance(who: &AccountId) -> Balance { storage::get_or_default(&who.to_keyed_vec(BALANCE_OF)) } -/// The liquidity-state of a given account. +/// Gives the index of the era where the account's balance will no longer +/// be bonded. pub fn bondage(who: &AccountId) -> Bondage { storage::get_or_default(&who.to_keyed_vec(BONDAGE_OF)) } +fn set_balance(who: &AccountId, amount: Balance) { + storage::put(&who.to_keyed_vec(BALANCE_OF), &amount) +} + // Each identity's stake may be in one of three bondage states, given by an integer: // - n | n <= current_era(): inactive: free to be transferred. // - ~0: active: currently representing a validator. @@ -114,7 +113,7 @@ pub mod public { pub fn stake(transactor: &AccountId) { let mut intentions = IntentionStorageVec::items(); // can't be in the list twice. - assert!(intentions.iter().find(|t| *t == transactor).is_none(), "Cannot stake if already staked."); + assert!(intentions.iter().find(|t| t == &transactor).is_none(), "Cannot stake if already staked."); intentions.push(transactor.clone()); IntentionStorageVec::set_items(&intentions); storage::put(&transactor.to_keyed_vec(BONDAGE_OF), &u64::max_value()); @@ -134,11 +133,39 @@ pub mod public { storage::put(&transactor.to_keyed_vec(BONDAGE_OF), &(current_era() + bonding_duration())); } - /// Report misbehavior. Only validators may do this. - pub fn report_misbehavior(misbehavior: &MisbehaviorReport) { - // 1. check that the target was a validator at the current block. - // 2. check the report. + /// Report misbehavior. Only validators may do this, signing under + /// the authority key of the session the report corresponds to. + /// + /// Reports older than one session in the past will be ignored. + pub fn report_misbehavior(transactor: &AccountId, report: &MisbehaviorReport) { + let (validators, authorities) = if report.parent_number < session::last_session_start().unwrap_or(0) { + panic!("report is too old"); + } else if report.parent_number < session::current_start_block() { + session::last_session_keys().into_iter().unzip() + } else { + (session::validators(), consensus::authorities()) + }; + + if report.parent_hash != system::block_hash(report.parent_number) { + // report out of chain. + panic!("report not from this blockchain"); + } + let reporting_validator = match authorities.iter().position(|x| x == transactor) { + None => panic!("only validators may report"), + Some(pos) => validators.get(pos).expect("validators and authorities have same cardinality; qed"), + }; + + // any invalidity here is actually its own misbehavior. + let target = match authorities.iter().position(|x| x == &report.target) { + None => { + slash(reporting_validator, None); + return; + } + Some(pos) => validators.get(pos).expect("validators and authorities have same cardinality; qed"), + }; + + unimplemented!() } } @@ -179,6 +206,23 @@ pub mod internal { } } +/// Slash a validator, with an optional benefactor. +fn slash(who: &AccountId, benefactor: Option<&AccountId>) { + // the reciprocal of the proportion of the amount slashed to give + // to the benefactor. + const SLASH_REWARD_DENOMINATOR: Balance = 10; + + let slashed = balance(who); + set_balance(who, 0); + + if let Some(benefactor) = benefactor { + let reward = slashed / SLASH_REWARD_DENOMINATOR; + + let prior = balance(benefactor); + set_balance(benefactor, prior + reward); + } +} + /// The era has changed - enact new staking set. /// /// NOTE: This always happens immediately before a session change to ensure that new validators diff --git a/polkadot/runtime/src/runtime/system.rs b/polkadot/runtime/src/runtime/system.rs index 098d52fd546f4..902baaa4f5dbf 100644 --- a/polkadot/runtime/src/runtime/system.rs +++ b/polkadot/runtime/src/runtime/system.rs @@ -157,7 +157,7 @@ fn dispatch_function(function: &Function, transactor: &AccountId) { ::runtime::staking::public::transfer(transactor, &dest, value); } Function::ReportMisbehavior(ref report) => { - ::runtime::staking::public::report_misbehavior(report) + ::runtime::staking::public::report_misbehavior(transactor, report) } Function::SessionSetKey(session) => { ::runtime::session::public::set_key(transactor, &session); diff --git a/substrate/runtime-std/with_std.rs b/substrate/runtime-std/with_std.rs index 32124b04c80f7..9473cb836f132 100644 --- a/substrate/runtime-std/with_std.rs +++ b/substrate/runtime-std/with_std.rs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +pub use std::borrow; pub use std::boxed; pub use std::cell; pub use std::cmp; diff --git a/substrate/runtime-std/without_std.rs b/substrate/runtime-std/without_std.rs index b3e50eb2adf08..6afda817126b0 100644 --- a/substrate/runtime-std/without_std.rs +++ b/substrate/runtime-std/without_std.rs @@ -25,6 +25,7 @@ extern crate pwasm_alloc; pub use alloc::boxed; pub use alloc::rc; pub use alloc::vec; +pub use core::borrow; pub use core::cell; pub use core::cmp; pub use core::intrinsics; diff --git a/substrate/runtime-support/src/storage.rs b/substrate/runtime-support/src/storage.rs index 8271578315167..54237200fb911 100644 --- a/substrate/runtime-support/src/storage.rs +++ b/substrate/runtime-support/src/storage.rs @@ -17,6 +17,7 @@ //! Stuff to do with the runtime's storage. use rstd::prelude::*; +use rstd::borrow::Borrow; use runtime_io::{self, twox_128}; use codec::{Slicable, KeyedVec, Input}; @@ -131,15 +132,15 @@ pub trait StorageVec { } /// Set the current set of items. - fn set_items<'a, I>(items: I) + fn set_items(items: I) where - I: IntoIterator, - Self::Item: 'a, + I: IntoIterator, + T: Borrow, { let mut count: u32 = 0; for i in items.into_iter() { - put(&count.to_keyed_vec(Self::PREFIX), i); + put(&count.to_keyed_vec(Self::PREFIX), i.borrow()); count = count.checked_add(1).expect("exceeded runtime storage capacity"); } @@ -180,6 +181,7 @@ pub trait StorageVec { } pub mod unhashed { + use rstd::borrow::Borrow; use super::{runtime_io, Slicable, KeyedVec, Vec, IncrementalInput}; /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. @@ -275,15 +277,15 @@ pub mod unhashed { } /// Set the current set of items. - fn set_items<'a, I>(items: I) + fn set_items(items: I) where - I: IntoIterator, - Self::Item: 'a, + I: IntoIterator, + T: Borrow, { let mut count: u32 = 0; for i in items.into_iter() { - put(&count.to_keyed_vec(Self::PREFIX), i); + put(&count.to_keyed_vec(Self::PREFIX), i.borrow()); count = count.checked_add(1).expect("exceeded runtime storage capacity"); } From c8b69c268502d998cd2f1787686bd2a2d4ac32aa Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 28 Feb 2018 16:27:09 +0100 Subject: [PATCH 10/20] crate for substrate bft misbehavior checking --- Cargo.lock | 11 ++ Cargo.toml | 1 + substrate/keyring/src/lib.rs | 2 +- substrate/misbehavior-check/Cargo.toml | 17 +++ substrate/misbehavior-check/src/lib.rs | 184 +++++++++++++++++++++++++ substrate/primitives/src/bft.rs | 21 ++- 6 files changed, 224 insertions(+), 12 deletions(-) create mode 100644 substrate/misbehavior-check/Cargo.toml create mode 100644 substrate/misbehavior-check/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 84dc99510197f..57aa6849b89c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1470,6 +1470,17 @@ dependencies = [ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-misbehavior-check" +version = "0.1.0" +dependencies = [ + "substrate-bft 0.1.0", + "substrate-codec 0.1.0", + "substrate-keyring 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", +] + [[package]] name = "substrate-network" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 23e71fa1362f6..def8f0333f178 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ members = [ "substrate/executor", "substrate/keyring", "substrate/network", + "substrate/misbehavior-check", "substrate/primitives", "substrate/rpc-servers", "substrate/rpc", diff --git a/substrate/keyring/src/lib.rs b/substrate/keyring/src/lib.rs index 97e5ed6951365..2e49695be8b4b 100644 --- a/substrate/keyring/src/lib.rs +++ b/substrate/keyring/src/lib.rs @@ -17,7 +17,7 @@ //! Support code for the runtime. #[macro_use] extern crate hex_literal; -extern crate ed25519; +pub extern crate ed25519; use ed25519::{Pair, Public, Signature}; diff --git a/substrate/misbehavior-check/Cargo.toml b/substrate/misbehavior-check/Cargo.toml new file mode 100644 index 0000000000000..58d27f45c7e20 --- /dev/null +++ b/substrate/misbehavior-check/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "substrate-misbehavior-check" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +substrate-codec = { path = "../codec", default-features = false } +substrate-primitives = { path = "../primitives", default-features = false } +substrate-runtime-io = { path = "../runtime-io", default-features = false } + +[dev-dependencies] +substrate-bft = { path = "../bft" } +substrate-keyring = { path = "../keyring" } + +[features] +default = ["std"] +std = ["substrate-codec/std", "substrate-primitives/std", "substrate-runtime-io/std"] diff --git a/substrate/misbehavior-check/src/lib.rs b/substrate/misbehavior-check/src/lib.rs new file mode 100644 index 0000000000000..06524e31002de --- /dev/null +++ b/substrate/misbehavior-check/src/lib.rs @@ -0,0 +1,184 @@ +// 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 . + +//! Utility for substrate-based runtimes that want to check misbehavior reports. + +#![cfg_attr(not(feature = "std"), no_std)] + +extern crate substrate_codec as codec; +extern crate substrate_primitives as primitives; +extern crate substrate_runtime_io as runtime_io; + +#[cfg(test)] +extern crate substrate_bft; +#[cfg(test)] +extern crate substrate_keyring as keyring; + +use codec::Slicable; +use primitives::{AuthorityId, Signature}; +use primitives::block::HeaderHash; +use primitives::bft::{Action, Message, MisbehaviorKind}; + +// check a message signature. returns true if signed by that authority. +fn check_message_sig(message: Message, signature: &Signature, from: &AuthorityId) -> bool { + let msg = message.encode(); + runtime_io::ed25519_verify(&signature.0, &msg, from) +} + +fn prepare(parent: HeaderHash, round_number: u32, hash: HeaderHash) -> Message { + Message { + parent, + action: Action::Prepare(round_number, hash), + } +} + +fn commit(parent: HeaderHash, round_number: u32, hash: HeaderHash) -> Message { + Message { + parent, + action: Action::Commit(round_number, hash), + } +} + +/// Evaluate misbehavior. +pub fn evaluate_misbehavior( + misbehaved: &AuthorityId, + parent_hash: HeaderHash, + kind: &MisbehaviorKind, +) -> bool { + match *kind { + MisbehaviorKind::BftDoublePrepare(round, (h_1, ref s_1), (h_2, ref s_2)) => { + s_1 != s_2 && + check_message_sig(prepare(parent_hash, round, h_1), s_1, misbehaved) && + check_message_sig(prepare(parent_hash, round, h_2), s_2, misbehaved) + } + MisbehaviorKind::BftDoubleCommit(round, (h_1, ref s_1), (h_2, ref s_2)) => { + s_1 != s_2 && + check_message_sig(commit(parent_hash, round, h_1), s_1, misbehaved) && + check_message_sig(commit(parent_hash, round, h_2), s_2, misbehaved) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use substrate_bft::generic::Message as GenericMessage; + use keyring::ed25519; + use keyring::Keyring; + + fn sign_prepare(key: &ed25519::Pair, round: u32, hash: HeaderHash, parent_hash: HeaderHash) -> (HeaderHash, Signature) { + let sig = substrate_bft::sign_message( + GenericMessage::Prepare(round as _, hash), + key, + parent_hash + ).signature.signature; + + (hash, sig) + } + + fn sign_commit(key: &ed25519::Pair, round: u32, hash: HeaderHash, parent_hash: HeaderHash) -> (HeaderHash, Signature) { + let sig = substrate_bft::sign_message( + GenericMessage::Commit(round as _, hash), + key, + parent_hash + ).signature.signature; + + (hash, sig) + } + + #[test] + fn evaluates_double_prepare() { + let key: ed25519::Pair = Keyring::One.into(); + let parent_hash = [0xff; 32].into(); + let hash_1 = [0; 32].into(); + let hash_2 = [1; 32].into(); + + assert!(evaluate_misbehavior( + &key.public().0, + parent_hash, + &MisbehaviorKind::BftDoublePrepare( + 1, + sign_prepare(&key, 1, hash_1, parent_hash), + sign_prepare(&key, 1, hash_2, parent_hash) + ) + )); + + // same signature twice is not misbehavior. + let signed = sign_prepare(&key, 1, hash_1, parent_hash); + assert!(evaluate_misbehavior( + &key.public().0, + parent_hash, + &MisbehaviorKind::BftDoublePrepare( + 1, + signed, + signed, + ) + ) == false); + + // misbehavior has wrong target. + assert!(evaluate_misbehavior( + &Keyring::Two.to_raw_public(), + parent_hash, + &MisbehaviorKind::BftDoublePrepare( + 1, + sign_prepare(&key, 1, hash_1, parent_hash), + sign_prepare(&key, 1, hash_2, parent_hash), + ) + ) == false); + } + + #[test] + fn evaluates_double_commit() { + let key: ed25519::Pair = Keyring::One.into(); + let parent_hash = [0xff; 32].into(); + let hash_1 = [0; 32].into(); + let hash_2 = [1; 32].into(); + + assert!(evaluate_misbehavior( + &key.public().0, + parent_hash, + &MisbehaviorKind::BftDoubleCommit( + 1, + sign_commit(&key, 1, hash_1, parent_hash), + sign_commit(&key, 1, hash_2, parent_hash) + ) + )); + + // same signature twice is not misbehavior. + let signed = sign_commit(&key, 1, hash_1, parent_hash); + assert!(evaluate_misbehavior( + &key.public().0, + parent_hash, + &MisbehaviorKind::BftDoubleCommit( + 1, + signed, + signed, + ) + ) == false); + + // misbehavior has wrong target. + assert!(evaluate_misbehavior( + &Keyring::Two.to_raw_public(), + parent_hash, + &MisbehaviorKind::BftDoubleCommit( + 1, + sign_commit(&key, 1, hash_1, parent_hash), + sign_commit(&key, 1, hash_2, parent_hash), + ) + ) == false); + } +} diff --git a/substrate/primitives/src/bft.rs b/substrate/primitives/src/bft.rs index 2dcc88c07d4f7..78281834f4029 100644 --- a/substrate/primitives/src/bft.rs +++ b/substrate/primitives/src/bft.rs @@ -178,17 +178,15 @@ impl MisbehaviorCode { #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum MisbehaviorKind { /// BFT: double prepare. - BftDoublePrepare((HeaderHash, Signature), (HeaderHash, Signature)), + BftDoublePrepare(u32, (HeaderHash, Signature), (HeaderHash, Signature)), /// BFT: double commit. - BftDoubleCommit((HeaderHash, Signature), (HeaderHash, Signature)), + BftDoubleCommit(u32, (HeaderHash, Signature), (HeaderHash, Signature)), } /// A report of misbehavior by an authority. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub struct MisbehaviorReport { - /// The round number consensus was reached in. - pub round_number: u32, /// The parent hash of the block where the misbehavior occurred. pub parent_hash: HeaderHash, /// The parent number of the block where the misbehavior occurred. @@ -202,21 +200,22 @@ pub struct MisbehaviorReport { impl Slicable for MisbehaviorReport { fn encode(&self) -> Vec { let mut v = Vec::new(); - self.round_number.using_encoded(|s| v.extend(s)); self.parent_hash.using_encoded(|s| v.extend(s)); self.parent_number.using_encoded(|s| v.extend(s)); self.target.using_encoded(|s| v.extend(s)); match self.misbehavior { - MisbehaviorKind::BftDoublePrepare((ref h_a, ref s_a), (ref h_b, ref s_b)) => { + MisbehaviorKind::BftDoublePrepare(ref round, (ref h_a, ref s_a), (ref h_b, ref s_b)) => { (MisbehaviorCode::BftDoublePrepare as u8).using_encoded(|s| v.extend(s)); + round.using_encoded(|s| v.extend(s)); h_a.using_encoded(|s| v.extend(s)); s_a.using_encoded(|s| v.extend(s)); h_b.using_encoded(|s| v.extend(s)); s_b.using_encoded(|s| v.extend(s)); } - MisbehaviorKind::BftDoubleCommit((ref h_a, ref s_a), (ref h_b, ref s_b)) => { + MisbehaviorKind::BftDoubleCommit(ref round, (ref h_a, ref s_a), (ref h_b, ref s_b)) => { (MisbehaviorCode::BftDoubleCommit as u8).using_encoded(|s| v.extend(s)); + round.using_encoded(|s| v.extend(s)); h_a.using_encoded(|s| v.extend(s)); s_a.using_encoded(|s| v.extend(s)); h_b.using_encoded(|s| v.extend(s)); @@ -228,7 +227,6 @@ impl Slicable for MisbehaviorReport { } fn decode(input: &mut I) -> Option { - let round_number = u32::decode(input)?; let parent_hash = HeaderHash::decode(input)?; let parent_number = ::block::Number::decode(input)?; let target = AuthorityId::decode(input)?; @@ -236,12 +234,14 @@ impl Slicable for MisbehaviorReport { let misbehavior = match u8::decode(input).and_then(MisbehaviorCode::from_u8)? { MisbehaviorCode::BftDoublePrepare => { MisbehaviorKind::BftDoublePrepare( + u32::decode(input)?, (HeaderHash::decode(input)?, Signature::decode(input)?), (HeaderHash::decode(input)?, Signature::decode(input)?), ) } MisbehaviorCode::BftDoubleCommit => { MisbehaviorKind::BftDoubleCommit( + u32::decode(input)?, (HeaderHash::decode(input)?, Signature::decode(input)?), (HeaderHash::decode(input)?, Signature::decode(input)?), ) @@ -249,7 +249,6 @@ impl Slicable for MisbehaviorReport { }; Some(MisbehaviorReport { - round_number, parent_hash, parent_number, target, @@ -265,11 +264,11 @@ mod test { #[test] fn misbehavior_report_roundtrip() { let report = MisbehaviorReport { - round_number: 511, parent_hash: [0; 32].into(), parent_number: 999, target: [1; 32].into(), misbehavior: MisbehaviorKind::BftDoubleCommit( + 511, ([2; 32].into(), [3; 64].into()), ([4; 32].into(), [5; 64].into()), ), @@ -279,11 +278,11 @@ mod test { assert_eq!(MisbehaviorReport::decode(&mut &encoded[..]).unwrap(), report); let report = MisbehaviorReport { - round_number: 511, parent_hash: [0; 32].into(), parent_number: 999, target: [1; 32].into(), misbehavior: MisbehaviorKind::BftDoublePrepare( + 511, ([2; 32].into(), [3; 64].into()), ([4; 32].into(), [5; 64].into()), ), From dc0b7f46244021995829ace62a567d10d90f737d Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 28 Feb 2018 17:53:26 +0100 Subject: [PATCH 11/20] integrate misbehavior check crate --- Cargo.lock | 1 + polkadot/runtime/Cargo.toml | 2 + polkadot/runtime/src/lib.rs | 4 +- polkadot/runtime/src/runtime/staking.rs | 36 +++++++++++++++++- polkadot/runtime/wasm/Cargo.lock | 10 +++++ polkadot/runtime/wasm/Cargo.toml | 2 + .../release/polkadot_runtime.compact.wasm | Bin 104417 -> 154698 bytes .../release/polkadot_runtime.wasm | Bin 104496 -> 154777 bytes substrate/misbehavior-check/src/lib.rs | 4 ++ .../substrate_test_runtime.compact.wasm | Bin 33085 -> 33085 bytes .../release/substrate_test_runtime.wasm | Bin 33165 -> 33165 bytes 11 files changed, 55 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 57aa6849b89c9..15da041d35697 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1062,6 +1062,7 @@ dependencies = [ "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", + "substrate-misbehavior-check 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", diff --git a/polkadot/runtime/Cargo.toml b/polkadot/runtime/Cargo.toml index 4efe5c15e77ef..ce4565025a21e 100644 --- a/polkadot/runtime/Cargo.toml +++ b/polkadot/runtime/Cargo.toml @@ -12,6 +12,7 @@ substrate-runtime-std = { path = "../../substrate/runtime-std" } substrate-runtime-io = { path = "../../substrate/runtime-io" } substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-primitives = { path = "../../substrate/primitives" } +substrate-misbehavior-check = { path = "../../substrate/misbehavior-check" } polkadot-primitives = { path = "../primitives" } [dev-dependencies] @@ -25,6 +26,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-primitives/std", + "substrate-misbehavior-check/std", "polkadot-primitives/std", "log" ] diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index 10d8146eae6b1..7473fcdc181e1 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -21,6 +21,7 @@ extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_support as runtime_support; extern crate substrate_codec as codec; +extern crate substrate_misbehavior_check as misbehavior_check; extern crate polkadot_primitives; #[cfg(all(feature = "std", test))] @@ -29,8 +30,7 @@ extern crate substrate_keyring as keyring; #[cfg(feature = "std")] extern crate rustc_hex; -#[cfg(feature = "std")] -#[macro_use] +#[cfg_attr(any(test, feature = "std"), macro_use)] extern crate substrate_primitives as primitives; #[macro_use] diff --git a/polkadot/runtime/src/runtime/staking.rs b/polkadot/runtime/src/runtime/staking.rs index 77d5e8d3d95e0..f497ba3151887 100644 --- a/polkadot/runtime/src/runtime/staking.rs +++ b/polkadot/runtime/src/runtime/staking.rs @@ -156,7 +156,7 @@ pub mod public { Some(pos) => validators.get(pos).expect("validators and authorities have same cardinality; qed"), }; - // any invalidity here is actually its own misbehavior. + // any invalidity beyond this point is actually its own misbehavior. let target = match authorities.iter().position(|x| x == &report.target) { None => { slash(reporting_validator, None); @@ -165,7 +165,12 @@ pub mod public { Some(pos) => validators.get(pos).expect("validators and authorities have same cardinality; qed"), }; - unimplemented!() + let misbehaved = ::misbehavior_check::evaluate_misbehavior(&report.target, report.parent_hash, &report.misbehavior); + if misbehaved { + slash(target, Some(reporting_validator)) + } else { + slash(reporting_validator, None); + } } } @@ -456,4 +461,31 @@ mod tests { transfer(&one, &two, 69); }); } + + #[test] + #[should_panic] + fn misbehavior_report_by_non_validator_panics() { + let one = Keyring::One.to_raw_public(); + let two = Keyring::Two.to_raw_public(); + + let mut t: TestExternalities = map![ + twox_128(&one.to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&111u64) + ]; + + with_externalities(&mut t, || { + // the misbehavior report here is invalid, but that + // actually doesn't panic; instead it would slash the bad + // reporter. + report_misbehavior(&one, &MisbehaviorReport { + parent_hash: [0; 32].into(), + parent_number: 0, + target: two, + misbehavior: MisbehaviorKind::BftDoubleCommit( + 2, + ([1; 32].into(), [2; 64].into()), + ([3; 32].into(), [4; 64].into()), + ), + }) + }); + } } diff --git a/polkadot/runtime/wasm/Cargo.lock b/polkadot/runtime/wasm/Cargo.lock index 11fe2d48f84d0..d2bf5b3e7875e 100644 --- a/polkadot/runtime/wasm/Cargo.lock +++ b/polkadot/runtime/wasm/Cargo.lock @@ -392,6 +392,7 @@ version = "0.1.0" dependencies = [ "polkadot-primitives 0.1.0", "substrate-codec 0.1.0", + "substrate-misbehavior-check 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", @@ -599,6 +600,15 @@ dependencies = [ "substrate-runtime-std 0.1.0", ] +[[package]] +name = "substrate-misbehavior-check" +version = "0.1.0" +dependencies = [ + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", +] + [[package]] name = "substrate-primitives" version = "0.1.0" diff --git a/polkadot/runtime/wasm/Cargo.toml b/polkadot/runtime/wasm/Cargo.toml index 2452ce9bd28e1..0e30ce9ee6857 100644 --- a/polkadot/runtime/wasm/Cargo.toml +++ b/polkadot/runtime/wasm/Cargo.toml @@ -12,6 +12,7 @@ substrate-runtime-std = { path = "../../../substrate/runtime-std", default-featu substrate-runtime-io = { path = "../../../substrate/runtime-io", default-features = false } substrate-runtime-support = { path = "../../../substrate/runtime-support", default-features = false } substrate-primitives = { path = "../../../substrate/primitives", default-features = false } +substrate-misbehavior-check = { path = "../../../substrate/misbehavior-check", default-features = false } polkadot-primitives = { path = "../../primitives", default-features = false } [features] @@ -22,6 +23,7 @@ std = [ "substrate-runtime-std/std", "substrate-runtime-support/std", "substrate-primitives/std", + "substrate-misbehavior-check/std", "polkadot-primitives/std", ] 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 2960433376153fae66e4e6110e4cc63b1ad55108..e1fb29d10428a7a3c23bc384caefcec3d6ed9843 100644 GIT binary patch literal 154698 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 ZMSG-TUphIM>WN*2sRFp#bj>>He*y8@SHb`Q literal 104417 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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 e7a92e3450d71860e7fe808ac128935f91f46ba3..c40d54a5a39faea814862753a2feaeac3d79627f 100644 GIT binary patch literal 154777 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�uUqWTh?#V?*tdy^ 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 Message { } /// Evaluate misbehavior. +/// +/// Doesn't check that the header hash in question is +/// valid or whether the misbehaving authority was part of +/// the set at that block. pub fn evaluate_misbehavior( misbehaved: &AuthorityId, parent_hash: HeaderHash, 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 e60f92cc39843093812044a04992155f8f3c5f44..6c33e29c3c3ed4e05e401b4f71b36d17cdc84ca5 100644 GIT binary patch delta 68 zcmdnn#I(1GX~SwpCT_;bYZ==awKtnGX{a)4O^#Dv3?!K}3>dXG8*2#4O%8S2Eg-<4 Vz^K5W!NdR}SOnxZ^SkR=0RV;$58wa* delta 68 zcmdnn#I(1GX~SwpCPwbbYZ==awKkhFX{a)4PmWVx3?!K}3>dXH8*2#42?#JKFe)%; VFfo7#76JLm&Te})3%KiA0RU-Y577Vs 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 b03b591cc0e7886b9c7e3cc5a38584992a4fd0c4..c717aa19b6a7949e075262c093c42db03f6ade1d 100644 GIT binary patch delta 68 zcmeBeX6kKb+OVIIiJNiqLB_R=dYki^>{JbAcH){yWO{J=`Ca+Up3?zdz3>ft`H){yW2?#JKFe)%; VFfo7#76GNnlil`gPH@+?0sxql5wHLN From 74d1275101402bc68836298e4d1d634f7d6d2ba7 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 1 Mar 2018 19:38:00 +0100 Subject: [PATCH 12/20] fix comment --- substrate/bft/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index fb2508413872f..599a79a90f51a 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -275,7 +275,6 @@ impl Future for BftFuture { impl Drop for BftFuture { fn drop(&mut self) { // TODO: have a trait member to pass misbehavior reports into. - // map authority IDs onto validator IDs. let _misbehavior = self.inner.drain_misbehavior(); } } From 205a4d04e91029add746a26f81382b86ae8797c2 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Fri, 2 Mar 2018 14:42:09 +0100 Subject: [PATCH 13/20] new wasm binaries --- .../release/polkadot_runtime.compact.wasm | Bin 154698 -> 154607 bytes .../release/polkadot_runtime.wasm | Bin 154777 -> 154686 bytes .../substrate_test_runtime.compact.wasm | Bin 33085 -> 33085 bytes .../release/substrate_test_runtime.wasm | Bin 33165 -> 33165 bytes 4 files changed, 0 insertions(+), 0 deletions(-) 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 e1fb29d10428a7a3c23bc384caefcec3d6ed9843..7b23e9f44add93b1089451fa584367cb4d66df4e 100644 GIT binary patch delta 23879 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 aCR@dkH7hS)y`*^t?7_0urE||Z!}?!)gz{1V delta 23442 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 Mr3>eta+39b0Ep_vYXATM 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 c40d54a5a39faea814862753a2feaeac3d79627f..99fcb7cdfc5a9b33cbc7acc135d9ba0f1f187540 100644 GIT binary patch delta 23738 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 delta 23454 zcmch934GPXwf}GCE?Iu}k_%+HS#I*XtO-j&x{A#9EP)6YvRZVAh)=k{l}=#GK@}WkF)@fb&35}wC3eq1n|6umNn}aFI{ut>K1E$ZW_~UEwCFdY`I{~`V}oJmNi=o?ei{d z*|>Q9n&y^e>#dW+%a^q*ZdtKvS#wLnso%@23pzNtl{vxzk_SPhi4G$A%cFv2e zl*w1~&XD_@H0GMoX!Q0`H;Pf6=N)~7lv}DgZ#(Agphgbs+*<$JETXQOvoa^RrAk?j zm25gK);ajJXQbRw)%n&L2L^Q=Qy^ZI{%Zm<*KNB@6a-0CdvVv9Au(Da<6bjBOzV0r zD$4xwaIyPYnQ&!CjeBiOY$*>;lskgX4MOcGo+#UMn3F*1%#JE|YPlFW=&|BRwPmYA z((q2QFnwR9+ul`-DjqW!S2y9QMffOCUA%aM*=bK7!h#i z#Km0MR_kt$i!;Ag5_KOsLS(r$LqtJfbFJE2}jILy~q&-?#9uqM3Y^@o#2An6k?xK-*arE^+z;uE@qd#^m|gfk4AxWY?bPn!n$p9LPPW8#@}NoHDb~=zp-#{_F){`d z`qIp+*EDJ!p^ntsJ)PNKq+8e-BfB3i7b6T`in@kfAa;Ib)w_PSLKFyh&j3;F|G-gM z?xcvQa0~LpQDo}EJTMvQjy!PzC8)Q?9T*X-h-!_91*I7Sc@z4JA$m(m*C!G2zLXD^ zxUUTs^JGtrJ0xGcCl8dk!2+!4o|3NXTE$f&`FK+umF=IJo;15OxqH=0^q;I+eX57p zym}K6*=rhDapjuZJbdojTLyoPfNhP*hu4l^{kPZ7WioQz#>h`ZyeuSbH5`es)uWvq z>t2`1-gP6&ow5Nx6;@uPC|W*z#K@{qqsNS`9#>O4e!>w)PMZ8|vb`mm=oKe_}z3lQttGEL4ex=wft`*mb>%|S?M)57^ z-`m7@#qDCd_@1~!v_tXTCB83qh`Yr-;t}zv=oF8MABcOgB=?E?#RK9&u}gG_hs498 zN9+|hi8gVwxJ4wAVvBIaHt`*?RXi=eEuI(Gh@Xh(#8YC$)#AKm=P!R*yeeK1d&DV= zPCf1PGtNBg>=(q3#WSMrxF^Mr#BR|go)F#Q_#cXikBfccCGn!D91trlt8fYmi%SL$ z8k|35=&;vC{52tc{y;D*J15r;g$49Yp%a)He%&WRKTY0wVM*erLTNt!QQA(a>K2WT zuQ48g>bR_NtYyW6PEgg(2!Afs^W^p)P^-`h&IrFQ)LtTf4@5v+o>}*hR4=gTaH{TW zLcK`D7rJgDv+idzrFw~Fze`o_6>1+5p97KQ1Xe2lyzr+|y-eI8;Cw23M)-hKuMqJW zR{vFIK22V6QDNc}sd@?hR(BSd5#A@%Yeama8;ZubkL_oMe=gOd#D9$TDOqz0Rn1A^ z7jX`w;MXXS@d%W7;ecA}CGhv3|F=)PY)X&&CzW2oO7@D^{z>Ue;&lNfu$%N8l*#ah zvgCyq=g;^Lsh%Y2S0KH#Qg#bXdt!F@7g9aNf{!?-dV)_A{E%QI7|(a|VXXKfmEpZI z^nCKwi-#5Om+A>td7oWX`OuZ4eDO%AHyPS6Ec%jAeiXi&9w%RAq41^T2^%U4ek#?E z*z}iuO+zmyui8*K;ti>Oz>=T$wF~XVE)2#aDggX{N;~wTNcLVlbi}Jtb+PKt`Z~do zkyBhlOt^%QlXQ_Db~(p|?;qzdrn&R6i#8W^&2KlF~QWp2s*=vCf)gSx%`= zaK0wLv+*1LZk+nbhp(zg7F;qiA0`0I$4EdWW`y?$OsNb4KmU^9)c~>qyq=~zE3^lM z9L$PmsT>sa>QNl;+)aM}l8gHF^{i02sP$@c>^Fzk0k8qQlI|;@LV#a3@UZ&ukA(^Y zu@4Ae#IFV*|5E?{w|w)ee*HfqR32)*$o`K65CQN)y8oaW2zYP0{~npVx5vR!k9q}xZS|zDeTZZ$5IJeYF0hV%2D>CcTse@l1E=rJmC(hzE9|J)QQzOS3AC4o8vKT@4$d8 zt6knH?~>n_JLKIGJMn&2{DDliZI8;1+GNk|vyzu@&ztbP2>k@=vsCp+k{1cTAk_nGfEw<4xK#u~-2SGfO9!ZYfRHTnzNaeA`m>5mLKCy(Z8G&jY$@We0D1eaw9!7h! zM=Mk%;D?ew+f)YgE&0byXZyEJ&;nkayz0uq{gwlyRH5=N_B08=C;$(pdx|-+`J{F< zun$PP&Wbx`=d=lvZWHPqC+Xij$|ZJ(!A7zC*n>^+fZ9g%_ks2)evbK8sh&w7H?-U>ITLGxLtGUlYh>od^G{pzKb@c>Y$}n5p1OEu3Fu1fw0ex zK(*VF_SNwt0UQb7R<_Z{ML|SjZ-~a-)jo2ix0h~C(5%omgOyn)>zCQdzp{4@5 zIr-()@qs@Qp3GIsCMbu{Q=Ox(Stnt=CbwUALBARONT{RH?51S#_3^O)rUCdCdc=Nz5=lF8Uj z$4>$YKOwjoAY=J^5bNz0C$k|xrg@qSm$ra*p~S5fLIbW!3m|oRa!5)bVRX{TIqPAAN=d96vgJ zo%k;~igFsUqk3zS@$Y;qffhey$sbXYg&yA^@CN{es0O9rQ%lSa#3>NK)_F{*H(BNP zx+hqsabM^MIHIh$#0f4?W4ln_qR@Szu|-Zae2)m-tpUt~#w@6Mi+y}9><}<*B6X}! z*?N9KrY?R|sJB`1Q1Y>@P6E(=LZ5NyN_jy%q<%*DQv+`Se;yI)KZyD*CxF@fCxK4@ zgq*;faEDNTCgNit0`bDoGny#f*%lFgPSE7Yq(@~(hI%mUo8-xEQzVl*Xpz4rAKp6r z6lDI!et*U0B+TowJ`7Xj?=1NUB?X|Tm5liiKp{`nEC-o6G)Jx^{sT7W;uM<2DM~Kh zwm5;(%`APNt1ao{lS3|ebJ5`IpK zeyIym29=pPt?$_587S3-t>&`UQst4ZkGtbIrY6th|q+w?n7{ zM8A{ly|rZUyUhNl9z)+=xDoz(YdnEk@3H7VP!vQ@?-TeL08iWk6gS8j*#o^FzEh|V zSY>~zD>`1bjZ#6bOr`9>c3}$Z83zwK$=qmn3H2e{zOCC@6S29H+ixpM0RIv3ZxOGz zT(0^R5pNmaIqiELwYNwGoO~RTkpWyLZ6W%?r-l~UkrUKC+%iuJJF+-k7O4-<3C-pxvbzQ*=IM#~ zp?Q6G(e$O1%l0qbPN^I0|J3SV^^>53In|Mc{Nbo}I_=R(WDzhXtF7BqMdLc4#^n@u z=xqw4%Y*Oo(mTDh-AnI4s;}SQOJ%l;gspzaK5hppi1fQivDIMRAoDmgw<7ZxGux2q zWX46thjc4a-QRbR;oWnKmnM<2vs=9MW-o2?(r+VuggxEF@jICN7Erte!ZWL{ayKA- zm<87(!|U61NO=dl7U@GQxCR;CyRJsc3(8eUcd=kIGKEO5^wLd8A7sH5$V8F0dMU;( zO8~yy)>oy=00O$y)|a1enqDulRUF8TCfQ&s2hhc~8iM2^;{vkYKd zKx+-O#z3nLw2DxoEYxJcm8P)KKr2jgfvs;h%MEnCt?wqwY;`B+bDpiu)upy-CwQ&_ z8*F_;SYoR?h+S;3=h&(S&^K&FL-=fyoMo#7jny-4^&Qqd!&Wp;Pq)<+B&XTtlt0zh zHsvB)9R=(uCOO$wH?qk>Tiw8PfvxSq`L;F@v88Ao&b5u{H^)n7+r}=$#?`jki5UNS zww`4hgX;v_*kv<4c!q6^t$N#7Ovl^mI@UkVHg-{+t*#}kY-9XPw~cjktZmGXV{BtT zOtaNBtar3+?1iIj^$r!$R6AkL$|<%v@h02mFq&j5eZEb!&G~htZO)G)Z1pELoM4;t zV!UnCVl6f?@in&6+Hag~G+niAl=xU%{TIu}*hXoOwvCP*1sT-Jw#rt2VTDRB9cinp zN%06kTbRbYw9GbcpHkagvl1n? zxv>@7=1vy1&AqC~Ru8aYp>6bNfvxT%oNue0Ob6TQUZ#U=bvM(2w%Wlo;^~AuFCE}{ z3d0^8@>1KRb3(ZuBF9U!Asp-|3!0B<&{oef4M5v7_1ng)>9dW)64#2?iN~gXEm^(e z%z-Dtw%}zD7{`Laeq!gXJD%~0*_~(Yd@L+xB_ogLkD29E#Zf%ciOq|bz^w4kiH~yN zq?s4a!n3T}GSaC+OFk0p7}+`h@k?YFs39I|_sGt-yO(EGZ?1B1m(aCzHlVYID;?=! zb=F|FjO=XcY4s06H-k(m%?U_bW#`}a{5F{Qpwh|qTA@nNWbZsvmL>e=(N*=7uZ)-B z*et`5DW}Wny!`=kU`AM+YMI(ng)Gie0**j6B&gk!gR<_@MyD)tv{MF)sx&Uq92Xlj zS9?o&n@+%VDN}oN9!Gu|yp^T#3brdiJGHO05&I%Cyo8u2F~FxWJ$V`v?Zbek?oy8B z=PgzF`8TT+-W#B-c#57J$8?D+VZvHz=micofyL=5m|?mFNMSF=JLQOzG~Jr8$P%Y) ztkqLM-!v!FM_a4Uqn7g~UZpU5eHw!qd6=KmR=A8CZr zWV17_2-CeGOyk;MiVHm!=2@?&=Hs~Z8{r{`aSa&e zgV+<;5;-k7@QuQRUXelc_QUrSFF_An?>9nxeh7OxlNd)7@OK{N#<8tW_@VJD$KW;dg-i;nF5@xGs zh&)^=skJtBER0Q8s^HwXycz5>5QGt{rPq+lWms1q&bG-Ik}ov*7CaD9bm5y$yjsgf z$)|g#BrruyJyu(FMAbn3uIgE~501?+aCy4MLQv&8g(}x66c|K7Q>M2s6iiy#cv~Ec zpH@g(MRAL33`j|osa~I+L6B=$ruO?9E2X8g2XxlxzISv!;@4gtXv+-AOLv~uA1O>I z#mp4q4ZPizDX4`M;!r{}9QZV9kAy=8dW~a9?lK2~D1aOUpY%wi71*Ch)jm`#gDqj2 zYOUN2g;iqO?nYMZq8~kH*XBvOgYrqf4j-JmQ0bVtq=VN=-~>X45eE(%t}t{bUAjRm zR+VKLy^g&H(LpWZvFm|%NFDH?&N29GjfXbScm!TxG}LG1I65EJ=*0OPB-I!e>D&=$ zTx7CGvwtAVP|MeiWAB#FwkCMA$an>*P5tLo%-2i9rLCw-TpAg|bD}$HWD^SjNx-oc zjhrQ?Gq)QqMu;HS4TPaQnAX+c6&6}I>@nHFJj^qjW4u(mYBh-*40FwPvb{P?x}zDV3(i>b*@pMaG7JVkiS%RqfzCij zjuUCNf~7cKeB`*UQ7zDxV|%lc&cMtW?e+B+6lg0mqnv~@ z$m=MWo)LVe9?qAhy(C324w@8^xqXyrA_jS9`QD)BHWojV+dx8;De9TbP8e>}+T(V^ zzZu-7o&~ol{yC}XDk8yco=d@gNN^j%?F9NE!EL(f`1)iPi_O7oNVro1WTFoXZbQl) zf4{2Wwmw@^NKSNbXp*ld546JQpjhz$&P$6Gk(j8SeZMt;hV3(b^?8UjNN5|DqKJuV z=A=f_@`;J|pFL}0qWx!2BqrK__C#W${bx@k=9!xPBwvD>hgeLs-|Y1s8U$-8f(lSc zJ%gxo@cxpARrWzDwW>D43wt{^J^$xmf8}xFTGLWd=1jDn83f@*<+R}8Ov%SnUsb|a zX;$E%27Qi!4j2exP5Sm5C}N;5^C2f#1)l+1q5HU!2D%nd-(t4`>XV0UfciwH9Z(L& z_Zsd5DAV0^0J751SFABJ5&jEV^~{`<^kx`=;414x8zXf*CHDH_mN{Ygq-{BawaJpe zN+Pq0%S`hps1lIjpd(?-Vejv%3tf(*qC!8z`JIY;bv>AFuuCgtua5_ErQCF9(J?)rdr`H`{KjTDo!n)>@ zTE*-u#GJYF<}X;tXsu0x@mdUyx?lz4wGg(Ij*ePCYvyr?^{T8IbNT4YE*)207Aybe zCHVz~8#f4qKP623Q{I4!FS@X$g){ffz>JI-;|zDK(#WYuXiq`{aM4pT9-wdU->E7v zVZJPw?mU}yM)(?b64MU~umt~~2@}N#UHi~A-y6!RCA{dxh+ z#N!DqrXL~@(@nY5)CcvYq{PX^rKALs4R=*cKThO^pAn%Ra0Iov8R`M6zp`{6+`CQ= zc7PuM-y?Dzc<4FV3L39D>QbyZEn5lm89OaRZs8p-E%r0Q7ik&iy96$5Gs73duN({U zWg@laDx2n87O;Gp2yr47cbndY@M|!x#cotZv%;6qB^T4L6qX9D;)$`V&UbZsyW^oA zPd+jIa)FIcp#;}}g=a6OA20+a2y}gT18%l4{gxQ2hjkGmCI^^j^&Bmn0wlo^@q~18 zK~FBqe#|-0IEAvofd#U%X{+k#o7;f4)^YTb3-E)GCp@7LHh3|@onm~p{kH<8> zbCj<|tB0)hDsL88g(s{Sqlwt}Dq1bO5_Pg~f_T`)8%`|r6l(NoHef#{77ry_oegjX z)Q4LTJ{1e?=76|8;z$;be+EShB?C}`&;qbWo62b_HZ&^VMNo_b!2CSa`622+-Qr53 zCuyk-oKJd^XpBjQo1yVyp(miX7%Qb8vPv;bGo1agP&d$AOB5ls)F9xxyrIcTINF$C zYdO|RN6rIvc>0Wm9!DJv)fi7uw_CHqck1WO7~iqU-xhsLvn+s}g(I6QjXHSsjD;R! z9sNFdfM6%U0PpB1f0u|yiNMAHwHP+i5-5PV8w4^CTBF<0 z5YRop$BrImN0?nc@(&^J<3+s$ivSx1!E%j|wIDbK*3S$#hE`|}feoc}MaM!9YTg7? z0rC%^HGMmlXN6lmu*MZkg2Y~9mRm1s#6;_Lui&jHhQpf~_YqD^Sl?AvZ`9n9GOmWe z?v2JBZ?~l`hQRhj=_KlRE!3(OWSdK(ffDH^`tVNOIMD&FcknOLs_8E9(m@O?YQ)=3 zEObBFf#<>^PBCBey9(>WPSJog!;w!_7A_X8W0IXV4R3%hpxdFtr$Wwpnp9# zioPN*N6cT0?}biYeRw(Exng`Ybh5$F3gq!{=wyY@R}S(NV53c;!Gwwfg?B`~>9OVN zQELcLcv93`5FHE!h=)bgfZh^NK?t>hC&CIZ#S>O6v>in_blt>w257JG?pCJ0jIl@9rAYP7MRN@oz%unrDOa~lb$~^TcB;@D1OW?58&A-` zFsEjQ&kHTZC~2=Y?&cuykKWxq?fyz*JW~=IAzepbmT0)AF)&$;^rbQB3snl!lSsS9 z)2JLaDv`K z-tqBx@i`78t&|6?=Fp6=LKtL>kG)_R%*~~IAdB(M7b}uA1GUWXIF1}in+>rB+Gdl~ zpA~T@G~KQf*b^0XVnO&^RfWcQA5IXyRHH4TM*)r3;(w!0CF7-`W8gtZ??3ovaQXAL zE0!kZyCG%9Z$oVi0A(q^4ffx^=eWu6lX#9BxG8uiqi_*}OCY=unHbyv2Rnl^F;GJY z1JA@j{~>UsAQJ_ZgFws_hQtC>

FM&??iFgF5IM2Xkf}44>)AK^>5o>B#}62Imhf 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 N!iv?)7cHD^{WnF(!RP=0 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 6c33e29c3c3ed4e05e401b4f71b36d17cdc84ca5..d6f866d14b31393a55b63e6e2b0815a6005b9196 100644 GIT binary patch delta 155 zcmdnn#I(1GX~SAZR#sLf4vx*680RT7>P-$*T?iyUgUP9CF^qbfKdEhFVl>#iQgap~ zqyA(U?I=dw&GWUx*n!Hv8My*U8{_3b@`>>*AX#sc2qYhxSOG~HQ(K_+DAT8$j0Te( w?28%oH*c}`Wd@qX>*AX#sc2qYhxSOG~HQ(K_+DAT8$j5?DY w?28$7H*c}`Wd@qXykc~{6Q;IbC0R~+$e*gdg delta 155 zcmeBeX6kKb+HjDOm4kzom1*-a##_pa#*-JSE(DU!Y9R8dS`4G{W+(M+OpN-Qe`?NR zWHgvOMLUYoX!CpRFm|8 Date: Fri, 2 Mar 2018 14:44:11 +0100 Subject: [PATCH 14/20] fix hash in test --- polkadot/executor/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/polkadot/executor/src/lib.rs b/polkadot/executor/src/lib.rs index a1f472a859ec5..186e5469ccfda 100644 --- a/polkadot/executor/src/lib.rs +++ b/polkadot/executor/src/lib.rs @@ -162,7 +162,7 @@ mod tests { construct_block( 2, block1().1, - hex!("c8776c92e8012bf6b3f206448eda3f00bca26d77f220f4714c81cbc92a30e1e2").into(), + hex!("5604fe023cd6effd93aec9b4a008398abdd32afb3fec988a19aa853ab0424a7c").into(), 200_000, vec![ Transaction { From 9ad5a69372469e42e1daff35d3ddda83bd8840d2 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Fri, 2 Mar 2018 16:07:24 +0100 Subject: [PATCH 15/20] import misbehavior transactions into queue --- Cargo.lock | 1 + polkadot/consensus/Cargo.toml | 1 + polkadot/consensus/src/lib.rs | 76 +++++++++++++++++++++++++++++--- substrate/bft/src/generic/mod.rs | 5 +++ substrate/bft/src/lib.rs | 6 ++- 5 files changed, 80 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1d9089a799df1..1b364299fbb2c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1044,6 +1044,7 @@ 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)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "polkadot-api 0.1.0", "polkadot-collator 0.1.0", diff --git a/polkadot/consensus/Cargo.toml b/polkadot/consensus/Cargo.toml index 60c8009b7c9d5..b7ccbc6534b04 100644 --- a/polkadot/consensus/Cargo.toml +++ b/polkadot/consensus/Cargo.toml @@ -9,6 +9,7 @@ parking_lot = "0.4" tokio-timer = "0.1.2" ed25519 = { path = "../../substrate/ed25519" } error-chain = "0.11" +log = "0.4" polkadot-api = { path = "../api" } polkadot-collator = { path = "../collator" } polkadot-primitives = { path = "../primitives" } diff --git a/polkadot/consensus/src/lib.rs b/polkadot/consensus/src/lib.rs index 7321948dd7734..de4b114e04770 100644 --- a/polkadot/consensus/src/lib.rs +++ b/polkadot/consensus/src/lib.rs @@ -45,6 +45,9 @@ extern crate substrate_primitives as primitives; #[macro_use] extern crate error_chain; +#[macro_use] +extern crate log; + use std::collections::{HashMap, HashSet}; use std::sync::Arc; @@ -55,9 +58,9 @@ use polkadot_api::{PolkadotApi, BlockBuilder}; use polkadot_primitives::{Hash, Timestamp}; use polkadot_primitives::block::Block as PolkadotBlock; use polkadot_primitives::parachain::{Id as ParaId, DutyRoster, BlockData, Extrinsic, CandidateReceipt}; -use primitives::block::{Block as SubstrateBlock, Header as SubstrateHeader, HeaderHash, Id as BlockId}; +use primitives::block::{Block as SubstrateBlock, Header as SubstrateHeader, HeaderHash, Id as BlockId, Number as BlockNumber}; use primitives::AuthorityId; -use transaction_pool::TransactionPool; +use transaction_pool::{Ready, TransactionPool}; use futures::prelude::*; use futures::future; @@ -477,17 +480,19 @@ impl bft::ProposerFactory for ProposerFactory let duty_roster = self.client.duty_roster(&checked_id)?; let group_info = make_group_info(duty_roster, authorities)?; - let table = Arc::new(SharedTable::new(group_info, sign_with, parent_hash)); + let table = Arc::new(SharedTable::new(group_info, sign_with.clone(), parent_hash)); let router = self.network.table_router(table.clone()); // TODO [PoC-2]: kick off collation process. Ok(Proposer { parent_hash, + parent_number: parent_header.number, parent_id: checked_id, - _table: table, - _router: router, + local_key: sign_with, client: self.client.clone(), transaction_pool: self.transaction_pool.clone(), + _table: table, + _router: router, }) } } @@ -503,8 +508,10 @@ fn current_timestamp() -> Timestamp { /// The Polkadot proposer logic. pub struct Proposer { parent_hash: HeaderHash, + parent_number: BlockNumber, parent_id: C::CheckedBlockId, client: Arc, + local_key: Arc, transaction_pool: Arc>, _table: Arc, _router: R, @@ -516,8 +523,6 @@ impl bft::Proposer for Proposer { type Evaluate = Result; fn propose(&self) -> Result { - use transaction_pool::Ready; - // TODO: handle case when current timestamp behind that in state. let mut block_builder = self.client.build_block( &self.parent_id, @@ -565,6 +570,63 @@ impl bft::Proposer for Proposer { fn evaluate(&self, proposal: &SubstrateBlock) -> Result { evaluate_proposal(proposal, &*self.client, current_timestamp(), &self.parent_hash, &self.parent_id) } + + fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, bft::Misbehavior)>) { + use bft::generic::Misbehavior as GenericMisbehavior; + use primitives::bft::{MisbehaviorKind, MisbehaviorReport}; + use polkadot_primitives::transaction::{Function, Transaction, UncheckedTransaction}; + + let local_id = self.local_key.public().0; + let mut pool = self.transaction_pool.lock(); + let mut next_nonce = { + let readiness_evaluator = Ready::create(self.parent_id.clone(), &*self.client); + + let cur_nonce = pool.pending(readiness_evaluator) + .filter(|tx| tx.as_transaction().transaction.signed == local_id) + .last() + .map(|tx| Ok(tx.as_transaction().transaction.nonce)) + .unwrap_or_else(|| self.client.nonce(&self.parent_id, local_id)); + + match cur_nonce { + Ok(cur_nonce) => cur_nonce + 1, + Err(e) => { + warn!(target: "consensus", "Error computing next transaction nonce: {}", e); + return; + } + } + }; + + for (target, misbehavior) in misbehavior { + let report = MisbehaviorReport { + parent_hash: self.parent_hash, + parent_number: self.parent_number, + target, + misbehavior: match misbehavior { + GenericMisbehavior::DoublePrepare(round, (h1, s1), (h2, s2)) + => MisbehaviorKind::BftDoublePrepare(round as u32, (h1, s1.signature), (h2, s2.signature)), + GenericMisbehavior::DoubleCommit(round, (h1, s1), (h2, s2)) + => MisbehaviorKind::BftDoubleCommit(round as u32, (h1, s1.signature), (h2, s2.signature)), + } + }; + + let tx = Transaction { + signed: local_id, + nonce: next_nonce, + function: Function::ReportMisbehavior(report), + }; + + next_nonce += 1; + + let message = tx.encode(); + let signature = self.local_key.sign(&message); + let tx = UncheckedTransaction { + transaction: tx, + signature, + }; + + pool.import(tx).expect("locally signed transaction is valid; qed"); + } + } } fn evaluate_proposal( diff --git a/substrate/bft/src/generic/mod.rs b/substrate/bft/src/generic/mod.rs index f9129d5adf697..214f1ffd00a85 100644 --- a/substrate/bft/src/generic/mod.rs +++ b/substrate/bft/src/generic/mod.rs @@ -726,6 +726,11 @@ impl Future for Agreement } impl Agreement { + /// Get a reference to the underlying context. + pub fn context(&self) -> &C { + &self.context + } + /// Drain the misbehavior vector. pub fn drain_misbehavior(&mut self) -> hash_map::Drain> { self.strategy.misbehavior.drain() diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index 599a79a90f51a..dd5a116e75dbd 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -132,6 +132,8 @@ pub trait Proposer { /// Evaluate proposal. True means valid. // TODO: change this to a future. fn evaluate(&self, proposal: &Block) -> Self::Evaluate; + /// Import witnessed misbehavior. + fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, Misbehavior)>); } /// Block import trait. @@ -275,7 +277,8 @@ impl Future for BftFuture { impl Drop for BftFuture { fn drop(&mut self) { // TODO: have a trait member to pass misbehavior reports into. - let _misbehavior = self.inner.drain_misbehavior(); + let misbehavior = self.inner.drain_misbehavior().collect::>(); + self.inner.context().proposer.import_misbehavior(misbehavior); } } @@ -327,7 +330,6 @@ impl BftService let authorities = self.client.authorities(&BlockId::Hash(hash))?; - // TODO: check key is one of the authorities. let n = authorities.len(); let max_faulty = max_faulty_of(n); From 2e0e38c2af5c01311d0958a7e14734e42a973fb3 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 3 Mar 2018 16:01:55 +0100 Subject: [PATCH 16/20] fix test build --- substrate/bft/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index dd5a116e75dbd..3aab2a8f32542 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -518,6 +518,8 @@ mod tests { fn evaluate(&self, proposal: &Block) -> Result { Ok(proposal.header.number == self.0) } + + fn import_misbehavior(&self, _misbehavior: Vec<(AuthorityId, Misbehavior)>) {} } fn make_service(client: FakeClient, handle: Handle) From 1217286d053339c92a4ceecbe49e56263d31be07 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 4 Mar 2018 13:25:11 +0100 Subject: [PATCH 17/20] sign on digest and full proposal when proposing --- substrate/bft/src/generic/accumulator.rs | 182 +++++++++++++---------- substrate/bft/src/generic/mod.rs | 106 ++++++++++--- substrate/bft/src/generic/tests.rs | 20 ++- substrate/bft/src/lib.rs | 70 ++++++--- substrate/primitives/src/bft.rs | 20 ++- 5 files changed, 265 insertions(+), 133 deletions(-) diff --git a/substrate/bft/src/generic/accumulator.rs b/substrate/bft/src/generic/accumulator.rs index 52681f6b47013..d93ce7c6b3124 100644 --- a/substrate/bft/src/generic/accumulator.rs +++ b/substrate/bft/src/generic/accumulator.rs @@ -14,13 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Message accumulator for each round of BFT consensus. +//! Vote accumulator for each round of BFT consensus. use std::collections::{HashMap, HashSet}; use std::collections::hash_map::Entry; use std::hash::Hash; -use generic::{Message, LocalizedMessage}; +use generic::{Vote, LocalizedMessage}; /// Justification for some state at a given round. #[derive(Debug, Clone, PartialEq, Eq)] @@ -125,6 +125,10 @@ struct VoteCounts { /// Misbehavior which can occur. #[derive(Debug, Clone)] pub enum Misbehavior { + /// Proposed out-of-turn. + ProposeOutOfTurn(usize, Digest, Signature), + /// Issued two conflicting proposals. + DoublePropose(usize, (Digest, Signature), (Digest, Signature)), /// Issued two conflicting prepare messages. DoublePrepare(usize, (Digest, Signature), (Digest, Signature)), /// Issued two conflicting commit messages. @@ -203,17 +207,21 @@ impl Accumulator, ) -> Result<(), Misbehavior> { // message from different round. - if message.message.round_number() != self.round_number { + if message.round_number() != self.round_number { return Ok(()); } - let (sender, signature) = (message.sender, message.signature); - - match message.message { - Message::Propose(_, p) => self.import_proposal(p, sender), - Message::Prepare(_, d) => self.import_prepare(d, sender, signature), - Message::Commit(_, d) => self.import_commit(d, sender, signature), - Message::AdvanceRound(_) => self.import_advance_round(sender), + match message { + LocalizedMessage::Propose(proposal) => + self.import_proposal(proposal.proposal, proposal.sender, proposal.digest_signature), + LocalizedMessage::Vote(vote) => { + let (sender, signature) = (vote.sender, vote.signature); + match vote.vote { + Vote::Prepare(_, d) => self.import_prepare(d, sender, signature), + Vote::Commit(_, d) => self.import_commit(d, sender, signature), + Vote::AdvanceRound(_) => self.import_advance_round(sender), + } + } } } @@ -221,6 +229,7 @@ impl Accumulator Result<(), Misbehavior> { // TODO: find a way to check for proposal misbehavior without opening up DoS vectors. if sender != self.round_proposer || self.proposal.is_some() { return Ok(()) } @@ -364,6 +373,7 @@ impl Accumulator::new(1, 7, AuthorityId(8)); assert_eq!(accumulator.state(), &State::Begin); - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedMessage::Propose(LocalizedProposal { sender: AuthorityId(5), - signature: Signature(999, 5), - message: Message::Propose(1, Candidate(999)), - }).unwrap(); + full_signature: Signature(999, 5), + digest_signature: Signature(999, 5), + proposal: Candidate(999), + round_number: 1, + })).unwrap(); assert_eq!(accumulator.state(), &State::Begin); - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedMessage::Propose(LocalizedProposal { sender: AuthorityId(8), - signature: Signature(999, 8), - message: Message::Propose(1, Candidate(999)), - }).unwrap(); + full_signature: Signature(999, 8), + digest_signature: Signature(999, 8), + proposal: Candidate(999), + round_number: 1, + })).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); } @@ -435,29 +449,31 @@ mod tests { let mut accumulator = Accumulator::new(1, 7, AuthorityId(8)); assert_eq!(accumulator.state(), &State::Begin); - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedMessage::Propose(LocalizedProposal { sender: AuthorityId(8), - signature: Signature(999, 8), - message: Message::Propose(1, Candidate(999)), - }).unwrap(); + full_signature: Signature(999, 8), + digest_signature: Signature(999, 8), + round_number: 1, + proposal: Candidate(999), + })).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); for i in 0..6 { - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(999, i), - message: Message::Prepare(1, Digest(999)), - }).unwrap(); + vote: Vote::Prepare(1, Digest(999)), + }.into()).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); } - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(7), signature: Signature(999, 7), - message: Message::Prepare(1, Digest(999)), - }).unwrap(); + vote: Vote::Prepare(1, Digest(999)), + }.into()).unwrap(); match accumulator.state() { &State::Prepared(ref j) => assert_eq!(j.digest, Digest(999)), @@ -470,29 +486,31 @@ mod tests { let mut accumulator = Accumulator::new(1, 7, AuthorityId(8)); assert_eq!(accumulator.state(), &State::Begin); - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedMessage::Propose(LocalizedProposal { sender: AuthorityId(8), - signature: Signature(999, 8), - message: Message::Propose(1, Candidate(999)), - }).unwrap(); + full_signature: Signature(999, 8), + digest_signature: Signature(999, 8), + round_number: 1, + proposal: Candidate(999), + })).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); for i in 0..6 { - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(999, i), - message: Message::Prepare(1, Digest(999)), - }).unwrap(); + vote: Vote::Prepare(1, Digest(999)), + }.into()).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); } - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(7), signature: Signature(999, 7), - message: Message::Prepare(1, Digest(999)), - }).unwrap(); + vote: Vote::Prepare(1, Digest(999)), + }.into()).unwrap(); match accumulator.state() { &State::Prepared(ref j) => assert_eq!(j.digest, Digest(999)), @@ -500,11 +518,11 @@ mod tests { } for i in 0..6 { - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(999, i), - message: Message::Commit(1, Digest(999)), - }).unwrap(); + vote: Vote::Commit(1, Digest(999)), + }.into()).unwrap(); match accumulator.state() { &State::Prepared(_) => {}, @@ -512,11 +530,11 @@ mod tests { } } - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(7), signature: Signature(999, 7), - message: Message::Commit(1, Digest(999)), - }).unwrap(); + vote: Vote::Commit(1, Digest(999)), + }.into()).unwrap(); match accumulator.state() { &State::Committed(ref j) => assert_eq!(j.digest, Digest(999)), @@ -529,20 +547,22 @@ mod tests { let mut accumulator = Accumulator::new(1, 7, AuthorityId(8)); assert_eq!(accumulator.state(), &State::Begin); - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedMessage::Propose(LocalizedProposal { sender: AuthorityId(8), - signature: Signature(999, 8), - message: Message::Propose(1, Candidate(999)), - }).unwrap(); + full_signature: Signature(999, 8), + digest_signature: Signature(999, 8), + round_number: 1, + proposal: Candidate(999), + })).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); for i in 0..7 { - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(999, i), - message: Message::Prepare(1, Digest(999)), - }).unwrap(); + vote: Vote::Prepare(1, Digest(999)), + }.into()).unwrap(); } match accumulator.state() { @@ -551,11 +571,11 @@ mod tests { } for i in 0..6 { - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(999, i), - message: Message::AdvanceRound(1), - }).unwrap(); + vote: Vote::AdvanceRound(1), + }.into()).unwrap(); match accumulator.state() { &State::Prepared(_) => {}, @@ -563,11 +583,11 @@ mod tests { } } - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(7), signature: Signature(999, 7), - message: Message::AdvanceRound(1), - }).unwrap(); + vote: Vote::AdvanceRound(1), + }.into()).unwrap(); match accumulator.state() { &State::Advanced(Some(_)) => {}, @@ -581,11 +601,11 @@ mod tests { assert_eq!(accumulator.state(), &State::Begin); for i in 0..7 { - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(999, i), - message: Message::Prepare(1, Digest(999)), - }).unwrap(); + vote: Vote::Prepare(1, Digest(999)), + }.into()).unwrap(); } match accumulator.state() { @@ -594,11 +614,11 @@ mod tests { } for i in 0..7 { - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(999, i), - message: Message::Commit(1, Digest(999)), - }).unwrap(); + vote: Vote::Commit(1, Digest(999)), + }.into()).unwrap(); } match accumulator.state() { @@ -613,11 +633,11 @@ mod tests { assert_eq!(accumulator.state(), &State::Begin); for i in 0..7 { - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(1, i), - message: Message::AdvanceRound(1), - }).unwrap(); + vote: Vote::AdvanceRound(1), + }.into()).unwrap(); } match accumulator.state() { @@ -632,11 +652,11 @@ mod tests { assert_eq!(accumulator.state(), &State::Begin); for i in 0..7 { - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(999, i), - message: Message::Commit(1, Digest(999)), - }).unwrap(); + vote: Vote::Commit(1, Digest(999)), + }.into()).unwrap(); } match accumulator.state() { @@ -651,17 +671,17 @@ mod tests { assert_eq!(accumulator.state(), &State::Begin); for i in 0..7 { - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(999, i), - message: Message::Prepare(1, Digest(999)), - }).unwrap(); + vote: Vote::Prepare(1, Digest(999)), + }.into()).unwrap(); - let res = accumulator.import_message(LocalizedMessage { + let res = accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(123, i), - message: Message::Prepare(1, Digest(123)), - }); + vote: Vote::Prepare(1, Digest(123)), + }.into()); assert!(res.is_err()); @@ -674,17 +694,17 @@ mod tests { assert_eq!(accumulator.state(), &State::Begin); for i in 0..7 { - accumulator.import_message(LocalizedMessage { + accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(999, i), - message: Message::Commit(1, Digest(999)), - }).unwrap(); + vote: Vote::Commit(1, Digest(999)), + }.into()).unwrap(); - let res = accumulator.import_message(LocalizedMessage { + let res = accumulator.import_message(LocalizedVote { sender: AuthorityId(i), signature: Signature(123, i), - message: Message::Commit(1, Digest(123)), - }); + vote: Vote::Commit(1, Digest(123)), + }.into()); assert!(res.is_err()); diff --git a/substrate/bft/src/generic/mod.rs b/substrate/bft/src/generic/mod.rs index 214f1ffd00a85..d2aa3e5ab5c50 100644 --- a/substrate/bft/src/generic/mod.rs +++ b/substrate/bft/src/generic/mod.rs @@ -33,12 +33,9 @@ mod accumulator; #[cfg(test)] mod tests; -/// Messages over the proposal. -/// Each message carries an associated round number. +/// Votes during a round. #[derive(Debug, Clone, PartialEq, Eq)] -pub enum Message { - /// Send a full proposal. - Propose(usize, C), +pub enum Vote { /// Prepare to vote for proposal with digest D. Prepare(usize, D), /// Commit to proposal with digest D.. @@ -47,29 +44,92 @@ pub enum Message { AdvanceRound(usize), } -impl Message { +impl Vote { /// Extract the round number. pub fn round_number(&self) -> usize { match *self { - Message::Propose(round, _) => round, - Message::Prepare(round, _) => round, - Message::Commit(round, _) => round, - Message::AdvanceRound(round) => round, + Vote::Prepare(round, _) => round, + Vote::Commit(round, _) => round, + Vote::AdvanceRound(round) => round, } } } -/// A localized message, including the sender. +/// Messages over the proposal. +/// Each message carries an associated round number. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum Message { + /// A proposal itself. + Propose(usize, C), + /// A vote of some kind, localized to a round number. + Vote(Vote), +} + +impl From> for Message { + fn from(vote: Vote) -> Self { + Message::Vote(vote) + } +} + +/// A localized proposal message. Contains two signed pieces of data. #[derive(Debug, Clone)] -pub struct LocalizedMessage { - /// The message received. - pub message: Message, +pub struct LocalizedProposal { + /// The round number. + pub round_number: usize, + /// The proposal sent. + pub proposal: C, + /// The sender of the proposal + pub sender: V, + /// The signature on the message (propose, round number, digest) + pub digest_signature: S, + /// The signature on the message (propose, round number, proposal) + pub full_signature: S, +} + +/// A localized vote message, including the sender. +#[derive(Debug, Clone)] +pub struct LocalizedVote { + /// The message sent. + pub vote: Vote, /// The sender of the message pub sender: V, /// The signature of the message. pub signature: S, } +/// A localized message. +#[derive(Debug, Clone)] +pub enum LocalizedMessage { + /// A proposal. + Propose(LocalizedProposal), + /// A vote. + Vote(LocalizedVote), +} + +impl LocalizedMessage { + /// Extract the sender. + pub fn sender(&self) -> &V { + match *self { + LocalizedMessage::Propose(ref proposal) => &proposal.sender, + LocalizedMessage::Vote(ref vote) => &vote.sender, + } + } + + /// Extract the round number. + pub fn round_number(&self) -> usize { + match *self { + LocalizedMessage::Propose(ref proposal) => proposal.round_number, + LocalizedMessage::Vote(ref vote) => vote.vote.round_number(), + } + } +} + +impl From> for LocalizedMessage { + fn from(vote: LocalizedVote) -> Self { + LocalizedMessage::Vote(vote) + } +} + /// Context necessary for agreement. /// /// Provides necessary types for protocol messages, and functions necessary for a @@ -102,6 +162,8 @@ pub trait Context { fn candidate_digest(&self, candidate: &Self::Candidate) -> Self::Digest; /// Sign a message using the local authority ID. + /// In the case of a proposal message, it should sign on the hash and + /// the bytes of the proposal. fn sign_local(&self, message: Message) -> LocalizedMessage; @@ -299,9 +361,9 @@ impl Strategy { &mut self, msg: LocalizedMessage ) { - let round_number = msg.message.round_number(); + let round_number = msg.round_number(); - let sender = msg.sender.clone(); + let sender = msg.sender().clone(); let misbehavior = if round_number == self.current_accumulator.round_number() { self.current_accumulator.import_message(msg) } else if round_number == self.future_accumulator.round_number() { @@ -536,10 +598,10 @@ impl Strategy { } if let Some(digest) = prepare_for { - let message = Message::Prepare( + let message = Vote::Prepare( self.current_accumulator.round_number(), digest - ); + ).into(); self.import_and_send_message(message, context, sending); self.local_state = LocalState::Prepared; @@ -569,10 +631,10 @@ impl Strategy { } if let Some(digest) = commit_for { - let message = Message::Commit( + let message = Vote::Commit( self.current_accumulator.round_number(), digest - ); + ).into(); self.import_and_send_message(message, context, sending); self.local_state = LocalState::Committed; @@ -598,9 +660,9 @@ impl Strategy { } if attempt_advance { - let message = Message::AdvanceRound( + let message = Vote::AdvanceRound( self.current_accumulator.round_number(), - ); + ).into(); self.import_and_send_message(message, context, sending); self.local_state = LocalState::VoteAdvance; diff --git a/substrate/bft/src/generic/tests.rs b/substrate/bft/src/generic/tests.rs index c64907cbeef77..3c6c7a053dfdb 100644 --- a/substrate/bft/src/generic/tests.rs +++ b/substrate/bft/src/generic/tests.rs @@ -191,10 +191,20 @@ impl Context for TestContext { -> LocalizedMessage { let signature = Signature(message.clone(), self.local_id.clone()); - LocalizedMessage { - message, - signature, - sender: self.local_id.clone() + + match message { + Message::Propose(r, proposal) => LocalizedMessage::Propose(LocalizedProposal { + round_number: r, + proposal, + digest_signature: signature.clone(), + full_signature: signature, + sender: self.local_id.clone(), + }), + Message::Vote(vote) => LocalizedMessage::Vote(LocalizedVote { + vote, + signature, + sender: self.local_id.clone(), + }), } } @@ -333,7 +343,7 @@ fn threshold_plus_one_locked_on_proposal_only_one_with_candidate() { round_number: locked_round, digest: locked_digest.clone(), signatures: (0..7) - .map(|i| Signature(Message::Prepare(locked_round, locked_digest.clone()), AuthorityId(i))) + .map(|i| Signature(Message::Vote(Vote::Prepare(locked_round, locked_digest.clone())), AuthorityId(i))) .collect() }.check(7, |_, _, s| Some(s.1.clone())).unwrap(); diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index 3aab2a8f32542..ec814ddf64dc7 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -438,28 +438,47 @@ pub fn check_prepare_justification(authorities: &[AuthorityId], parent: HeaderHa /// Sign a BFT message with the given key. pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: HeaderHash) -> LocalizedMessage { - 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 signer = key.public(); - let primitive = PrimitiveMessage { - parent: parent_hash, - action, - }; + let sign_action = |action| { + let primitive = PrimitiveMessage { + parent: parent_hash, + action, + }; - let to_sign = Slicable::encode(&primitive); - let signature = LocalizedSignature { - signer: key.public(), - signature: key.sign(&to_sign), + let to_sign = Slicable::encode(&primitive); + LocalizedSignature { + signer: signer.clone(), + signature: key.sign(&to_sign), + } }; - LocalizedMessage { - message, - signature, - sender: key.public().0 + match message { + ::generic::Message::Propose(r, proposal) => { + let action_header = PrimitiveAction::ProposeHeader(r as u32, proposal.header.hash()); + let action_propose = PrimitiveAction::Propose(r as u32, proposal.clone()); + + ::generic::LocalizedMessage::Propose(::generic::LocalizedProposal { + round_number: r, + proposal, + sender: signer.0, + digest_signature: sign_action(action_header), + full_signature: sign_action(action_propose), + }) + } + ::generic::Message::Vote(vote) => { + let action = match vote { + ::generic::Vote::Prepare(r, h) => PrimitiveAction::Prepare(r as u32, h), + ::generic::Vote::Commit(r, h) => PrimitiveAction::Commit(r as u32, h), + ::generic::Vote::AdvanceRound(r) => PrimitiveAction::AdvanceRound(r as u32), + }; + + ::generic::LocalizedMessage::Vote(::generic::LocalizedVote { + vote: vote, + sender: signer.0, + signature: sign_action(action), + }) + } } } @@ -536,6 +555,13 @@ mod tests { } } + fn sign_vote(vote: ::generic::Vote, key: &ed25519::Pair, parent_hash: HeaderHash) -> LocalizedSignature { + match sign_message(vote.into(), key, parent_hash) { + ::generic::LocalizedMessage::Vote(vote) => vote.signature, + _ => panic!("signing vote leads to signed vote"), + } + } + #[test] fn future_gets_preempted() { let client = FakeClient { @@ -605,7 +631,7 @@ mod tests { digest: hash, round_number: 1, signatures: authorities_keys.iter().take(3).map(|key| { - sign_message(generic::Message::Commit(1, hash), key, parent_hash).signature + sign_vote(generic::Vote::Commit(1, hash).into(), key, parent_hash) }).collect(), }; @@ -615,7 +641,7 @@ mod tests { digest: hash, round_number: 0, // wrong round number (vs. the signatures) signatures: authorities_keys.iter().take(3).map(|key| { - sign_message(generic::Message::Commit(1, hash), key, parent_hash).signature + sign_vote(generic::Vote::Commit(1, hash).into(), key, parent_hash) }).collect(), }; @@ -626,7 +652,7 @@ mod tests { digest: hash, round_number: 1, signatures: authorities_keys.iter().take(2).map(|key| { - sign_message(generic::Message::Commit(1, hash), key, parent_hash).signature + sign_vote(generic::Vote::Commit(1, hash).into(), key, parent_hash) }).collect(), }; @@ -637,7 +663,7 @@ mod tests { digest: [0xfe; 32].into(), round_number: 1, signatures: authorities_keys.iter().take(3).map(|key| { - sign_message(generic::Message::Commit(1, hash), key, parent_hash).signature + sign_vote(generic::Vote::Commit(1, hash).into(), key, parent_hash) }).collect(), }; diff --git a/substrate/primitives/src/bft.rs b/substrate/primitives/src/bft.rs index 78281834f4029..717ff8a4242ad 100644 --- a/substrate/primitives/src/bft.rs +++ b/substrate/primitives/src/bft.rs @@ -26,9 +26,10 @@ use ::{AuthorityId, Signature}; #[repr(u8)] enum ActionKind { Propose = 1, - Prepare = 2, - Commit = 3, - AdvanceRound = 4, + ProposeHeader = 2, + Prepare = 3, + Commit = 4, + AdvanceRound = 5, } /// Actions which can be taken during the BFT process. @@ -37,6 +38,9 @@ enum ActionKind { pub enum Action { /// Proposal of a block candidate. Propose(u32, Block), + /// Proposal header of a block candidate. Accompanies any proposal, + /// but is used for misbehavior reporting since blocks themselves are big. + ProposeHeader(u32, HeaderHash), /// Preparation to commit for a candidate. Prepare(u32, HeaderHash), /// Vote to commit to a candidate. @@ -54,6 +58,11 @@ impl Slicable for Action { round.using_encoded(|s| v.extend(s)); block.using_encoded(|s| v.extend(s)); } + Action::ProposeHeader(ref round, ref hash) => { + v.push(ActionKind::ProposeHeader as u8); + round.using_encoded(|s| v.extend(s)); + hash.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)); @@ -79,6 +88,11 @@ impl Slicable for Action { let (round, block) = try_opt!(Slicable::decode(value)); Some(Action::Propose(round, block)) } + Some(x) if x == ActionKind::ProposeHeader as u8 => { + let (round, hash) = try_opt!(Slicable::decode(value)); + + Some(Action::ProposeHeader(round, hash)) + } Some(x) if x == ActionKind::Prepare as u8 => { let (round, hash) = try_opt!(Slicable::decode(value)); From da8541d49ab390a46fb486af911fe2d68011c684 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 4 Mar 2018 13:53:48 +0100 Subject: [PATCH 18/20] detect proposal misbehavior --- substrate/bft/src/generic/accumulator.rs | 91 ++++++++++++++++++++---- substrate/bft/src/generic/mod.rs | 6 +- substrate/bft/src/generic/tests.rs | 1 + substrate/bft/src/lib.rs | 4 +- 4 files changed, 85 insertions(+), 17 deletions(-) diff --git a/substrate/bft/src/generic/accumulator.rs b/substrate/bft/src/generic/accumulator.rs index d93ce7c6b3124..64c4f22254898 100644 --- a/substrate/bft/src/generic/accumulator.rs +++ b/substrate/bft/src/generic/accumulator.rs @@ -20,7 +20,7 @@ use std::collections::{HashMap, HashSet}; use std::collections::hash_map::Entry; use std::hash::Hash; -use generic::{Vote, LocalizedMessage}; +use generic::{Vote, LocalizedMessage, LocalizedProposal}; /// Justification for some state at a given round. #[derive(Debug, Clone, PartialEq, Eq)] @@ -122,6 +122,13 @@ struct VoteCounts { committed: usize, } +#[derive(Debug)] +struct Proposal { + proposal: Candidate, + digest: Digest, + digest_signature: Signature, +} + /// Misbehavior which can occur. #[derive(Debug, Clone)] pub enum Misbehavior { @@ -151,7 +158,7 @@ pub struct Accumulator round_number: usize, threshold: usize, round_proposer: AuthorityId, - proposal: Option, + proposal: Option>, prepares: HashMap, commits: HashMap, vote_counts: HashMap, @@ -192,7 +199,7 @@ impl Accumulator Option<&Candidate> { - self.proposal.as_ref() + self.proposal.as_ref().map(|p| &p.proposal) } /// Inspect the current consensus state. @@ -212,8 +219,7 @@ impl Accumulator - self.import_proposal(proposal.proposal, proposal.sender, proposal.digest_signature), + LocalizedMessage::Propose(proposal) => self.import_proposal(proposal), LocalizedMessage::Vote(vote) => { let (sender, signature) = (vote.sender, vote.signature); match vote.vote { @@ -227,15 +233,39 @@ impl Accumulator, ) -> Result<(), Misbehavior> { - // TODO: find a way to check for proposal misbehavior without opening up DoS vectors. - if sender != self.round_proposer || self.proposal.is_some() { return Ok(()) } + let sender = proposal.sender; + + if sender != self.round_proposer { + return Err(Misbehavior::ProposeOutOfTurn( + self.round_number, + proposal.digest, + proposal.digest_signature) + ); + } + + match self.proposal { + Some(ref p) if &p.digest != &proposal.digest => { + return Err(Misbehavior::DoublePropose( + self.round_number, + { + let old = self.proposal.as_ref().expect("just checked to be Some; qed"); + (old.digest.clone(), old.digest_signature.clone()) + }, + (proposal.digest.clone(), proposal.digest_signature.clone()) + )) + } + _ => {}, + } - self.proposal = Some(proposal.clone()); - self.state = State::Proposed(proposal); + self.proposal = Some(Proposal { + proposal: proposal.proposal.clone(), + digest: proposal.digest, + digest_signature: proposal.digest_signature, + }); + + self.state = State::Proposed(proposal.proposal); Ok(()) } @@ -423,13 +453,16 @@ mod tests { let mut accumulator = Accumulator::<_, Digest, _, _>::new(1, 7, AuthorityId(8)); assert_eq!(accumulator.state(), &State::Begin); - accumulator.import_message(LocalizedMessage::Propose(LocalizedProposal { + let res = accumulator.import_message(LocalizedMessage::Propose(LocalizedProposal { sender: AuthorityId(5), full_signature: Signature(999, 5), digest_signature: Signature(999, 5), proposal: Candidate(999), + digest: Digest(999), round_number: 1, - })).unwrap(); + })); + + assert!(res.is_err()); assert_eq!(accumulator.state(), &State::Begin); @@ -438,6 +471,7 @@ mod tests { full_signature: Signature(999, 8), digest_signature: Signature(999, 8), proposal: Candidate(999), + digest: Digest(999), round_number: 1, })).unwrap(); @@ -455,6 +489,7 @@ mod tests { digest_signature: Signature(999, 8), round_number: 1, proposal: Candidate(999), + digest: Digest(999), })).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); @@ -492,6 +527,7 @@ mod tests { digest_signature: Signature(999, 8), round_number: 1, proposal: Candidate(999), + digest: Digest(999), })).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); @@ -553,6 +589,7 @@ mod tests { digest_signature: Signature(999, 8), round_number: 1, proposal: Candidate(999), + digest: Digest(999), })).unwrap(); assert_eq!(accumulator.state(), &State::Proposed(Candidate(999))); @@ -710,4 +747,30 @@ mod tests { } } + + #[test] + fn double_propose_is_misbehavior() { + let mut accumulator = Accumulator::::new(1, 7, AuthorityId(8)); + assert_eq!(accumulator.state(), &State::Begin); + + accumulator.import_message(LocalizedMessage::Propose(LocalizedProposal { + sender: AuthorityId(8), + full_signature: Signature(999, 8), + digest_signature: Signature(999, 8), + round_number: 1, + proposal: Candidate(999), + digest: Digest(999), + })).unwrap(); + + let res = accumulator.import_message(LocalizedMessage::Propose(LocalizedProposal { + sender: AuthorityId(8), + full_signature: Signature(500, 8), + digest_signature: Signature(500, 8), + round_number: 1, + proposal: Candidate(500), + digest: Digest(500), + })); + + assert!(res.is_err()); + } } diff --git a/substrate/bft/src/generic/mod.rs b/substrate/bft/src/generic/mod.rs index d2aa3e5ab5c50..aa0fe2c549a3f 100644 --- a/substrate/bft/src/generic/mod.rs +++ b/substrate/bft/src/generic/mod.rs @@ -73,11 +73,13 @@ impl From> for Message { /// A localized proposal message. Contains two signed pieces of data. #[derive(Debug, Clone)] -pub struct LocalizedProposal { +pub struct LocalizedProposal { /// The round number. pub round_number: usize, /// The proposal sent. pub proposal: C, + /// The digest of the proposal. + pub digest: D, /// The sender of the proposal pub sender: V, /// The signature on the message (propose, round number, digest) @@ -101,7 +103,7 @@ pub struct LocalizedVote { #[derive(Debug, Clone)] pub enum LocalizedMessage { /// A proposal. - Propose(LocalizedProposal), + Propose(LocalizedProposal), /// A vote. Vote(LocalizedVote), } diff --git a/substrate/bft/src/generic/tests.rs b/substrate/bft/src/generic/tests.rs index 3c6c7a053dfdb..349bec693f95d 100644 --- a/substrate/bft/src/generic/tests.rs +++ b/substrate/bft/src/generic/tests.rs @@ -195,6 +195,7 @@ impl Context for TestContext { match message { Message::Propose(r, proposal) => LocalizedMessage::Propose(LocalizedProposal { round_number: r, + digest: Digest(proposal.0), proposal, digest_signature: signature.clone(), full_signature: signature, diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index ec814ddf64dc7..f9d870799d38c 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -455,12 +455,14 @@ pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: HeaderHa match message { ::generic::Message::Propose(r, proposal) => { - let action_header = PrimitiveAction::ProposeHeader(r as u32, proposal.header.hash()); + let header_hash = proposal.header.hash(); + let action_header = PrimitiveAction::ProposeHeader(r as u32, header_hash.clone()); let action_propose = PrimitiveAction::Propose(r as u32, proposal.clone()); ::generic::LocalizedMessage::Propose(::generic::LocalizedProposal { round_number: r, proposal, + digest: header_hash, sender: signer.0, digest_signature: sign_action(action_header), full_signature: sign_action(action_propose), From 497edcb12822ef2019d1af2f5076c22f8fbc5212 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 4 Mar 2018 14:03:42 +0100 Subject: [PATCH 19/20] fix fallout --- polkadot/consensus/src/lib.rs | 2 ++ substrate/client/src/client.rs | 11 ++++++++--- substrate/misbehavior-check/src/lib.rs | 24 +++++++++++++++--------- substrate/network/src/test/mod.rs | 11 ++++++++--- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/polkadot/consensus/src/lib.rs b/polkadot/consensus/src/lib.rs index de4b114e04770..a5c34e30ee406 100644 --- a/polkadot/consensus/src/lib.rs +++ b/polkadot/consensus/src/lib.rs @@ -602,6 +602,8 @@ impl bft::Proposer for Proposer { parent_number: self.parent_number, target, misbehavior: match misbehavior { + GenericMisbehavior::ProposeOutOfTurn(_, _, _) => continue, + GenericMisbehavior::DoublePropose(_, _, _) => continue, GenericMisbehavior::DoublePrepare(round, (h1, s1), (h2, s2)) => MisbehaviorKind::BftDoublePrepare(round as u32, (h1, s1.signature), (h2, s2.signature)), GenericMisbehavior::DoubleCommit(round, (h1, s1), (h2, s2)) diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 3ccc9debff5b4..402a67ef2a776 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -393,11 +393,16 @@ mod tests { bft::UncheckedJustification { digest: hash, signatures: authorities.iter().map(|key| { - bft::sign_message( - bft::generic::Message::Commit(1, hash), + let msg = bft::sign_message( + bft::generic::Vote::Commit(1, hash).into(), key, header.parent_hash - ).signature + ); + + match msg { + bft::generic::LocalizedMessage::Vote(vote) => vote.signature, + _ => panic!("signing vote leads to signed vote"), + } }).collect(), round_number: 1, } diff --git a/substrate/misbehavior-check/src/lib.rs b/substrate/misbehavior-check/src/lib.rs index fb353f088e2a9..71236ef457ee6 100644 --- a/substrate/misbehavior-check/src/lib.rs +++ b/substrate/misbehavior-check/src/lib.rs @@ -80,28 +80,34 @@ pub fn evaluate_misbehavior( mod tests { use super::*; - use substrate_bft::generic::Message as GenericMessage; + use substrate_bft::generic; use keyring::ed25519; use keyring::Keyring; fn sign_prepare(key: &ed25519::Pair, round: u32, hash: HeaderHash, parent_hash: HeaderHash) -> (HeaderHash, Signature) { - let sig = substrate_bft::sign_message( - GenericMessage::Prepare(round as _, hash), + let msg = substrate_bft::sign_message( + generic::Message::Vote(generic::Vote::Prepare(round as _, hash)), key, parent_hash - ).signature.signature; + ); - (hash, sig) + match msg { + generic::LocalizedMessage::Vote(vote) => (hash, vote.signature.signature), + _ => panic!("signing vote leads to signed vote"), + } } fn sign_commit(key: &ed25519::Pair, round: u32, hash: HeaderHash, parent_hash: HeaderHash) -> (HeaderHash, Signature) { - let sig = substrate_bft::sign_message( - GenericMessage::Commit(round as _, hash), + let msg = substrate_bft::sign_message( + generic::Message::Vote(generic::Vote::Commit(round as _, hash)), key, parent_hash - ).signature.signature; + ); - (hash, sig) + match msg { + generic::LocalizedMessage::Vote(vote) => (hash, vote.signature.signature), + _ => panic!("signing vote leads to signed vote"), + } } #[test] diff --git a/substrate/network/src/test/mod.rs b/substrate/network/src/test/mod.rs index 4cddc1bf8af8e..8aac22f16ee7d 100644 --- a/substrate/network/src/test/mod.rs +++ b/substrate/network/src/test/mod.rs @@ -167,11 +167,16 @@ impl Peer { bft::UncheckedJustification { digest: hash, signatures: authorities.iter().map(|key| { - bft::sign_message( - bft::generic::Message::Commit(1, hash), + let msg = bft::sign_message( + bft::generic::Vote::Commit(1, hash).into(), key, header.parent_hash - ).signature + ); + + match msg { + bft::generic::LocalizedMessage::Vote(vote) => vote.signature, + _ => panic!("signing vote leads to signed vote"), + } }).collect(), round_number: 1, } From a4dca1cf9acac5bc0fe151115edb59435045c2a6 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 12 Mar 2018 13:50:55 +0100 Subject: [PATCH 20/20] restore balance/bondage types --- polkadot/runtime/src/runtime/staking.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/polkadot/runtime/src/runtime/staking.rs b/polkadot/runtime/src/runtime/staking.rs index f497ba3151887..f321c714a5f3f 100644 --- a/polkadot/runtime/src/runtime/staking.rs +++ b/polkadot/runtime/src/runtime/staking.rs @@ -21,10 +21,13 @@ use rstd::cell::RefCell; use runtime_io::print; use codec::KeyedVec; use runtime_support::{storage, StorageVec}; -use polkadot_primitives::{Balance, Bondage, BlockNumber, AccountId}; +use polkadot_primitives::{BlockNumber, AccountId}; use primitives::bft::{MisbehaviorReport, MisbehaviorKind}; use runtime::{system, session, governance, consensus}; +type Balance = u64; +type Bondage = u64; + struct IntentionStorageVec {} impl StorageVec for IntentionStorageVec { type Item = AccountId;