From cf8bdf2126c1fa1bdf7f943239fa602eb11ac04d Mon Sep 17 00:00:00 2001 From: Luke Parker Date: Wed, 2 Nov 2022 22:52:20 -0400 Subject: [PATCH] Stop returning errors on already existing blocks entirely --- .../tendermint/client/src/block_import.rs | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/substrate/tendermint/client/src/block_import.rs b/substrate/tendermint/client/src/block_import.rs index be8926ac..82278c26 100644 --- a/substrate/tendermint/client/src/block_import.rs +++ b/substrate/tendermint/client/src/block_import.rs @@ -3,16 +3,31 @@ use std::{marker::PhantomData, sync::Arc, collections::HashMap}; use async_trait::async_trait; use sp_api::BlockId; -use sp_runtime::traits::Block; +use sp_runtime::traits::{Header, Block}; use sp_blockchain::{BlockStatus, HeaderBackend, Backend as BlockchainBackend}; use sp_consensus::{Error, CacheKeyId, SelectChain}; use sc_consensus::{BlockCheckParams, BlockImportParams, ImportResult, BlockImport, Verifier}; -use sc_client_api::Backend; +use sc_client_api::{Backend, BlockBackend}; use crate::{TendermintValidator, tendermint::TendermintImport}; +impl TendermintImport { + fn check_already_in_chain(&self, hash: ::Hash) -> bool { + let id = BlockId::Hash(hash); + // If it's in chain, with justifications, return it's already on chain + // If it's in chain, without justifications, continue the block import process to import its + // justifications + if (self.client.status(id).unwrap() == BlockStatus::InChain) && + self.client.justifications(&id).unwrap().is_some() + { + return true; + } + false + } +} + #[async_trait] impl BlockImport for TendermintImport where @@ -28,7 +43,7 @@ where &mut self, mut block: BlockCheckParams, ) -> Result { - if self.client.status(BlockId::Hash(block.hash)).unwrap() == BlockStatus::InChain { + if self.check_already_in_chain(block.hash) { return Ok(ImportResult::AlreadyInChain); } self.verify_order(block.parent_hash, block.number)?; @@ -47,9 +62,10 @@ where mut block: BlockImportParams, new_cache: HashMap>, ) -> Result { - if self.client.status(BlockId::Hash(block.hash)).unwrap() == BlockStatus::InChain { + if self.check_already_in_chain(block.header.hash()) { return Ok(ImportResult::AlreadyInChain); } + self.check(&mut block).await?; self.client.import_block(block, new_cache).await.map_err(Into::into) @@ -68,6 +84,10 @@ where &mut self, mut block: BlockImportParams, ) -> Result<(BlockImportParams, Option)>>), String> { + if self.check_already_in_chain(block.header.hash()) { + return Ok((block, None)); + } + self.check(&mut block).await.map_err(|e| format!("{}", e))?; Ok((block, None)) }