From 55ca13ab0925fee4a65eff339f3093fd373960c6 Mon Sep 17 00:00:00 2001 From: Robert Habermeier <rphmeier@gmail.com> Date: Sun, 28 Oct 2018 20:50:31 +0100 Subject: [PATCH] call into chain WASM to check for changes --- substrate/core/finality-grandpa/src/lib.rs | 27 ++++++++++++---------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/substrate/core/finality-grandpa/src/lib.rs b/substrate/core/finality-grandpa/src/lib.rs index 0b8405a6fe0..dd5f97f264e 100644 --- a/substrate/core/finality-grandpa/src/lib.rs +++ b/substrate/core/finality-grandpa/src/lib.rs @@ -48,7 +48,7 @@ use client::{Client, error::Error as ClientError, ImportNotifications, backend:: use codec::{Encode, Decode}; use consensus_common::{BlockImport, ImportBlock, ImportResult}; use runtime_primitives::traits::{ - NumberFor, Block as BlockT, Header as HeaderT, DigestItemFor, + NumberFor, Block as BlockT, Header as HeaderT, DigestFor, }; use runtime_primitives::generic::BlockId; use substrate_primitives::{ed25519, AuthorityId, Blake2Hasher}; @@ -434,7 +434,6 @@ impl<Block: BlockT, B, E, N> grandpa::Chain<Block::Hash, NumberFor<Block>> for E N: Network + 'static, N::In: 'static, NumberFor<Block>: BlockNumberOps, - DigestItemFor<Block>: CompatibleDigestItem<NumberFor<Block>>, { fn ancestry(&self, base: Block::Hash, block: Block::Hash) -> Result<Vec<Block::Hash>, GrandpaError> { let tree_route_res = ::client::blockchain::tree_route( @@ -529,7 +528,6 @@ impl<B, E, Block: BlockT, N> voter::Environment<Block::Hash, NumberFor<Block>> f N: Network + 'static, N::In: 'static, NumberFor<Block>: BlockNumberOps, - DigestItemFor<Block>: CompatibleDigestItem<NumberFor<Block>>, { type Timer = Box<Future<Item = (), Error = Self::Error>>; type Id = AuthorityId; @@ -686,7 +684,7 @@ pub struct GrandpaBlockImport<B, E, Block: BlockT> { impl<B, E, Block: BlockT> BlockImport<Block> for GrandpaBlockImport<B, E, Block> where B: Backend<Block, Blake2Hasher> + 'static, E: CallExecutor<Block, Blake2Hasher> + 'static + Clone, - DigestItemFor<Block>: CompatibleDigestItem<NumberFor<Block>>, + DigestFor<Block>: Encode, { type Error = ClientError; @@ -696,13 +694,20 @@ impl<B, E, Block: BlockT> BlockImport<Block> for GrandpaBlockImport<B, E, Block> use runtime_primitives::traits::Digest; use authorities::PendingChange; - let maybe_event = block.header.digest().logs().iter() - .filter_map(|log| log.scheduled_change()) - .next() - .map(|change| (block.header.hash(), *block.header.number(), change)); + let maybe_change: Option<ScheduledChange<NumberFor<Block>>> = self.inner.call_api_at( + &BlockId::hash(block.header.parent_hash().clone()), + ::fg_primitives::PENDING_CHANGE_CALL, + block.header.digest() + )?; + + let maybe_change = maybe_change.map(|change| ( + block.header.hash(), + block.header.number().clone(), + change + )); let result = self.inner.import_block(block, new_authorities); - if let (true, Some((hash, number, change))) = (result.is_ok(), maybe_event) { + if let (true, Some((hash, number, change))) = (result.is_ok(), maybe_change) { self.authority_set.add_pending_change(PendingChange { next_authorities: change.next_authorities, finalization_depth: number + change.delay, @@ -734,7 +739,7 @@ pub fn run_grandpa<B, E, Block: BlockT, N>( N: Network + 'static, N::In: 'static, NumberFor<Block>: BlockNumberOps, - DigestItemFor<Block>: CompatibleDigestItem<NumberFor<Block>>, + DigestFor<Block>: Encode, { use futures::future::{self, Loop as FutureLoop}; @@ -826,8 +831,6 @@ mod tests { use keyring::Keyring; use client::BlockchainEvents; - impl CompatibleDigestItem<NumberFor<Block>> for DigestItemFor<Block> { } - #[derive(Clone)] struct TestGrandpaNetwork { inner: Arc<Mutex<TestNet>>, -- GitLab