mirror of
https://github.com/mimblewimble/grin.git
synced 2025-05-09 02:31:16 +03:00
Use header hash for by height index (#761)
* Use header hash for by height index * Update semantics of save_header_height
This commit is contained in:
parent
5cf780ab98
commit
bbbbdc455d
2 changed files with 27 additions and 7 deletions
chain
|
@ -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)?;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue