blockchain.rs 75.3 KiB
Newer Older
		assert_eq!(blocks_b1, vec![1]);
		assert_eq!(blocks_b2, vec![2]);
Tomasz Drwięga's avatar
Tomasz Drwięga committed
		insert_block(&db, &bc, &b1a, vec![]);
Marek Kotewicz's avatar
Marek Kotewicz committed
		let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 5);
		let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 5);
		let blocks_ba = bc.blocks_with_bloom(&bloom_ba, 0, 5);
		assert_eq!(blocks_b1, vec![1]);
		assert_eq!(blocks_b2, vec![2]);
		assert_eq!(blocks_ba, vec![]);

		// fork has happend
Tomasz Drwięga's avatar
Tomasz Drwięga committed
		insert_block(&db, &bc, &b2a, vec![]);
Marek Kotewicz's avatar
Marek Kotewicz committed
		let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 5);
		let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 5);
		let blocks_ba = bc.blocks_with_bloom(&bloom_ba, 0, 5);
		assert_eq!(blocks_b1, vec![]);
		assert_eq!(blocks_b2, vec![]);
		assert_eq!(blocks_ba, vec![1, 2]);
Marek Kotewicz's avatar
Marek Kotewicz committed

		// fork back
Tomasz Drwięga's avatar
Tomasz Drwięga committed
		insert_block(&db, &bc, &b3, vec![]);
Marek Kotewicz's avatar
Marek Kotewicz committed
		let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 5);
		let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 5);
		let blocks_ba = bc.blocks_with_bloom(&bloom_ba, 0, 5);
		assert_eq!(blocks_b1, vec![1]);
		assert_eq!(blocks_b2, vec![2]);
		assert_eq!(blocks_ba, vec![3]);

	#[test]
	fn test_best_block_update() {
		let mut canon_chain = ChainGenerator::default();
		let mut finalizer = BlockFinalizer::default();
		let genesis = canon_chain.generate(&mut finalizer).unwrap();

		let temp = RandomTempPath::new();

		{
Tomasz Drwięga's avatar
Tomasz Drwięga committed
			let db = new_db(temp.as_str());
			let bc = BlockChain::new(Config::default(), &genesis, db.clone());
			let uncle = canon_chain.fork(1).generate(&mut finalizer.fork()).unwrap();

			let mut batch =db.transaction();
			// create a longer fork
			for _ in 0..5 {
				let canon_block = canon_chain.generate(&mut finalizer).unwrap();
				bc.insert_block(&mut batch, &canon_block, vec![]);
			}

			assert_eq!(bc.best_block_number(), 5);
			bc.insert_block(&mut batch, &uncle, vec![]);
Tomasz Drwięga's avatar
Tomasz Drwięga committed
			db.write(batch).unwrap();
		}

		// re-loading the blockchain should load the correct best block.
Tomasz Drwięga's avatar
Tomasz Drwięga committed
		let db = new_db(temp.as_str());
		let bc = BlockChain::new(Config::default(), &genesis, db.clone());
		assert_eq!(bc.best_block_number(), 5);
	}

	#[test]
	fn test_rewind() {
		let mut canon_chain = ChainGenerator::default();
		let mut finalizer = BlockFinalizer::default();
		let genesis = canon_chain.generate(&mut finalizer).unwrap();
		let first = canon_chain.generate(&mut finalizer).unwrap();
		let second = canon_chain.generate(&mut finalizer).unwrap();
		let genesis_hash = BlockView::new(&genesis).header_view().sha3();
		let first_hash = BlockView::new(&first).header_view().sha3();
		let second_hash = BlockView::new(&second).header_view().sha3();

		let temp = RandomTempPath::new();
Tomasz Drwięga's avatar
Tomasz Drwięga committed
		let db = new_db(temp.as_str());
		let bc = BlockChain::new(Config::default(), &genesis, db.clone());
		let mut batch =db.transaction();
		bc.insert_block(&mut batch, &first, vec![]);
		bc.insert_block(&mut batch, &second, vec![]);
Tomasz Drwięga's avatar
Tomasz Drwięga committed
		db.write(batch).unwrap();

		assert_eq!(bc.rewind(), Some(first_hash.clone()));
		assert!(!bc.is_known(&second_hash));
		assert_eq!(bc.best_block_number(), 1);
		assert_eq!(bc.best_block_hash(), first_hash.clone());

		assert_eq!(bc.rewind(), Some(genesis_hash.clone()));
		assert_eq!(bc.rewind(), None);
	}