diff --git a/sync/src/blocks_writer.rs b/sync/src/blocks_writer.rs index 0c885ace..e3892c6c 100644 --- a/sync/src/blocks_writer.rs +++ b/sync/src/blocks_writer.rs @@ -37,6 +37,10 @@ impl BlocksWriter { pub fn append_block(&mut self, block: chain::Block) -> Result<(), Error> { let indexed_block: db::IndexedBlock = block.into(); + // do not append block if it is already there + if self.storage.contains_block(db::BlockRef::Hash(indexed_block.hash().clone())) { + return Ok(()); + } // verify && insert only if parent block is already in the storage if !self.storage.contains_block(db::BlockRef::Hash(indexed_block.header().previous_header_hash.clone())) { self.orphaned_blocks_pool.insert_orphaned_block(indexed_block.hash().clone(), indexed_block); @@ -142,4 +146,16 @@ mod tests { }; assert_eq!(db.best_block().expect("Block is inserted").number, 0); } + + #[test] + fn blocks_writer_append_to_existing_db() { + let db = Arc::new(db::TestStorage::with_genesis_block()); + let mut blocks_target = BlocksWriter::new(db.clone(), Magic::Testnet); + + assert!(blocks_target.append_block(test_data::genesis()).is_ok()); + assert_eq!(db.best_block().expect("Block is inserted").number, 0); + + assert!(blocks_target.append_block(test_data::block_h1()).is_ok()); + assert_eq!(db.best_block().expect("Block is inserted").number, 1); + } }