From 6722a83ba66cc87a21111061c575fbfb6da60102 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= <bkchr@users.noreply.github.com>
Date: Fri, 27 Nov 2020 17:36:58 +0100
Subject: [PATCH] Forward storage changes in manual seal (#7614)

This prevents nodes from executing the same block 2 times.
---
 substrate/client/consensus/manual-seal/src/lib.rs      | 10 +++++-----
 .../client/consensus/manual-seal/src/seal_block.rs     |  9 +++++----
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/substrate/client/consensus/manual-seal/src/lib.rs b/substrate/client/consensus/manual-seal/src/lib.rs
index 5a1cd0f79b4..9c4465f82fd 100644
--- a/substrate/client/consensus/manual-seal/src/lib.rs
+++ b/substrate/client/consensus/manual-seal/src/lib.rs
@@ -163,10 +163,10 @@ pub async fn run_manual_seal<B, BI, CB, E, C, A, SC, CS>(
 		C: HeaderBackend<B> + Finalizer<B, CB> + ProvideRuntimeApi<B> + 'static,
 		CB: ClientBackend<B> + 'static,
 		E: Environment<B> + 'static,
-		E::Error: std::fmt::Display,
-		<E::Proposer as Proposer<B>>::Error: std::fmt::Display,
+		E::Proposer: Proposer<B, Transaction = TransactionFor<C, B>>,
 		CS: Stream<Item=EngineCommand<<B as BlockT>::Hash>> + Unpin + 'static,
 		SC: SelectChain<B> + 'static,
+		TransactionFor<C, B>: 'static,
 {
 	while let Some(command) = commands_stream.next().await {
 		match command {
@@ -230,9 +230,9 @@ pub async fn run_instant_seal<B, BI, CB, E, C, A, SC>(
 		C: HeaderBackend<B> + Finalizer<B, CB> + ProvideRuntimeApi<B> + 'static,
 		CB: ClientBackend<B> + 'static,
 		E: Environment<B> + 'static,
-		E::Error: std::fmt::Display,
-		<E::Proposer as Proposer<B>>::Error: std::fmt::Display,
-		SC: SelectChain<B> + 'static
+		E::Proposer: Proposer<B, Transaction = TransactionFor<C, B>>,
+		SC: SelectChain<B> + 'static,
+		TransactionFor<C, B>: 'static,
 {
 	// instant-seal creates blocks as soon as transactions are imported
 	// into the transaction pool.
diff --git a/substrate/client/consensus/manual-seal/src/seal_block.rs b/substrate/client/consensus/manual-seal/src/seal_block.rs
index 58f017f2d41..a4afaa343e9 100644
--- a/substrate/client/consensus/manual-seal/src/seal_block.rs
+++ b/substrate/client/consensus/manual-seal/src/seal_block.rs
@@ -87,10 +87,10 @@ pub async fn seal_block<B, BI, SC, C, E, P>(
 			+ Send + Sync + 'static,
 		C: HeaderBackend<B> + ProvideRuntimeApi<B>,
 		E: Environment<B>,
-		<E as Environment<B>>::Error: std::fmt::Display,
-		<E::Proposer as Proposer<B>>::Error: std::fmt::Display,
+		E::Proposer: Proposer<B, Transaction = TransactionFor<C, B>>,
 		P: txpool::ChainApi<Block=B>,
 		SC: SelectChain<B>,
+		TransactionFor<C, B>: 'static,
 {
 	let future = async {
 		if pool.validated_pool().status().ready == 0 && !create_empty {
@@ -111,7 +111,7 @@ pub async fn seal_block<B, BI, SC, C, E, P>(
 		};
 
 		let proposer = env.init(&parent)
-			.map_err(|err| Error::StringError(format!("{}", err))).await?;
+			.map_err(|err| Error::StringError(format!("{:?}", err))).await?;
 		let id = inherent_data_provider.create_inherent_data()?;
 		let inherents_len = id.len();
 
@@ -122,7 +122,7 @@ pub async fn seal_block<B, BI, SC, C, E, P>(
 		};
 
 		let proposal = proposer.propose(id.clone(), digest, Duration::from_secs(MAX_PROPOSAL_DURATION), false.into())
-			.map_err(|err| Error::StringError(format!("{}", err))).await?;
+			.map_err(|err| Error::StringError(format!("{:?}", err))).await?;
 
 		if proposal.block.extrinsics().len() == inherents_len && !create_empty {
 			return Err(Error::EmptyTransactionPool)
@@ -133,6 +133,7 @@ pub async fn seal_block<B, BI, SC, C, E, P>(
 		params.body = Some(body);
 		params.finalized = finalize;
 		params.fork_choice = Some(ForkChoiceStrategy::LongestChain);
+		params.storage_changes = Some(proposal.storage_changes);
 
 		if let Some(digest_provider) = digest_provider {
 			digest_provider.append_block_import(&parent, &mut params, &id)?;
-- 
GitLab