diff --git a/substrate/node/consensus/src/lib.rs b/substrate/node/consensus/src/lib.rs index 9638a39715..2b100c10a8 100644 --- a/substrate/node/consensus/src/lib.rs +++ b/substrate/node/consensus/src/lib.rs @@ -227,6 +227,7 @@ impl bft::Environment<::Block> for ProposerFactory { client: Arc, start: Instant, local_key: Arc, + next_index: Option, parent_hash: <::Block as BlockT>::Hash, parent_id: BlockId<::Block>, parent_number: <<::Block as BlockT>::Header as HeaderT>::Number, @@ -450,24 +452,25 @@ impl bft::Proposer<::Block> for Proposer where use node_runtime::{Call, UncheckedExtrinsic, ConsensusCall}; let mut next_index = { - let local_id = self.local_key.public().0; - // let cur_index = self.transaction_pool.cull_and_get_pending(&BlockId::hash(self.parent_hash), |pending| pending - // .filter(|tx| tx.verified.sender == local_id) - // .last() - // .map(|tx| Ok(tx.verified.index())) - // .unwrap_or_else(|| self.client.account_nonce(&self.parent_id, local_id)) - // .map_err(Error::from) - // ); - // TODO [ToDr] Use pool data - let cur_index: Result = self.client.account_nonce(&self.parent_id, &local_id).map_err(Error::from); + let cur_index: Result = self.client + .account_nonce(&self.parent_id, &self.local_key.public().0) + .map_err(Error::from); - match cur_index { + let cur_index = match cur_index { Ok(cur_index) => cur_index + 1, Err(e) => { warn!(target: "consensus", "Error computing next transaction index: {:?}", e); return; } - } + }; + + let index = match self.next_index { + // make sure there were no other transactions in the meantime + Some(idx) if idx > cur_index => idx, + _ => cur_index, + }; + + index }; for (target, misbehavior) in misbehavior { @@ -487,6 +490,7 @@ impl bft::Proposer<::Block> for Proposer where let payload = (next_index, Call::Consensus(ConsensusCall::report_misbehavior(report)), Era::immortal(), self.client.genesis_hash()); let signature = self.local_key.sign(&payload.encode()).into(); next_index += 1; + self.next_index = Some(next_index); let local_id = self.local_key.public().0.into(); let extrinsic = UncheckedExtrinsic {