Better logging, additional tests.

This commit is contained in:
Gav Wood 2015-12-01 12:10:36 +01:00
parent 4e4b754eca
commit 0179cf54b7

View File

@ -40,6 +40,7 @@ impl Diff {
self.0.push(Operation::New(rlp_sha3, rlp)); self.0.push(Operation::New(rlp_sha3, rlp));
} }
else { else {
trace!("new_node: inline node {:?}", &rlp);
out.append_raw(&rlp, 1); out.append_raw(&rlp, 1);
} }
} }
@ -67,13 +68,11 @@ pub struct TrieDB {
} }
impl TrieDB { impl TrieDB {
pub fn new<T>(db: T) -> Self where T: HashDB + 'static { TrieDB{ db: Box::new(db), root: H256::new() } } pub fn new_boxed(db_box: Box<HashDB>) -> Self { let mut r = TrieDB{ db: db_box, root: H256::new() }; r.set_root_rlp(&NULL_RLP); r }
pub fn new_boxed(db_box: Box<HashDB>) -> Self { TrieDB{ db: db_box, root: H256::new() } } pub fn new<T>(db: T) -> Self where T: HashDB + 'static { Self::new_boxed(Box::new(db)) }
pub fn new_memory() -> Self { TrieDB{ db: Box::new(MemoryDB::new()), root: H256::new() } } pub fn new_memory() -> Self { Self::new(MemoryDB::new()) }
pub fn init(&mut self) { self.set_root_rlp(&NULL_RLP); }
pub fn db(&self) -> &HashDB { self.db.as_ref() } pub fn db(&self) -> &HashDB { self.db.as_ref() }
@ -84,6 +83,7 @@ impl TrieDB {
} }
fn apply(&mut self, diff: Diff) { fn apply(&mut self, diff: Diff) {
trace!("applying {:?} changes", diff.0.len());
for d in diff.0.into_iter() { for d in diff.0.into_iter() {
match d { match d {
Operation::Delete(h) => { Operation::Delete(h) => {
@ -99,11 +99,13 @@ impl TrieDB {
} }
fn add(&mut self, key: &NibbleSlice, value: &[u8]) { fn add(&mut self, key: &NibbleSlice, value: &[u8]) {
trace!("ADD: {:?} {:?}", key, value);
// determine what the new root is, insert new nodes and remove old as necessary. // determine what the new root is, insert new nodes and remove old as necessary.
let mut todo: Diff = Diff::new(); let mut todo: Diff = Diff::new();
let root_rlp = self.augmented(self.db.lookup(&self.root).expect("Trie root not found!"), key, value, &mut todo); let root_rlp = self.augmented(self.db.lookup(&self.root).expect("Trie root not found!"), key, value, &mut todo);
self.apply(todo); self.apply(todo);
self.set_root_rlp(&root_rlp); self.set_root_rlp(&root_rlp);
trace!("---");
} }
fn compose_leaf(partial: &NibbleSlice, value: &[u8]) -> Bytes { fn compose_leaf(partial: &NibbleSlice, value: &[u8]) -> Bytes {
@ -112,7 +114,7 @@ impl TrieDB {
s.append(&partial.encoded(true)); s.append(&partial.encoded(true));
s.append(&value); s.append(&value);
let r = s.out(); let r = s.out();
trace!("output: -> {:?}", &r); trace!("compose_leaf: -> {:?}", &r);
r r
} }
@ -122,7 +124,7 @@ impl TrieDB {
s.append(&partial.encoded(is_leaf)); s.append(&partial.encoded(is_leaf));
s.append_raw(raw_payload, 1); s.append_raw(raw_payload, 1);
let r = s.out(); let r = s.out();
println!("output: -> {:?}", &r); println!("compose_raw: -> {:?}", &r);
r r
} }
@ -246,6 +248,7 @@ impl TrieDB {
let old_rlp = Rlp::new(old); let old_rlp = Rlp::new(old);
match old_rlp.prototype() { match old_rlp.prototype() {
Prototype::List(17) => { Prototype::List(17) => {
trace!("branch: ROUTE,AUGMENT");
// already have a branch. route and augment. // already have a branch. route and augment.
self.augmented_into_branch(&old_rlp, partial, value, diff) self.augmented_into_branch(&old_rlp, partial, value, diff)
}, },
@ -297,6 +300,7 @@ impl TrieDB {
} }
}, },
Prototype::Data(0) => { Prototype::Data(0) => {
trace!("empty: COMPOSE");
Self::compose_leaf(partial, value) Self::compose_leaf(partial, value)
}, },
_ => panic!("Invalid RLP for node."), _ => panic!("Invalid RLP for node."),
@ -326,7 +330,6 @@ impl Trie for TrieDB {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use memorydb::*;
use triehash::*; use triehash::*;
use super::*; use super::*;
use env_logger; use env_logger;
@ -335,33 +338,45 @@ mod tests {
fn playpen() { fn playpen() {
env_logger::init().unwrap(); env_logger::init().unwrap();
let mut t = TrieDB::new(MemoryDB::new()); let mut t = TrieDB::new_memory();
t.init();
t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]); t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
t.insert(&[0x11u8, 0x23], &[0x11u8, 0x23]);
assert_eq!(*t.root(), trie_root(vec![
(vec![0x01u8, 0x23], vec![0x01u8, 0x23]),
(vec![0x11u8, 0x23], vec![0x11u8, 0x23])
]));
} }
#[test] #[test]
fn init() { fn init() {
let mut t = TrieDB::new(MemoryDB::new()); let t = TrieDB::new_memory();
t.init();
assert_eq!(*t.root(), SHA3_NULL_RLP); assert_eq!(*t.root(), SHA3_NULL_RLP);
assert!(t.is_empty()); assert!(t.is_empty());
} }
#[test] #[test]
fn insert_on_empty() { fn insert_on_empty() {
let mut t = TrieDB::new(MemoryDB::new()); let mut t = TrieDB::new_memory();
t.init();
t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]); t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
assert_eq!(*t.root(), trie_root(vec![ (vec![0x01u8, 0x23], vec![0x01u8, 0x23]) ])); assert_eq!(*t.root(), trie_root(vec![ (vec![0x01u8, 0x23], vec![0x01u8, 0x23]) ]));
} }
#[test] #[test]
fn insert_replace_root() { fn insert_replace_root() {
let mut t = TrieDB::new(MemoryDB::new()); let mut t = TrieDB::new_memory();
t.init();
t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]); t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
t.insert(&[0x01u8, 0x23], &[0x23u8, 0x45]); t.insert(&[0x01u8, 0x23], &[0x23u8, 0x45]);
assert_eq!(*t.root(), trie_root(vec![ (vec![0x01u8, 0x23], vec![0x23u8, 0x45]) ])); assert_eq!(*t.root(), trie_root(vec![ (vec![0x01u8, 0x23], vec![0x23u8, 0x45]) ]));
} }
#[test]
fn insert_branch_root() {
let mut t = TrieDB::new_memory();
t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
t.insert(&[0x11u8, 0x23], &[0x11u8, 0x23]);
assert_eq!(*t.root(), trie_root(vec![
(vec![0x01u8, 0x23], vec![0x01u8, 0x23]),
(vec![0x11u8, 0x23], vec![0x11u8, 0x23])
]));
}
} }