Forward storage changes in manual seal (#7614)

This prevents nodes from executing the same block 2 times.
This commit is contained in:
Bastian Köcher
2020-11-27 17:36:58 +01:00
committed by GitHub
parent 07c173af63
commit 6722a83ba6
2 changed files with 10 additions and 9 deletions
@@ -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, C: HeaderBackend<B> + Finalizer<B, CB> + ProvideRuntimeApi<B> + 'static,
CB: ClientBackend<B> + 'static, CB: ClientBackend<B> + 'static,
E: Environment<B> + 'static, E: Environment<B> + 'static,
E::Error: std::fmt::Display, E::Proposer: Proposer<B, Transaction = TransactionFor<C, B>>,
<E::Proposer as Proposer<B>>::Error: std::fmt::Display,
CS: Stream<Item=EngineCommand<<B as BlockT>::Hash>> + Unpin + 'static, CS: Stream<Item=EngineCommand<<B as BlockT>::Hash>> + Unpin + 'static,
SC: SelectChain<B> + 'static, SC: SelectChain<B> + 'static,
TransactionFor<C, B>: 'static,
{ {
while let Some(command) = commands_stream.next().await { while let Some(command) = commands_stream.next().await {
match command { 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, C: HeaderBackend<B> + Finalizer<B, CB> + ProvideRuntimeApi<B> + 'static,
CB: ClientBackend<B> + 'static, CB: ClientBackend<B> + 'static,
E: Environment<B> + 'static, E: Environment<B> + 'static,
E::Error: std::fmt::Display, E::Proposer: Proposer<B, Transaction = TransactionFor<C, B>>,
<E::Proposer as Proposer<B>>::Error: std::fmt::Display, SC: SelectChain<B> + 'static,
SC: SelectChain<B> + 'static TransactionFor<C, B>: 'static,
{ {
// instant-seal creates blocks as soon as transactions are imported // instant-seal creates blocks as soon as transactions are imported
// into the transaction pool. // into the transaction pool.
@@ -87,10 +87,10 @@ pub async fn seal_block<B, BI, SC, C, E, P>(
+ Send + Sync + 'static, + Send + Sync + 'static,
C: HeaderBackend<B> + ProvideRuntimeApi<B>, C: HeaderBackend<B> + ProvideRuntimeApi<B>,
E: Environment<B>, E: Environment<B>,
<E as Environment<B>>::Error: std::fmt::Display, E::Proposer: Proposer<B, Transaction = TransactionFor<C, B>>,
<E::Proposer as Proposer<B>>::Error: std::fmt::Display,
P: txpool::ChainApi<Block=B>, P: txpool::ChainApi<Block=B>,
SC: SelectChain<B>, SC: SelectChain<B>,
TransactionFor<C, B>: 'static,
{ {
let future = async { let future = async {
if pool.validated_pool().status().ready == 0 && !create_empty { 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) 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 id = inherent_data_provider.create_inherent_data()?;
let inherents_len = id.len(); 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()) 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 { if proposal.block.extrinsics().len() == inherents_len && !create_empty {
return Err(Error::EmptyTransactionPool) return Err(Error::EmptyTransactionPool)
@@ -133,6 +133,7 @@ pub async fn seal_block<B, BI, SC, C, E, P>(
params.body = Some(body); params.body = Some(body);
params.finalized = finalize; params.finalized = finalize;
params.fork_choice = Some(ForkChoiceStrategy::LongestChain); params.fork_choice = Some(ForkChoiceStrategy::LongestChain);
params.storage_changes = Some(proposal.storage_changes);
if let Some(digest_provider) = digest_provider { if let Some(digest_provider) = digest_provider {
digest_provider.append_block_import(&parent, &mut params, &id)?; digest_provider.append_block_import(&parent, &mut params, &id)?;