Use header hash for by height index ()

* Use header hash for by height index
* Update semantics of save_header_height
This commit is contained in:
Æde 2018-03-09 19:59:15 +01:00 committed by Ignotus Peverell
parent 5cf780ab98
commit bbbbdc455d
2 changed files with 27 additions and 7 deletions

View file

@ -146,11 +146,12 @@ impl ChainStore for ChainKVStore {
fn get_header_by_height(&self, height: u64) -> Result<BlockHeader, Error> {
option_to_not_found(self.db.get_ser(&u64_to_key(HEADER_HEIGHT_PREFIX, height)))
.and_then(|hash| self.get_block_header(&hash))
}
fn save_header_height(&self, bh: &BlockHeader) -> Result<(), Error> {
self.db
.put_ser(&u64_to_key(HEADER_HEIGHT_PREFIX, bh.height), bh)
.put_ser(&u64_to_key(HEADER_HEIGHT_PREFIX, bh.height), &bh.hash())
}
fn delete_header_by_height(&self, height: u64) -> Result<(), Error> {
@ -229,8 +230,7 @@ impl ChainStore for ChainKVStore {
self.delete_header_by_height(n)?;
}
self.db
.put_ser(&u64_to_key(HEADER_HEIGHT_PREFIX, header.height), header)?;
self.save_header_height(&header)?;
if header.height > 0 {
let mut prev_header = self.get_block_header(&header.previous)?;
@ -238,10 +238,7 @@ impl ChainStore for ChainKVStore {
if let Ok(_) = self.is_on_current_chain(&prev_header) {
break;
}
self.db.put_ser(
&u64_to_key(HEADER_HEIGHT_PREFIX, prev_header.height),
&prev_header,
)?;
self.save_header_height(&prev_header)?;
prev_header = self.get_block_header(&prev_header.previous)?;
}

View file

@ -24,6 +24,7 @@ use std::fs;
use chain::{ChainStore, Tip};
use core::core::hash::Hashed;
use core::core::Block;
use core::core::BlockHeader;
use core::core::target::Difficulty;
use keychain::Keychain;
use core::global;
@ -70,3 +71,25 @@ fn test_various_store_indices() {
let block_header = chain_store.get_header_by_height(1).unwrap();
assert_eq!(block_header.hash(), block_hash);
}
#[test]
fn test_store_header_height() {
let _ = env_logger::init();
clean_output_dir(".grin");
let chain_store = &chain::store::ChainKVStore::new(".grin".to_string()).unwrap() as &ChainStore;
let mut block_header = BlockHeader::default();
block_header.height = 1;
chain_store.save_block_header(&block_header).unwrap();
chain_store.save_header_height(&block_header).unwrap();
let stored_block_header = chain_store.get_header_by_height(1).unwrap();
assert_eq!(block_header.hash(), stored_block_header.hash());
chain_store.delete_header_by_height(1).unwrap();
let result = chain_store.get_header_by_height(1);
assert_eq!(result.is_err(), true);
}