From 616716cb4be00f59482bcec4aa11c956f79ff824 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 11 Jan 2019 21:25:03 +0300 Subject: [PATCH] GRANDPA finality proof draft (#1268) * grandpa finality proof * prove GrandpaApi::grandpa_authorities using parent block + some docs * create justification when consensus data is changed * generate justifications periodically * test for ConsensusChanges --- substrate/core/client/src/genesis.rs | 2 +- .../finality-grandpa/primitives/src/lib.rs | 4 + .../finality-grandpa/src/finality_proof.rs | 428 ++++++++++++++++++ substrate/core/finality-grandpa/src/lib.rs | 212 +++++++-- substrate/core/finality-grandpa/src/tests.rs | 101 ++++- substrate/core/network/src/test/mod.rs | 17 +- substrate/core/rpc/src/author/tests.rs | 10 +- substrate/core/service/src/components.rs | 2 +- substrate/core/sr-primitives/src/traits.rs | 2 +- .../core/test-client/src/block_builder_ext.rs | 2 +- substrate/core/test-runtime/src/lib.rs | 28 +- substrate/core/test-runtime/src/system.rs | 49 +- .../substrate_test_runtime.compact.wasm | Bin 41787 -> 46028 bytes .../core/transaction-pool/graph/src/pool.rs | 9 +- substrate/core/transaction-pool/src/tests.rs | 27 +- substrate/node/cli/src/service.rs | 1 + .../release/node_runtime.compact.wasm | Bin 791790 -> 791154 bytes substrate/srml/consensus/src/lib.rs | 5 +- 18 files changed, 786 insertions(+), 113 deletions(-) create mode 100644 substrate/core/finality-grandpa/src/finality_proof.rs diff --git a/substrate/core/client/src/genesis.rs b/substrate/core/client/src/genesis.rs index d7d398a4e9..098c7a35e9 100644 --- a/substrate/core/client/src/genesis.rs +++ b/substrate/core/client/src/genesis.rs @@ -70,7 +70,7 @@ mod tests { let signature = Pair::from(Keyring::from_public(Public::from_raw(tx.from.to_fixed_bytes())).unwrap()) .sign(&tx.encode()).into(); - Extrinsic { transfer: tx, signature } + Extrinsic::Transfer(tx, signature) }).collect::>(); let extrinsics_root = ordered_trie_root::(transactions.iter().map(Encode::encode)).into(); diff --git a/substrate/core/finality-grandpa/primitives/src/lib.rs b/substrate/core/finality-grandpa/primitives/src/lib.rs index 15e4a027f6..8776c262a0 100644 --- a/substrate/core/finality-grandpa/primitives/src/lib.rs +++ b/substrate/core/finality-grandpa/primitives/src/lib.rs @@ -97,6 +97,10 @@ decl_runtime_apis! { /// Get the current GRANDPA authorities and weights. This should not change except /// for when changes are scheduled and the corresponding delay has passed. + /// + /// When called at block B, it will return the set of authorities that should be + /// used to finalize descendants of this block (B+1, B+2, ...). The block B itself + /// is finalized by the authorities from block B-1. fn grandpa_authorities() -> Vec<(Ed25519AuthorityId, u64)>; } } diff --git a/substrate/core/finality-grandpa/src/finality_proof.rs b/substrate/core/finality-grandpa/src/finality_proof.rs new file mode 100644 index 0000000000..c927aa68a0 --- /dev/null +++ b/substrate/core/finality-grandpa/src/finality_proof.rs @@ -0,0 +1,428 @@ +// Copyright 2018 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! GRANDPA block finality proof generation and check. +//! +//! Finality of block B is proved by providing: +//! 1) valid headers sub-chain from the block B to the block F; +//! 2) valid (with respect to proved authorities) GRANDPA justification of the block F; +//! 3) proof-of-execution of the `grandpa_authorities` call at the block F. +//! +//! Since earliest possible justification is returned, the GRANDPA authorities set +//! at the block F is guaranteed to be the same as in the block B (this is because block +//! that enacts new GRANDPA authorities set always comes with justification). It also +//! means that the `set_id` is the same at blocks B and F. +//! +//! The caller should track the `set_id`. The most straightforward way is to fetch finality +//! proofs ONLY for blocks on the tip of the chain and track the latest known `set_id`. + +use std::collections::HashMap; + +use client::{ + blockchain::Backend as BlockchainBackend, + error::{Error as ClientError, ErrorKind as ClientErrorKind, Result as ClientResult}, + light::fetcher::RemoteCallRequest, +}; +use codec::{Encode, Decode}; +use grandpa::BlockNumberOps; +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::{ + NumberFor, Block as BlockT, Header as HeaderT, One, +}; +use substrate_primitives::{Ed25519AuthorityId, H256}; + +use GrandpaJustification; + +/// Prepare proof-of-finality for the given block. +/// +/// The proof is the serialized `FinalityProof` constructed using earliest known +/// justification of the block. None is returned if there's no known justification atm. +pub fn prove_finality( + blockchain: &B, + generate_execution_proof: G, + block: Block::Hash, +) -> ::client::error::Result>> + where + B: BlockchainBackend, + G: Fn(&BlockId, &str, &[u8]) -> ClientResult>>, +{ + let block_id = BlockId::Hash(block); + let mut block_number = blockchain.expect_block_number_from_id(&block_id)?; + + // early-return if we sure that the block isn't finalized yet + let info = blockchain.info()?; + if info.finalized_number < block_number { + return Ok(None); + } + + // early-return if we sure that the block is NOT a part of canonical chain + let canonical_block = blockchain.expect_block_hash_from_id(&BlockId::Number(block_number))?; + if block != canonical_block { + return Err(ClientErrorKind::Backend( + "Cannot generate finality proof for non-canonical block".into() + ).into()); + } + + // now that we know that the block is finalized, we can generate finalization proof + + // we need to prove grandpa authorities set that has generated justification + // BUT since `GrandpaApi::grandpa_authorities` call returns the set that becames actual + // at the next block, the proof-of execution is generated using parent block' state + // (this will fail if we're trying to prove genesis finality, but such the call itself is redundant) + let mut current_header = blockchain.expect_header(BlockId::Hash(block))?; + let parent_block_id = BlockId::Hash(*current_header.parent_hash()); + let authorities_proof = generate_execution_proof( + &parent_block_id, + "GrandpaApi_grandpa_authorities", + &[], + )?; + + // search for earliest post-block (inclusive) justification + let mut finalization_path = Vec::new(); + loop { + finalization_path.push(current_header); + + match blockchain.justification(BlockId::Number(block_number))? { + Some(justification) => return Ok(Some(FinalityProof { + finalization_path, + justification, + authorities_proof, + }.encode())), + None if block_number == info.finalized_number => break, + None => { + block_number = block_number + One::one(); + current_header = blockchain.expect_header(BlockId::Number(block_number))?; + }, + } + } + + Err(ClientErrorKind::Backend( + "cannot find justification for finalized block".into() + ).into()) +} + +/// Check proof-of-finality for the given block. +/// +/// Returns the vector of headers (including `block` header, ordered by ASC block number) that MUST be +/// validated + imported at once (i.e. within single db transaction). If at least one of those headers +/// is invalid, all other MUST be considered invalid. +pub fn check_finality_proof, C>( + check_execution_proof: C, + parent_header: Block::Header, + block: (NumberFor, Block::Hash), + set_id: u64, + remote_proof: Vec, +) -> ClientResult> + where + NumberFor: grandpa::BlockNumberOps, + C: Fn(&RemoteCallRequest) -> ClientResult>, +{ + do_check_finality_proof::>( + check_execution_proof, + parent_header, + block, + set_id, + remote_proof, + ) +} + +/// Check proof-of-finality using given justification type. +fn do_check_finality_proof, C, J>( + check_execution_proof: C, + parent_header: Block::Header, + block: (NumberFor, Block::Hash), + set_id: u64, + remote_proof: Vec, +) -> ClientResult> + where + NumberFor: grandpa::BlockNumberOps, + C: Fn(&RemoteCallRequest) -> ClientResult>, + J: ProvableJustification, +{ + // decode finality proof + let proof = FinalityProof::::decode(&mut &remote_proof[..]) + .ok_or_else(|| ClientErrorKind::BadJustification("failed to decode finality proof".into()))?; + + // check that the first header in finalization path is the block itself + { + let finalized_header = proof.finalization_path.first() + .ok_or_else(|| ClientError::from(ClientErrorKind::BadJustification( + "finality proof: finalized path is empty".into() + )))?; + if *finalized_header.number() != block.0 || finalized_header.hash() != block.1 { + return Err(ClientErrorKind::BadJustification( + "finality proof: block is not a part of finalized path".into() + ).into()); + } + } + + // check that the last header in finalization path is the jsutification target block + let just_block = proof.justification.target_block(); + { + let finalized_header = proof.finalization_path.last() + .expect("checked above that proof.finalization_path is not empty; qed"); + if *finalized_header.number() != just_block.0 || finalized_header.hash() != just_block.1 { + return Err(ClientErrorKind::BadJustification( + "finality proof: target jsutification block is not a part of finalized path".into() + ).into()); + } + } + + // check authorities set proof && get grandpa authorities that should have signed justification + let grandpa_authorities = check_execution_proof(&RemoteCallRequest { + block: just_block.1, + header: parent_header, + method: "GrandpaApi_grandpa_authorities".into(), + call_data: vec![], + retry_count: None, + })?; + let grandpa_authorities: Vec<(Ed25519AuthorityId, u64)> = Decode::decode(&mut &grandpa_authorities[..]) + .ok_or_else(|| ClientErrorKind::BadJustification("failed to decode GRANDPA authorities set proof".into()))?; + + // and now check justification + proof.justification.verify(set_id, &grandpa_authorities.into_iter().collect())?; + + Ok(proof.finalization_path) +} + +/// Proof of finality. +/// +/// Finality of block B is proved by providing: +/// 1) valid headers sub-chain from the block B to the block F; +/// 2) proof of `GrandpaApi::grandpa_authorities()` call at the block F; +/// 3) valid (with respect to proved authorities) GRANDPA justification of the block F. +#[derive(Debug, PartialEq, Encode, Decode)] +struct FinalityProof { + /// Headers-path (ordered by block number, ascending) from the block we're gathering proof for + /// (inclusive) to the target block of the justification (inclusive). + pub finalization_path: Vec
, + /// Justification (finalization) of the last block from the `finalization_path`. + pub justification: Justification, + /// Proof of `GrandpaApi::grandpa_authorities` call execution at the + /// justification' target block. + pub authorities_proof: Vec>, +} + +/// Justification used to prove block finality. +trait ProvableJustification: Encode + Decode { + /// Get target block of this justification. + fn target_block(&self) -> (Header::Number, Header::Hash); + + /// Verify justification with respect to authorities set and authorities set id. + fn verify(&self, set_id: u64, authorities: &HashMap) -> ClientResult<()>; +} + +impl> ProvableJustification for GrandpaJustification + where + NumberFor: BlockNumberOps, +{ + fn target_block(&self) -> (NumberFor, Block::Hash) { + (self.commit.target_number, self.commit.target_hash) + } + + fn verify(&self, set_id: u64, authorities: &HashMap) -> ClientResult<()> { + GrandpaJustification::verify(self, set_id, authorities) + } +} + +#[cfg(test)] +mod tests { + use test_client::runtime::{Block, Header}; + use test_client::client::backend::NewBlockState; + use test_client::client::in_mem::Blockchain as InMemoryBlockchain; + use super::*; + + type FinalityProof = super::FinalityProof>; + + #[derive(Encode, Decode)] + struct ValidFinalityProof(Vec); + + impl ProvableJustification
for ValidFinalityProof { + fn target_block(&self) -> (u64, H256) { (3, header(3).hash()) } + + fn verify(&self, set_id: u64, authorities: &HashMap) -> ClientResult<()> { + assert_eq!(set_id, 1); + assert_eq!(authorities, &vec![ + (Ed25519AuthorityId([1u8; 32]), 1), + (Ed25519AuthorityId([2u8; 32]), 2), + (Ed25519AuthorityId([3u8; 32]), 3), + ].into_iter().collect()); + Ok(()) + } + } + + fn header(number: u64) -> Header { + let parent_hash = match number { + 0 => Default::default(), + _ => header(number - 1).hash(), + }; + Header::new(number, 0.into(), 0.into(), parent_hash, Default::default()) + } + + fn side_header(number: u64) -> Header { + Header::new(number, 0.into(), 1.into(), header(number - 1).hash(), Default::default()) + } + + fn test_blockchain() -> InMemoryBlockchain { + let blockchain = InMemoryBlockchain::::new(); + blockchain.insert(header(0).hash(), header(0), Some(vec![0]), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(1).hash(), header(1), Some(vec![1]), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(2).hash(), header(2), None, None, NewBlockState::Best).unwrap(); + blockchain.insert(header(3).hash(), header(3), Some(vec![3]), None, NewBlockState::Final).unwrap(); + blockchain + } + + #[test] + fn finality_proof_is_not_generated_for_non_final_block() { + let blockchain = test_blockchain(); + blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Best).unwrap(); + + // when asking for finality of block 4, None is returned + let proof_of_4 = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(4).hash()) + .unwrap(); + assert_eq!(proof_of_4, None); + } + + #[test] + fn finality_proof_fails_for_non_canonical_block() { + let blockchain = test_blockchain(); + blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Best).unwrap(); + blockchain.insert(side_header(4).hash(), side_header(4), None, None, NewBlockState::Best).unwrap(); + blockchain.insert(header(5).hash(), header(5), Some(vec![5]), None, NewBlockState::Final).unwrap(); + + // when asking for finality of side-block 42, None is returned + let proof_of_side_4_fails = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), 42.into()).is_err(); + assert_eq!(proof_of_side_4_fails, true); + } + + #[test] + fn finality_proof_fails_if_no_justification_known() { + let blockchain = test_blockchain(); + blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Final).unwrap(); + + // when asking for finality of block 4, search for justification failing + let proof_of_4_fails = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), 42.into()).is_err(); + assert_eq!(proof_of_4_fails, true); + } + + #[test] + fn prove_finality_is_generated() { + let blockchain = test_blockchain(); + + // when asking for finality of block 2, justification of 3 is returned + let proof_of_2: FinalityProof = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(2).hash()) + .unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); + assert_eq!(proof_of_2, FinalityProof { + finalization_path: vec![header(2), header(3)], + justification: vec![3], + authorities_proof: vec![vec![42]], + }); + + // when asking for finality of block 3, justification of 3 is returned + let proof_of_3: FinalityProof = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(3).hash()) + .unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); + assert_eq!(proof_of_3, FinalityProof { + finalization_path: vec![header(3)], + justification: vec![3], + authorities_proof: vec![vec![42]], + }); + } + + #[test] + fn finality_proof_check_fails_when_block_is_not_included() { + let mut proof_of_2: FinalityProof = prove_finality( + &test_blockchain(), + |_, _, _| Ok(vec![vec![42]]), + header(2).hash(), + ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); + proof_of_2.finalization_path.remove(0); + + // block for which we're trying to request finality proof is missing from finalization_path + assert_eq!(do_check_finality_proof::( + |_| Ok(Vec::::new().encode()), + header(1), + (2, header(2).hash()), + 1, + proof_of_2.encode(), + ).is_err(), true); + } + + #[test] + fn finality_proof_check_fails_when_justified_block_is_not_included() { + let mut proof_of_2: FinalityProof = prove_finality( + &test_blockchain(), + |_, _, _| Ok(vec![vec![42]]), + header(2).hash(), + ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); + proof_of_2.finalization_path.remove(1); + + // justified block is missing from finalization_path + assert_eq!(do_check_finality_proof::( + |_| Ok(Vec::::new().encode()), + header(1), + (2, header(2).hash()), + 1, + proof_of_2.encode(), + ).is_err(), true); + } + + #[test] + fn finality_proof_check_fails_when_justification_verification_fails() { + #[derive(Encode, Decode)] + struct InvalidFinalityProof(Vec); + + impl ProvableJustification
for InvalidFinalityProof { + fn target_block(&self) -> (u64, H256) { (3, header(3).hash()) } + + fn verify(&self, _set_id: u64, _authorities: &HashMap) -> ClientResult<()> { + Err(ClientErrorKind::Backend("test error".into()).into()) + } + } + + let mut proof_of_2: FinalityProof = prove_finality( + &test_blockchain(), + |_, _, _| Ok(vec![vec![42]]), + header(2).hash(), + ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); + proof_of_2.finalization_path.remove(1); + + // justification is not valid + assert_eq!(do_check_finality_proof::( + |_| Ok(Vec::::new().encode()), + header(1), + (2, header(2).hash()), + 1, + proof_of_2.encode(), + ).is_err(), true); + } + + #[test] + fn finality_proof_check_works() { + let proof_of_2 = prove_finality(&test_blockchain(), |_, _, _| Ok(vec![vec![42]]), header(2).hash()) + .unwrap().unwrap(); + assert_eq!(do_check_finality_proof::( + |_| Ok(vec![ + (Ed25519AuthorityId([1u8; 32]), 1u64), + (Ed25519AuthorityId([2u8; 32]), 2u64), + (Ed25519AuthorityId([3u8; 32]), 3u64), + ].encode()), + header(1), + (2, header(2).hash()), + 1, + proof_of_2, + ).unwrap(), vec![header(2), header(3)]); + } +} diff --git a/substrate/core/finality-grandpa/src/lib.rs b/substrate/core/finality-grandpa/src/lib.rs index 00ea6734af..aacee8fe7d 100644 --- a/substrate/core/finality-grandpa/src/lib.rs +++ b/substrate/core/finality-grandpa/src/lib.rs @@ -92,7 +92,7 @@ use codec::{Encode, Decode}; use consensus_common::{BlockImport, Error as ConsensusError, ErrorKind as ConsensusErrorKind, ImportBlock, ImportResult, Authorities}; use runtime_primitives::traits::{ NumberFor, Block as BlockT, Header as HeaderT, DigestFor, ProvideRuntimeApi, Hash as HashT, - DigestItemFor, DigestItem, + DigestItemFor, DigestItem, As, Zero, }; use fg_primitives::GrandpaApi; use runtime_primitives::generic::BlockId; @@ -116,6 +116,7 @@ pub use fg_primitives::ScheduledChange; mod authorities; mod communication; +mod finality_proof; mod until_imported; #[cfg(feature="service-integration")] @@ -123,11 +124,14 @@ mod service_integration; #[cfg(feature="service-integration")] pub use service_integration::{LinkHalfForService, BlockImportForService}; +pub use finality_proof::{prove_finality, check_finality_proof}; + #[cfg(test)] mod tests; const LAST_COMPLETED_KEY: &[u8] = b"grandpa_completed_round"; const AUTHORITY_SET_KEY: &[u8] = b"grandpa_voters"; +const CONSENSUS_CHANGES_KEY: &[u8] = b"grandpa_consensus_changes"; /// round-number, round-state type LastCompleted = (u64, RoundState); @@ -165,6 +169,10 @@ pub type CompactCommit = grandpa::CompactCommit< pub struct Config { /// The expected duration for a message to be gossiped across the network. pub gossip_duration: Duration, + /// Justification generation period (in blocks). GRANDPA will try to generate justifications + /// at least every justification_period blocks. There are some other events which might cause + /// justification generation. + pub justification_period: u64, /// The local signing key. pub local_key: Option>, /// Some local identifier of the voter. @@ -304,12 +312,65 @@ impl, RA> BlockStatus for Arc { + pending_changes: Vec<(N, H)>, +} + +impl ConsensusChanges { + /// Create empty consensus changes. + pub fn empty() -> Self { + ConsensusChanges { pending_changes: Vec::new(), } + } + + /// Note unfinalized change of consensus-related data. + pub fn note_change(&mut self, at: (N, H)) { + let idx = self.pending_changes + .binary_search_by_key(&at.0, |change| change.0) + .unwrap_or_else(|i| i); + self.pending_changes.insert(idx, at); + } + + /// Finalize all pending consensus changes that are finalized by given block. + /// Returns true if there any changes were finalized. + pub fn finalize ::client::error::Result>>( + &mut self, + block: (N, H), + canonical_at_height: F, + ) -> ::client::error::Result<(bool, bool)> { + let (split_idx, has_finalized_changes) = self.pending_changes.iter() + .enumerate() + .take_while(|(_, &(at_height, _))| at_height <= block.0) + .fold((None, Ok(false)), |(_, has_finalized_changes), (idx, ref at)| + ( + Some(idx), + has_finalized_changes + .and_then(|has_finalized_changes| if has_finalized_changes { + Ok(has_finalized_changes) + } else { + canonical_at_height(at.0).map(|can_hash| Some(at.1) == can_hash) + }), + )); + + let altered_changes = split_idx.is_some(); + if let Some(split_idx) = split_idx { + self.pending_changes = self.pending_changes.split_off(split_idx + 1); + } + has_finalized_changes.map(|has_finalized_changes| (altered_changes, has_finalized_changes)) + } +} + +/// Thread-safe consensus changes tracker reference. +type SharedConsensusChanges = Arc>>; + /// The environment we run GRANDPA in. struct Environment { inner: Arc>, voters: Arc>, config: Config, authority_set: SharedAuthoritySet>, + consensus_changes: SharedConsensusChanges>, network: N, set_id: u64, } @@ -515,7 +576,15 @@ impl, N, RA> voter::Environment, round: u64, commit: Commit) -> Result<(), Self::Error> { - finalize_block(&*self.inner, &self.authority_set, hash, number, (round, commit).into()) + finalize_block( + &*self.inner, + &self.authority_set, + &self.consensus_changes, + Some(As::sa(self.config.justification_period)), + hash, + number, + (round, commit).into(), + ) } fn round_commit_timer(&self) -> Self::Timer { @@ -615,21 +684,24 @@ impl> GrandpaJustification { voters: &HashMap, ) -> Result, ClientError> where NumberFor: grandpa::BlockNumberOps, + { + GrandpaJustification::::decode(&mut &*encoded).ok_or_else(|| { + let msg = "failed to decode grandpa justification".to_string(); + ClientErrorKind::BadJustification(msg).into() + }).and_then(|just| just.verify(set_id, voters).map(|_| just)) + } + + /// Validate the commit and the votes' ancestry proofs. + fn verify(&self, set_id: u64, voters: &HashMap) -> Result<(), ClientError> + where + NumberFor: grandpa::BlockNumberOps, { use grandpa::Chain; - let justification = match GrandpaJustification::decode(&mut &*encoded) { - Some(justification) => justification, - _ => { - let msg = "failed to decode grandpa justification".to_string(); - return Err(ClientErrorKind::BadJustification(msg).into()); - } - }; - - let ancestry_chain = AncestryChain::::new(&justification.votes_ancestries); + let ancestry_chain = AncestryChain::::new(&self.votes_ancestries); match grandpa::validate_commit( - &justification.commit, + &self.commit, voters, None, &ancestry_chain, @@ -642,23 +714,23 @@ impl> GrandpaJustification { } let mut visited_hashes = HashSet::new(); - for signed in justification.commit.precommits.iter() { + for signed in self.commit.precommits.iter() { if let Err(_) = communication::check_message_sig::( &grandpa::Message::Precommit(signed.precommit.clone()), &signed.id, &signed.signature, - justification.round, + self.round, set_id, ) { return Err(ClientErrorKind::BadJustification( "invalid signature for precommit in grandpa justification".to_string()).into()); } - if justification.commit.target_hash == signed.precommit.target_hash { + if self.commit.target_hash == signed.precommit.target_hash { continue; } - match ancestry_chain.ancestry(justification.commit.target_hash, signed.precommit.target_hash) { + match ancestry_chain.ancestry(self.commit.target_hash, signed.precommit.target_hash) { Ok(route) => { // ancestry starts from parent hash but the precommit target hash has been visited visited_hashes.insert(signed.precommit.target_hash); @@ -673,7 +745,7 @@ impl> GrandpaJustification { } } - let ancestry_hashes = justification.votes_ancestries + let ancestry_hashes = self.votes_ancestries .iter() .map(|h: &Block::Header| h.hash()) .collect(); @@ -683,7 +755,7 @@ impl> GrandpaJustification { "invalid precommit ancestries in grandpa justification with unused headers".to_string()).into()); } - Ok(justification) + Ok(()) } } @@ -710,6 +782,8 @@ impl From> for JustificationOrCommit< fn finalize_block, E, RA>( client: &Client, authority_set: &SharedAuthoritySet>, + consensus_changes: &SharedConsensusChanges>, + justification_period: Option>, hash: Block::Hash, number: NumberFor, justification_or_commit: JustificationOrCommit, @@ -720,6 +794,7 @@ fn finalize_block, E, RA>( { // lock must be held through writing to DB to avoid race let mut authority_set = authority_set.inner().write(); + let mut consensus_changes = consensus_changes.lock(); let status = authority_set.apply_changes(number, |canon_number| { canonical_at_height(client, (hash, number), canon_number) })?; @@ -756,6 +831,20 @@ fn finalize_block, E, RA>( } } + // check if this is this is the first finalization of some consensus changes + let (alters_consensus_changes, finalizes_consensus_changes) = consensus_changes + .finalize((number, hash), |at_height| canonical_at_height(client, (hash, number), at_height))?; + if alters_consensus_changes { + let encoded = consensus_changes.encode(); + let write_result = Backend::insert_aux(&**client.backend(), &[(CONSENSUS_CHANGES_KEY, &encoded[..])], &[]); + if let Err(e) = write_result { + warn!(target: "finality", "Failed to write updated consensus changes to disk. Bailing."); + warn!(target: "finality", "Node is in a potentially inconsistent state."); + + return Err(e.into()); + } + } + // NOTE: this code assumes that honest voters will never vote past a // transition block, thus we don't have to worry about the case where // we have a transition with `effective_block = N`, but we finalize @@ -764,8 +853,26 @@ fn finalize_block, E, RA>( // syncing clients. let justification = match justification_or_commit { JustificationOrCommit::Justification(justification) => Some(justification.encode()), - JustificationOrCommit::Commit((round_number, commit)) => - if status.new_set_block.is_some() { + JustificationOrCommit::Commit((round_number, commit)) => { + let mut justification_required = + // justification is always required when block that enacts new authorities + // set is finalized + status.new_set_block.is_some() || + // justification is required when consensus changes are finalized + finalizes_consensus_changes; + + // justification is required every N blocks to be able to prove blocks + // finalization to remote nodes + if !justification_required { + if let Some(justification_period) = justification_period { + let last_finalized_number = client.info()?.chain.finalized_number; + justification_required = (!last_finalized_number.is_zero() || + number - last_finalized_number == justification_period) && + (last_finalized_number / justification_period != number / justification_period); + } + } + + if justification_required { let justification = GrandpaJustification::from_commit( client, round_number, @@ -775,7 +882,8 @@ fn finalize_block, E, RA>( Some(justification.encode()) } else { None - }, + } + }, }; debug!(target: "afg", "Finalizing blocks up to ({:?}, {})", number, hash); @@ -822,6 +930,7 @@ pub struct GrandpaBlockImport, RA, PRA> { inner: Arc>, authority_set: SharedAuthoritySet>, authority_set_change: mpsc::UnboundedSender>>, + consensus_changes: SharedConsensusChanges>, api: Arc, } @@ -909,6 +1018,7 @@ impl, RA, PRA> BlockImport // we don't want to finalize on `inner.import_block` let justification = block.justification.take(); + let enacts_consensus_change = new_authorities.is_some(); let import_result = self.inner.import_block(block, new_authorities).map_err(|e| { if let Some((old_set, mut authorities)) = just_in_case { debug!(target: "afg", "Restoring old set after block import error: {:?}", e); @@ -918,22 +1028,17 @@ impl, RA, PRA> BlockImport }); let import_result = match import_result { - Ok(ImportResult::Queued) => ImportResult::Queued, - Ok(r) => return Ok(r), - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Ok(ImportResult::Queued) => ImportResult::Queued, + Ok(r) => return Ok(r), + Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), }; let enacts_change = self.authority_set.inner().read().enacts_change(number, |canon_number| { canonical_at_height(&self.inner, (hash, number), canon_number) - }); + }).map_err(|e| ConsensusError::from(ConsensusErrorKind::ClientImport(e.to_string())))?; - match enacts_change { - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), - Ok(enacted) => { - if !enacted { - return Ok(import_result); - } - } + if !enacts_change && !enacts_consensus_change { + return Ok(import_result); } match justification { @@ -952,6 +1057,8 @@ impl, RA, PRA> BlockImport let result = finalize_block( &*self.inner, &self.authority_set, + &self.consensus_changes, + None, hash, number, justification.into(), @@ -959,11 +1066,14 @@ impl, RA, PRA> BlockImport match result { Ok(_) => { - unreachable!("returns Ok when no authority set change should be enacted; \ - verified previously that finalizing the current block enacts a change; \ - qed;"); + assert!(!enacts_change, "returns Ok when no authority set change should be enacted; qed;"); }, Err(ExitOrError::AuthoritiesChanged(new)) => { + assert!( + enacts_change, + "returns AuthoritiesChanged when authority set change should be enacted; qed;" + ); + debug!(target: "finality", "Imported justified block #{} that enacts authority set change, signalling voter.", number); if let Err(e) = self.authority_set_change.unbounded_send(new) { return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()); @@ -981,8 +1091,20 @@ impl, RA, PRA> BlockImport } }, None => { - trace!(target: "finality", "Imported unjustified block #{} that enacts authority set change, waiting for finality for enactment.", number); - } + if enacts_change { + trace!( + target: "finality", + "Imported unjustified block #{} that enacts authority set change, waiting for finality for enactment.", + number, + ); + } + + // we have imported block with consensus data changes, but without justification + // => remember to create justification when next block will be finalized + if enacts_consensus_change { + self.consensus_changes.lock().note_change((number, hash)); + } + }, } Ok(import_result) @@ -1060,6 +1182,7 @@ pub struct LinkHalf, RA> { client: Arc>, authority_set: SharedAuthoritySet>, authority_set_change: mpsc::UnboundedReceiver>>, + consensus_changes: SharedConsensusChanges>, } struct AncestryChain { @@ -1142,6 +1265,15 @@ pub fn block_import, RA, PRA>( .into(), }; + let consensus_changes = Backend::get_aux(&**client.backend(), CONSENSUS_CHANGES_KEY)?; + let consensus_changes = Arc::new(parking_lot::Mutex::new(match consensus_changes { + Some(raw) => ConsensusChanges::decode(&mut &raw[..]) + .ok_or_else(|| ::client::error::ErrorKind::Backend( + format!("GRANDPA consensus changes kept in invalid format") + ))?, + None => ConsensusChanges::empty(), + })); + let (authority_set_change_tx, authority_set_change_rx) = mpsc::unbounded(); Ok(( @@ -1149,12 +1281,14 @@ pub fn block_import, RA, PRA>( inner: client.clone(), authority_set: authority_set.clone(), authority_set_change: authority_set_change_tx, + consensus_changes: consensus_changes.clone(), api }, LinkHalf { client, authority_set, authority_set_change: authority_set_change_rx, + consensus_changes, }, )) } @@ -1231,6 +1365,7 @@ pub fn run_grandpa, N, RA>( client, authority_set, authority_set_change, + consensus_changes, } = link; let chain_info = client.info()?; @@ -1253,6 +1388,7 @@ pub fn run_grandpa, N, RA>( network: network.clone(), set_id: authority_set.set_id(), authority_set: authority_set.clone(), + consensus_changes: consensus_changes.clone(), }); let initial_state = (initial_environment, last_round_number, last_state, authority_set_change.into_future()); @@ -1291,6 +1427,7 @@ pub fn run_grandpa, N, RA>( let config = config.clone(); let network = network.clone(); let authority_set = authority_set.clone(); + let consensus_changes = consensus_changes.clone(); let trigger_authority_set_change = |new: NewAuthoritySet<_, _>, authority_set_change| { let env = Arc::new(Environment { @@ -1300,6 +1437,7 @@ pub fn run_grandpa, N, RA>( set_id: new.set_id, network, authority_set, + consensus_changes, }); // start the new authority set using the block where the diff --git a/substrate/core/finality-grandpa/src/tests.rs b/substrate/core/finality-grandpa/src/tests.rs index 18bfaef1a5..39924263ad 100644 --- a/substrate/core/finality-grandpa/src/tests.rs +++ b/substrate/core/finality-grandpa/src/tests.rs @@ -25,6 +25,7 @@ use tokio::runtime::current_thread; use keyring::Keyring; use client::{ BlockchainEvents, error::Result, + blockchain::Backend as BlockchainBackend, runtime_api::{Core, RuntimeVersion, ApiExt, ConstructRuntimeApi, CallRuntimeAt}, }; use test_client::{self, runtime::BlockNumber}; @@ -332,22 +333,7 @@ fn make_ids(keys: &[Keyring]) -> Vec<(Ed25519AuthorityId, u64)> { .collect() } -#[test] -fn finalize_3_voters_no_observers() { - let peers = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; - let voters = make_ids(peers); - - let mut net = GrandpaTestNet::new(TestApi::new(voters), 3); - net.peer(0).push_blocks(20, false); - net.sync(); - - for i in 0..3 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 20, - "Peer #{} failed to sync", i); - } - - let net = Arc::new(Mutex::new(net)); - +fn run_to_completion(blocks: u64, net: Arc>, peers: &[Keyring]) { let mut finality_notifications = Vec::new(); let mut runtime = current_thread::Runtime::new().unwrap(); @@ -363,7 +349,7 @@ fn finalize_3_voters_no_observers() { }; finality_notifications.push( client.finality_notification_stream() - .take_while(|n| Ok(n.header.number() < &20)) + .take_while(|n| Ok(n.header.number() < &blocks)) .for_each(|_| Ok(())) ); fn assert_send(_: &T) { } @@ -371,6 +357,7 @@ fn finalize_3_voters_no_observers() { let voter = run_grandpa( Config { gossip_duration: TEST_GOSSIP_DURATION, + justification_period: 32, local_key: Some(Arc::new(key.clone().into())), name: Some(format!("peer#{}", peer_id)), }, @@ -397,6 +384,28 @@ fn finalize_3_voters_no_observers() { runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); } +#[test] +fn finalize_3_voters_no_observers() { + let peers = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; + let voters = make_ids(peers); + + let mut net = GrandpaTestNet::new(TestApi::new(voters), 3); + net.peer(0).push_blocks(20, false); + net.sync(); + + for i in 0..3 { + assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 20, + "Peer #{} failed to sync", i); + } + + let net = Arc::new(Mutex::new(net)); + run_to_completion(20, net.clone(), peers); + + // normally there's no justification for finalized blocks + assert!(net.lock().peer(0).client().backend().blockchain().justification(BlockId::Number(20)).unwrap().is_none(), + "Extra justification for block#1"); +} + #[test] fn finalize_3_voters_1_observer() { let peers = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; @@ -432,6 +441,7 @@ fn finalize_3_voters_1_observer() { let voter = run_grandpa( Config { gossip_duration: TEST_GOSSIP_DURATION, + justification_period: 32, local_key, name: Some(format!("peer#{}", peer_id)), }, @@ -589,6 +599,7 @@ fn transition_3_voters_twice_1_observer() { let voter = run_grandpa( Config { gossip_duration: TEST_GOSSIP_DURATION, + justification_period: 32, local_key, name: Some(format!("peer#{}", peer_id)), }, @@ -616,3 +627,59 @@ fn transition_3_voters_twice_1_observer() { runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); } + +#[test] +fn justification_is_emitted_when_consensus_data_changes() { + let peers = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; + let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 3); + + // import block#1 WITH consensus data change + let new_authorities = vec![Ed25519AuthorityId::from([42; 32])]; + net.peer(0).push_authorities_change_block(new_authorities); + net.sync(); + let net = Arc::new(Mutex::new(net)); + run_to_completion(1, net.clone(), peers); + + // ... and check that there's no justification for block#1 + assert!(net.lock().peer(0).client().backend().blockchain().justification(BlockId::Number(1)).unwrap().is_some(), + "Missing justification for block#1"); +} + +#[test] +fn justification_is_generated_periodically() { + let peers = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; + let voters = make_ids(peers); + + let mut net = GrandpaTestNet::new(TestApi::new(voters), 3); + net.peer(0).push_blocks(32, false); + net.sync(); + + let net = Arc::new(Mutex::new(net)); + run_to_completion(32, net.clone(), peers); + + // when block#32 (justification_period) is finalized, justification + // is required => generated + for i in 0..3 { + assert!(net.lock().peer(i).client().backend().blockchain() + .justification(BlockId::Number(32)).unwrap().is_some()); + } +} + +#[test] +fn consensus_changes_works() { + let mut changes = ConsensusChanges::::empty(); + + // pending changes are not finalized + changes.note_change((10, 1.into())); + assert_eq!(changes.finalize((5, 5.into()), |_| Ok(None)).unwrap(), (false, false)); + + // no change is selected from competing pending changes + changes.note_change((1, 1.into())); + changes.note_change((1, 101.into())); + assert_eq!(changes.finalize((10, 10.into()), |_| Ok(Some(1001.into()))).unwrap(), (true, false)); + + // change is selected from competing pending changes + changes.note_change((1, 1.into())); + changes.note_change((1, 101.into())); + assert_eq!(changes.finalize((10, 10.into()), |_| Ok(Some(1.into()))).unwrap(), (true, true)); +} \ No newline at end of file diff --git a/substrate/core/network/src/test/mod.rs b/substrate/core/network/src/test/mod.rs index 48b401b21a..9523816015 100644 --- a/substrate/core/network/src/test/mod.rs +++ b/substrate/core/network/src/test/mod.rs @@ -27,9 +27,10 @@ use std::sync::Arc; use parking_lot::RwLock; use client; use client::block_builder::BlockBuilder; +use primitives::Ed25519AuthorityId; use runtime_primitives::Justification; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Zero, AuthorityIdFor}; +use runtime_primitives::traits::{Block as BlockT, Zero, Header, Digest, DigestItem, AuthorityIdFor}; use io::SyncIo; use protocol::{Context, Protocol, ProtocolContext}; use config::ProtocolConfig; @@ -92,6 +93,9 @@ impl Verifier for PassThroughVerifier { justification: Option, body: Option> ) -> Result<(ImportBlock, Option>>), String> { + let new_authorities = header.digest().log(DigestItem::as_authorities_change) + .map(|auth| auth.iter().cloned().collect()); + Ok((ImportBlock { origin, header, @@ -101,7 +105,7 @@ impl Verifier for PassThroughVerifier { post_digests: vec![], auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, - }, None)) + }, new_authorities)) } } @@ -414,7 +418,7 @@ impl, D> Peer { nonce, }; let signature = Keyring::from_raw_public(transfer.from.to_fixed_bytes()).unwrap().sign(&transfer.encode()).into(); - builder.push(Extrinsic { transfer, signature }).unwrap(); + builder.push(Extrinsic::Transfer(transfer, signature)).unwrap(); nonce = nonce + 1; builder.bake().unwrap() }); @@ -423,6 +427,13 @@ impl, D> Peer { } } + pub fn push_authorities_change_block(&self, new_authorities: Vec) { + self.generate_blocks(1, BlockOrigin::File, |mut builder| { + builder.push(Extrinsic::AuthoritiesChange(new_authorities.clone())).unwrap(); + builder.bake().unwrap() + }); + } + /// Execute a function with specialization for this peer. pub fn with_spec(&self, f: F) -> U where F: FnOnce(&mut DummySpecialization, &mut Context) -> U diff --git a/substrate/core/rpc/src/author/tests.rs b/substrate/core/rpc/src/author/tests.rs index 82f5d37162..d84fa72225 100644 --- a/substrate/core/rpc/src/author/tests.rs +++ b/substrate/core/rpc/src/author/tests.rs @@ -36,7 +36,7 @@ fn uxt(sender: Keyring, nonce: u64) -> Extrinsic { to: Default::default(), }; let signature = Keyring::from_raw_public(tx.from.to_fixed_bytes()).unwrap().sign(&tx.encode()).into(); - Extrinsic { transfer: tx, signature } + Extrinsic::Transfer(tx, signature) } #[test] @@ -48,7 +48,7 @@ fn submit_transaction_should_not_cause_error() { pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client))), subscriptions: Subscriptions::new(runtime.executor()), }; - let h: H256 = hex!("e10ad66bce51ef3e2a1167934ce3740d2d8c703810f9b314e89f2e783f75e826").into(); + let h: H256 = hex!("81897a4890fb7554e7f77c533a865846a11583a56a8ad5e307543188d55e64f1").into(); assert_matches!( AuthorApi::submit_extrinsic(&p, uxt(Keyring::Alice, 1).encode().into()), @@ -68,7 +68,7 @@ fn submit_rich_transaction_should_not_cause_error() { pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))), subscriptions: Subscriptions::new(runtime.executor()), }; - let h: H256 = hex!("fccc48291473c53746cd267cf848449edd7711ee6511fba96919d5f9f4859e4f").into(); + let h: H256 = hex!("9ec8469b5dcfe29cc274ac1d07ad73d80be57566ace0fcdbe51ebcf4b51e925b").into(); assert_matches!( AuthorApi::submit_extrinsic(&p, uxt(Keyring::Alice, 0).encode().into()), @@ -106,7 +106,7 @@ fn should_watch_extrinsic() { to: Default::default(), }; let signature = Keyring::from_raw_public(tx.from.to_fixed_bytes()).unwrap().sign(&tx.encode()).into(); - Extrinsic { transfer: tx, signature } + Extrinsic::Transfer(tx, signature) }; AuthorApi::submit_extrinsic(&p, replacement.encode().into()).unwrap(); let (res, data) = runtime.block_on(data.into_future()).unwrap(); @@ -116,7 +116,7 @@ fn should_watch_extrinsic() { ); assert_eq!( runtime.block_on(data.into_future()).unwrap().0, - Some(r#"{"jsonrpc":"2.0","method":"test","params":{"result":{"usurped":"0xed454dcee51431679c2559403187a56567fded1fc50b6ae3aada87c1d412df5c"},"subscription":1}}"#.into()) + Some(r#"{"jsonrpc":"2.0","method":"test","params":{"result":{"usurped":"0x53daed816610aa6b22dedbcee43aba44a7ca7155cc71f2919c5e79ebbc7de58c"},"subscription":1}}"#.into()) ); } diff --git a/substrate/core/service/src/components.rs b/substrate/core/service/src/components.rs index 397e3d7a89..dc116873b6 100644 --- a/substrate/core/service/src/components.rs +++ b/substrate/core/service/src/components.rs @@ -561,7 +561,7 @@ mod tests { to: Default::default(), }; let signature = Keyring::from_raw_public(transfer.from.to_fixed_bytes()).unwrap().sign(&transfer.encode()).into(); - Extrinsic { transfer, signature } + Extrinsic::Transfer(transfer, signature) }; // store the transaction in the pool pool.submit_one(&BlockId::hash(client.best_block_header().unwrap().hash()), transaction.clone()).unwrap(); diff --git a/substrate/core/sr-primitives/src/traits.rs b/substrate/core/sr-primitives/src/traits.rs index 67e441c792..ac15df0881 100644 --- a/substrate/core/sr-primitives/src/traits.rs +++ b/substrate/core/sr-primitives/src/traits.rs @@ -574,7 +574,7 @@ pub trait Digest: Member + MaybeSerializeDebugButNotDeserialize + Default { fn pop(&mut self) -> Option; /// Get reference to the first digest item that matches the passed predicate. - fn log Option<&T>>(&self, predicate: F) -> Option<&T> { + fn log Option<&T>>(&self, predicate: F) -> Option<&T> { self.logs().iter() .filter_map(predicate) .next() diff --git a/substrate/core/test-client/src/block_builder_ext.rs b/substrate/core/test-client/src/block_builder_ext.rs index 651559114a..5803c5303d 100644 --- a/substrate/core/test-client/src/block_builder_ext.rs +++ b/substrate/core/test-client/src/block_builder_ext.rs @@ -40,5 +40,5 @@ impl<'a, A> BlockBuilderExt for client::block_builder::BlockBuilder<'a, runtime: fn sign_tx(transfer: runtime::Transfer) -> runtime::Extrinsic { let signature = keyring::Keyring::from_raw_public(transfer.from.to_fixed_bytes()).unwrap().sign(&codec::Encode::encode(&transfer)).into(); - runtime::Extrinsic { transfer, signature } + runtime::Extrinsic::Transfer(transfer, signature) } diff --git a/substrate/core/test-runtime/src/lib.rs b/substrate/core/test-runtime/src/lib.rs index eb5efdf684..3d2e9b5ca8 100644 --- a/substrate/core/test-runtime/src/lib.rs +++ b/substrate/core/test-runtime/src/lib.rs @@ -104,9 +104,9 @@ pub struct Transfer { /// Extrinsic for test-runtime. #[derive(Clone, PartialEq, Eq, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug))] -pub struct Extrinsic { - pub transfer: Transfer, - pub signature: Ed25519Signature, +pub enum Extrinsic { + AuthoritiesChange(Vec), + Transfer(Transfer, Ed25519Signature), } #[cfg(feature = "std")] @@ -121,10 +121,15 @@ impl BlindCheckable for Extrinsic { type Checked = Self; fn check(self) -> Result { - if ::runtime_primitives::verify_encoded_lazy(&self.signature, &self.transfer, &self.transfer.from) { - Ok(self) - } else { - Err("bad signature") + match self { + Extrinsic::AuthoritiesChange(new_auth) => Ok(Extrinsic::AuthoritiesChange(new_auth)), + Extrinsic::Transfer(transfer, signature) => { + if ::runtime_primitives::verify_encoded_lazy(&signature, &transfer, &transfer.from) { + Ok(Extrinsic::Transfer(transfer, signature)) + } else { + Err("bad signature") + } + }, } } } @@ -135,6 +140,15 @@ impl ExtrinsicT for Extrinsic { } } +impl Extrinsic { + pub fn transfer(&self) -> &Transfer { + match self { + Extrinsic::Transfer(ref transfer, _) => transfer, + _ => panic!("cannot convert to transfer ref"), + } + } +} + /// An identifier for an account on this system. pub type AccountId = H256; /// A simple hash type for all our hashing. diff --git a/substrate/core/test-runtime/src/system.rs b/substrate/core/test-runtime/src/system.rs index 19739b21cb..d4559b1eb7 100644 --- a/substrate/core/test-runtime/src/system.rs +++ b/substrate/core/test-runtime/src/system.rs @@ -24,7 +24,7 @@ use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Digest as DigestT}; use runtime_primitives::generic; use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult, transaction_validity::TransactionValidity}; use codec::{KeyedVec, Encode}; -use super::{AccountId, BlockNumber, Extrinsic, H256 as Hash, Block, Header, Digest}; +use super::{AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest}; use primitives::{Ed25519AuthorityId, Blake2Hasher}; use primitives::storage::well_known_keys; @@ -36,6 +36,7 @@ storage_items! { // The current block number being processed. Set by `execute_block`. Number: b"sys:num" => required BlockNumber; ParentHash: b"sys:pha" => required Hash; + NewAuthorities: b"sys:new_auth" => Vec; } pub fn balance_of_key(who: AccountId) -> Vec { @@ -96,17 +97,20 @@ pub fn execute_block(block: Block) { if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into(), header.number - 1) { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); } + if let Some(new_authorities) = ::take() { + digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); + } assert!(digest == header.digest, "Header digest items must match that calculated."); } /// Execute a transaction outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { - let tx = match check_signature(&utx) { - Ok(tx) => tx, - Err(_) => return TransactionValidity::Invalid, - }; + if check_signature(&utx).is_err() { + return TransactionValidity::Invalid; + } + let tx = utx.transfer(); let nonce_key = tx.from.to_keyed_vec(NONCE_OF); let expected_nonce: u64 = storage::get_or(&nonce_key, 0); if tx.nonce < expected_nonce { @@ -166,6 +170,9 @@ pub fn finalise_block() -> Header { if let Some(storage_changes_root) = storage_changes_root { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root)); } + if let Some(new_authorities) = ::take() { + digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); + } Header { number, @@ -177,21 +184,21 @@ pub fn finalise_block() -> Header { } #[inline(always)] -fn check_signature(utx: &Extrinsic) -> Result<::Transfer, ApplyError> { +fn check_signature(utx: &Extrinsic) -> Result<(), ApplyError> { use runtime_primitives::traits::BlindCheckable; - - let utx = match utx.clone().check() { - Ok(tx) => tx, - Err(_) => return Err(ApplyError::BadSignature), - }; - - Ok(utx.transfer) + utx.clone().check().map_err(|_| ApplyError::BadSignature)?; + Ok(()) } fn execute_transaction_backend(utx: &Extrinsic) -> ApplyResult { - // check signature - let tx = check_signature(utx)?; + check_signature(utx)?; + match utx { + Extrinsic::Transfer(ref transfer, _) => execute_transfer_backend(transfer), + Extrinsic::AuthoritiesChange(ref new_auth) => execute_new_authorities_backend(new_auth), + } +} +fn execute_transfer_backend(tx: &Transfer) -> ApplyResult { // check nonce let nonce_key = tx.from.to_keyed_vec(NONCE_OF); let expected_nonce: u64 = storage::get_or(&nonce_key, 0); @@ -217,6 +224,12 @@ fn execute_transaction_backend(utx: &Extrinsic) -> ApplyResult { Ok(ApplyOutcome::Success) } +fn execute_new_authorities_backend(new_authorities: &[Ed25519AuthorityId]) -> ApplyResult { + let new_authorities: Vec = new_authorities.iter().cloned().collect(); + ::put(new_authorities); + Ok(ApplyOutcome::Success) +} + #[cfg(feature = "std")] fn info_expect_equal_hash(given: &Hash, expected: &Hash) { use primitives::hexdisplay::HexDisplay; @@ -266,7 +279,7 @@ mod tests { fn construct_signed_tx(tx: Transfer) -> Extrinsic { let signature = Keyring::from_raw_public(tx.from.to_fixed_bytes()).unwrap().sign(&tx.encode()).into(); - Extrinsic { transfer: tx, signature } + Extrinsic::Transfer(tx, signature) } fn block_import_works(block_executor: F) where F: Fn(Block, &mut TestExternalities) { @@ -318,7 +331,7 @@ mod tests { parent_hash: [69u8; 32].into(), number: 1, state_root: hex!("c3d2cc317b5897af4c7f65d76b028971ce9fad745678732ff6d42301b4245a9c").into(), - extrinsics_root: hex!("4e689a607609f69df099af82577ae6c5969c44f1afe33a43cd7af926eba42272").into(), + extrinsics_root: hex!("198205cb7729fec8ccdc2e58571a4858586a4f305898078e0e8bee1dddea7e4b").into(), digest: Digest { logs: vec![], }, }, extrinsics: vec![ @@ -343,7 +356,7 @@ mod tests { parent_hash: b.header.hash(), number: 2, state_root: hex!("2c822d948bb68d7f7a1976d4f827a276a95a3ba1c4c15dbfab3bafbeb85f2b4d").into(), - extrinsics_root: hex!("009268a854b21f339c53d3c7a6619a27f564703311d91f11f61573a7fed5ca1c").into(), + extrinsics_root: hex!("041fa8971dda28745967179a9f39e3ca1a595c510682105df1cff74ae6f05e0d").into(), digest: Digest { logs: vec![], }, }, extrinsics: vec![ diff --git a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 451cac0489f4632dad587a0e8fb8ecc07753ba98..3b32eaae5b4fceef8dc3368b0ffa18a0fd59d501 100644 GIT binary patch literal 46028 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 literal 41787 zcmeIbdvIjeecyQ>jqU~-4fH%n4mFf`(W1>6i^IXQ@!&|B3v&1{Es550U0TIiOrz15 z0R{uiG#VtwkvXu;V#cwYP`gT*PFxAA;#zX6%v!p#DJxalEu>cKC>z(Bn^GnG!`V!2 zv@UvAahQry%XL)Ie!jnR@9ob+`jC4p67pY z^n7^z`gQ;M`M~}y@SvvwU6W$(yp?+A{p)u7qRRCZB`>O!N6(|=MM~7niz<6D_`5+h zY;Qhyxcx$Rsl75eGcz&2^jy2MwtCGA^x~*qTxfTfw!2%M=7sjs+Gcml3-xM5udZ|` zSla2X&UpnDR(pjP+b_7XQI&1?+VBQc^N>ng8|`K%ZQIqZS?#2^&em4fE2{djd~xey zbMr!bd&ypx^m|+cjw54XNhk=ElZW%Nx?CWfiP;+HK%D^GKyKJmeM1<%0cJ9P&d*Rjn4PTxxCT#y~@(k#dh<`(sFaV9r{B{ODoN8 zlaZ~2!SJJ7own$?O?|Ikv&ZI6_u^J(t-IFV_C9{tirO!6yfa^pSpiD#P^F0@yk?KC&Hn+Dg+Qv$|v(&tDW#ifsc!i0!*IM4`<9)AJ*EaLrk4JrP*ETP~Fty zvE8}^;#|dTZ~9nY3jnsVbs5fVuXrsD{D*J z8(ZC_6&{3mZ*FkJ_hP?NK70TC#77^C7l*$4tHC1!UTwsy40-Y1m-oEdNw4xdz8_u> z&bpr{I1v=;VSN2(s(d0{)4@^~j&~yh_oFyxJoSf>(YN)IM1O+M8e5^Wu6f;QiOj{y;XQbZB>ajr{o2 zPix3=VZ9zQZtfUcfxG&^6IEY8uh)wVw0f`ZyY*63frE5*4H8K4#pHT&oFiLKul43t~%I< zsp`;hwF1&=^636IOsGyZnsBDxgNzIQVB zLe_G@@jMKsRxA5kgw?`c`{;?#L_8gf%$3tR44|Ojr|RY7b(zYvt1#;-w64ld@(T&b zK}Bs`7 zQ-&%|9(elzZ-4vO_V}pA9pxg$`#1=)!XN^QH-ZzoYXp%ML=+t3MR`5G@yj?8Kjl@v zTFN;Rjur0Y-^g?JR%`|9fu^#qby&ow15^Wy`Be3g?z?rl5~vSMA-wsdN@Z)svw&5= z6rvi6!}ox`)Yc~Lilx(*6FbXDvFmEQ1{rCb7WfHh9DaOKr80fiI54=z2ZxVhUFi?K zgGpC6iJd*LBeSu>pX+Gkz>X;0-w`$zVki9^mOZ}(JCfHFJEGUE*r8PRHIE(aE4I5} z+7i=^K$^pqbcA_K?ywqxRe}>~+A3KA=%tcVtO80bkr8bS1uQJ{iIXE>M7L%pmLXZ! zX2|l5n1h$lCv8L+V}NR2&Gehu9degr(R`pYNbSXL5UJGm|S$$YJ~-Wc8uSFfOC}9|lSV=Fgf#m+XqB zc&m`={2S25uieY1uLcsiF}ghwd@Yb#J`ubUjGDnG&Ba&z7whH4=*H_zDax(-yr;QkZX~MWXHWZa`)zFuti{4l{qWZvaXtRlEFfKcujb91Y$0~YHyfH@p|BpIl*p9WfqUy(Zy)fWBFV+clI!!i8S_F@@9Rk8VxdlK_(nbn>1)KtqnwoPf(6&Uw15nxs^V*xs;|<#o3T~Q+!mN zG5W0j_ZeF`8h!JnSp?3rp$<7~ksv%8HTY}CQ(7=21Vzrr+ujBs4U7$jXDJ*!<$3jL zd>sn|h!j+*1VO}OMp~!KYR4&j+Y@F-;k4)>S%l%co3NB?NzXIQn z_d&`RHjzB!$p7+#^n{ck)^iP2oquNTH;_E*vMX~) zJ<}LC`Y4V9^S+3wN(A|xyTWX(e5pPt`|aat&_o$jN?xdT|7U>?OwML>+`qB!Ze6g

B~CN=X*ZmkcU(n_9Z@2_BM8K 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 diff --git a/substrate/core/transaction-pool/graph/src/pool.rs b/substrate/core/transaction-pool/graph/src/pool.rs index a16db8206e..e96d320046 100644 --- a/substrate/core/transaction-pool/graph/src/pool.rs +++ b/substrate/core/transaction-pool/graph/src/pool.rs @@ -327,7 +327,7 @@ mod tests { /// Verify extrinsic at given block. fn validate_transaction(&self, at: &BlockId, uxt: &ExtrinsicFor) -> Result { let block_number = self.block_id_to_number(at)?.unwrap(); - let nonce = uxt.transfer.nonce; + let nonce = uxt.transfer().nonce; if nonce < block_number { Ok(TransactionValidity::Invalid) @@ -359,15 +359,12 @@ mod tests { /// Hash the extrinsic. fn hash(&self, uxt: &ExtrinsicFor) -> Self::Hash { - (uxt.transfer.from.to_low_u64_be() << 5) + uxt.transfer.nonce + (uxt.transfer().from.to_low_u64_be() << 5) + uxt.transfer().nonce } } fn uxt(transfer: Transfer) -> Extrinsic { - Extrinsic { - transfer, - signature: Default::default(), - } + Extrinsic::Transfer(transfer, Default::default()) } fn pool() -> Pool { diff --git a/substrate/core/transaction-pool/src/tests.rs b/substrate/core/transaction-pool/src/tests.rs index e02bf05401..c79ca5605b 100644 --- a/substrate/core/transaction-pool/src/tests.rs +++ b/substrate/core/transaction-pool/src/tests.rs @@ -42,12 +42,12 @@ impl txpool::ChainApi for TestApi { fn validate_transaction(&self, at: &BlockId, uxt: &txpool::ExtrinsicFor) -> error::Result { let expected = index(at); - let requires = if expected == uxt.transfer.nonce { + let requires = if expected == uxt.transfer().nonce { vec![] } else { - vec![vec![uxt.transfer.nonce as u8 - 1]] + vec![vec![uxt.transfer().nonce as u8 - 1]] }; - let provides = vec![vec![uxt.transfer.nonce as u8]]; + let provides = vec![vec![uxt.transfer().nonce as u8]]; Ok(TransactionValidity::Valid { priority: 1, @@ -93,10 +93,7 @@ fn uxt(who: Keyring, nonce: Index) -> Extrinsic { amount: 1, }; let signature = transfer.using_encoded(|e| who.sign(e)); - Extrinsic { - transfer, - signature: signature.into(), - } + Extrinsic::Transfer(transfer, signature.into()) } fn pool() -> Pool { @@ -109,7 +106,7 @@ fn submission_should_work() { assert_eq!(209, index(&BlockId::number(0))); pool.submit_one(&BlockId::number(0), uxt(Alice, 209)).unwrap(); - let pending: Vec<_> = pool.ready().map(|a| a.data.transfer.nonce).collect(); + let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); assert_eq!(pending, vec![209]); } @@ -119,7 +116,7 @@ fn multiple_submission_should_work() { pool.submit_one(&BlockId::number(0), uxt(Alice, 209)).unwrap(); pool.submit_one(&BlockId::number(0), uxt(Alice, 210)).unwrap(); - let pending: Vec<_> = pool.ready().map(|a| a.data.transfer.nonce).collect(); + let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); assert_eq!(pending, vec![209, 210]); } @@ -128,7 +125,7 @@ fn early_nonce_should_be_culled() { let pool = pool(); pool.submit_one(&BlockId::number(0), uxt(Alice, 208)).unwrap(); - let pending: Vec<_> = pool.ready().map(|a| a.data.transfer.nonce).collect(); + let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); assert_eq!(pending, Vec::::new()); } @@ -137,11 +134,11 @@ fn late_nonce_should_be_queued() { let pool = pool(); pool.submit_one(&BlockId::number(0), uxt(Alice, 210)).unwrap(); - let pending: Vec<_> = pool.ready().map(|a| a.data.transfer.nonce).collect(); + let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); assert_eq!(pending, Vec::::new()); pool.submit_one(&BlockId::number(0), uxt(Alice, 209)).unwrap(); - let pending: Vec<_> = pool.ready().map(|a| a.data.transfer.nonce).collect(); + let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); assert_eq!(pending, vec![209, 210]); } @@ -151,12 +148,12 @@ fn prune_tags_should_work() { pool.submit_one(&BlockId::number(0), uxt(Alice, 209)).unwrap(); pool.submit_one(&BlockId::number(0), uxt(Alice, 210)).unwrap(); - let pending: Vec<_> = pool.ready().map(|a| a.data.transfer.nonce).collect(); + let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); assert_eq!(pending, vec![209, 210]); pool.prune_tags(&BlockId::number(1), vec![vec![209]]).unwrap(); - let pending: Vec<_> = pool.ready().map(|a| a.data.transfer.nonce).collect(); + let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); assert_eq!(pending, vec![210]); } @@ -169,7 +166,7 @@ fn should_ban_invalid_transactions() { pool.submit_one(&BlockId::number(0), uxt.clone()).unwrap_err(); // when - let pending: Vec<_> = pool.ready().map(|a| a.data.transfer.nonce).collect(); + let pending: Vec<_> = pool.ready().map(|a| a.data.transfer().nonce).collect(); assert_eq!(pending, Vec::::new()); // then diff --git a/substrate/node/cli/src/service.rs b/substrate/node/cli/src/service.rs index 89dbd02319..38f34aedf5 100644 --- a/substrate/node/cli/src/service.rs +++ b/substrate/node/cli/src/service.rs @@ -100,6 +100,7 @@ construct_service_factory! { grandpa::Config { local_key, gossip_duration: Duration::new(4, 0), // FIXME: make this available through chainspec? + justification_period: 4096, name: Some(service.config.name.clone()) }, link_half, diff --git a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 4319fbc77cfdf1650ac987dbf7b073a9b58dce47..f0e4c77f77998fbfadaaeca112c6b3c6f6e871b7 100644 GIT binary patch delta 109994 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 delta 110205 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 LBk|&cY!3T>Xtbfw diff --git a/substrate/srml/consensus/src/lib.rs b/substrate/srml/consensus/src/lib.rs index 2a55ac9e19..e8ef08e4b9 100644 --- a/substrate/srml/consensus/src/lib.rs +++ b/substrate/srml/consensus/src/lib.rs @@ -50,6 +50,9 @@ use primitives::traits::{ use substrate_primitives::storage::well_known_keys; use system::{ensure_signed, ensure_inherent}; +#[cfg(any(feature = "std", test))] +use substrate_primitives::Ed25519AuthorityId; + mod mock; mod tests; @@ -143,7 +146,7 @@ impl RawLog { // Implementation for tests outside of this crate. #[cfg(any(feature = "std", test))] -impl From> for primitives::testing::DigestItem where N: Into { +impl From> for primitives::testing::DigestItem where N: Into { fn from(log: RawLog) -> primitives::testing::DigestItem { match log { RawLog::AuthoritiesChange(authorities) =>