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