TrieDB root is borrowed
This commit is contained in:
		
							parent
							
								
									8c9fe2fbe5
								
							
						
					
					
						commit
						b487f8f20e
					
				
							
								
								
									
										108
									
								
								src/trie.rs
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								src/trie.rs
									
									
									
									
									
								
							@ -282,10 +282,12 @@ impl <'a>Node<'a> {
 | 
				
			|||||||
/// use util::trie::*;
 | 
					/// use util::trie::*;
 | 
				
			||||||
/// use util::hashdb::*;
 | 
					/// use util::hashdb::*;
 | 
				
			||||||
/// use util::memorydb::*;
 | 
					/// use util::memorydb::*;
 | 
				
			||||||
 | 
					/// use util::hash::*;
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// fn main() {
 | 
					/// fn main() {
 | 
				
			||||||
///   let mut memdb = MemoryDB::new();
 | 
					///   let mut memdb = MemoryDB::new();
 | 
				
			||||||
///   let mut t = TrieDB::new(&mut memdb);
 | 
					///   let mut root = H256::new();
 | 
				
			||||||
 | 
					///   let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
///   assert!(t.is_empty());
 | 
					///   assert!(t.is_empty());
 | 
				
			||||||
///   assert_eq!(*t.root(), SHA3_NULL_RLP);
 | 
					///   assert_eq!(*t.root(), SHA3_NULL_RLP);
 | 
				
			||||||
///   t.insert(b"foo", b"bar");
 | 
					///   t.insert(b"foo", b"bar");
 | 
				
			||||||
@ -299,7 +301,7 @@ impl <'a>Node<'a> {
 | 
				
			|||||||
/// ```
 | 
					/// ```
 | 
				
			||||||
pub struct TrieDB<'db, T> where T: 'db + HashDB {
 | 
					pub struct TrieDB<'db, T> where T: 'db + HashDB {
 | 
				
			||||||
	db: &'db mut T,
 | 
						db: &'db mut T,
 | 
				
			||||||
	root: H256,
 | 
						root: &'db mut H256,
 | 
				
			||||||
	pub hash_count: usize,
 | 
						pub hash_count: usize,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -310,18 +312,32 @@ enum MaybeChanged<'a> {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl<'db, T> TrieDB<'db, T> where T: 'db + HashDB {
 | 
					impl<'db, T> TrieDB<'db, T> where T: 'db + HashDB {
 | 
				
			||||||
	/// Create a new trie with the backing database `db`.
 | 
						/// Create a new trie with the backing database `db` and empty `root`
 | 
				
			||||||
	pub fn new(db: &'db mut T) -> Self { 
 | 
						/// Initialise to the state entailed by the genesis block.
 | 
				
			||||||
 | 
						/// This guarantees the trie is built correctly.
 | 
				
			||||||
 | 
						pub fn new(db: &'db mut T, root: &'db mut H256) -> Self { 
 | 
				
			||||||
		let mut r = TrieDB{ 
 | 
							let mut r = TrieDB{ 
 | 
				
			||||||
			db: db, 
 | 
								db: db, 
 | 
				
			||||||
			root: H256::new(), 
 | 
								root: root,
 | 
				
			||||||
			hash_count: 0 
 | 
								hash_count: 0 
 | 
				
			||||||
		}; 
 | 
							}; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		r.root = r.db.insert(&NULL_RLP); 
 | 
							// set root rlp
 | 
				
			||||||
 | 
							*r.root = r.db.insert(&NULL_RLP); 
 | 
				
			||||||
		r 
 | 
							r 
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// Create a new trie with the backing database `db` and `root`
 | 
				
			||||||
 | 
						/// Panics, if `root` does not exist
 | 
				
			||||||
 | 
						pub fn new_pre_existing(db: &'db mut T, root: &'db mut H256) -> Self {
 | 
				
			||||||
 | 
							assert!(db.exists(root));
 | 
				
			||||||
 | 
							TrieDB { 
 | 
				
			||||||
 | 
								db: db, 
 | 
				
			||||||
 | 
								root: root,
 | 
				
			||||||
 | 
								hash_count: 0 
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// Get the backing database.
 | 
						/// Get the backing database.
 | 
				
			||||||
	pub fn db(&'db self) -> &'db T { 
 | 
						pub fn db(&'db self) -> &'db T { 
 | 
				
			||||||
		self.db 
 | 
							self.db 
 | 
				
			||||||
@ -363,7 +379,7 @@ impl<'db, T> TrieDB<'db, T> where T: 'db + HashDB {
 | 
				
			|||||||
	/// and removing the old.
 | 
						/// and removing the old.
 | 
				
			||||||
	fn set_root_rlp(&mut self, root_data: &[u8]) {
 | 
						fn set_root_rlp(&mut self, root_data: &[u8]) {
 | 
				
			||||||
		self.db.kill(&self.root);
 | 
							self.db.kill(&self.root);
 | 
				
			||||||
		self.root = self.db.insert(root_data);
 | 
							*self.root = self.db.insert(root_data);
 | 
				
			||||||
		self.hash_count += 1;
 | 
							self.hash_count += 1;
 | 
				
			||||||
		trace!("set_root_rlp {:?} {:?}", root_data.pretty(), self.root);
 | 
							trace!("set_root_rlp {:?} {:?}", root_data.pretty(), self.root);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -944,8 +960,8 @@ mod tests {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn populate_trie<'db, T>(db: &'db mut T, v: &Vec<(Vec<u8>, Vec<u8>)>) -> TrieDB<'db, T> where T: 'db + HashDB {
 | 
						fn populate_trie<'db, T>(db: &'db mut T, root: &'db mut H256, v: &Vec<(Vec<u8>, Vec<u8>)>) -> TrieDB<'db, T> where T: 'db + HashDB {
 | 
				
			||||||
		let mut t = TrieDB::new(db);
 | 
							let mut t = TrieDB::new(db, root);
 | 
				
			||||||
		for i in 0..v.len() {
 | 
							for i in 0..v.len() {
 | 
				
			||||||
			let key: &[u8]= &v[i].0;
 | 
								let key: &[u8]= &v[i].0;
 | 
				
			||||||
			let val: &[u8] = &v[i].1;
 | 
								let val: &[u8] = &v[i].1;
 | 
				
			||||||
@ -1005,7 +1021,8 @@ mod tests {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			let real = trie_root(x.clone());
 | 
								let real = trie_root(x.clone());
 | 
				
			||||||
			let mut memdb = MemoryDB::new();
 | 
								let mut memdb = MemoryDB::new();
 | 
				
			||||||
			let mut memtrie = populate_trie(&mut memdb, &x);
 | 
								let mut root = H256::new();
 | 
				
			||||||
 | 
								let mut memtrie = populate_trie(&mut memdb, &mut root, &x);
 | 
				
			||||||
			if *memtrie.root() != real || !memtrie.db_items_remaining().is_empty() {
 | 
								if *memtrie.root() != real || !memtrie.db_items_remaining().is_empty() {
 | 
				
			||||||
				println!("TRIE MISMATCH");
 | 
									println!("TRIE MISMATCH");
 | 
				
			||||||
				println!("");
 | 
									println!("");
 | 
				
			||||||
@ -1035,7 +1052,8 @@ mod tests {
 | 
				
			|||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn init() {
 | 
						fn init() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		assert_eq!(*t.root(), SHA3_NULL_RLP);
 | 
							assert_eq!(*t.root(), SHA3_NULL_RLP);
 | 
				
			||||||
		assert!(t.is_empty());
 | 
							assert!(t.is_empty());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -1043,7 +1061,8 @@ mod tests {
 | 
				
			|||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn insert_on_empty() {
 | 
						fn insert_on_empty() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		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]) ]));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -1053,13 +1072,15 @@ mod tests {
 | 
				
			|||||||
		let big_value = b"00000000000000000000000000000000";
 | 
							let big_value = b"00000000000000000000000000000000";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t1 = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t1 = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		t1.insert(&[0x01, 0x23], &big_value.to_vec());
 | 
							t1.insert(&[0x01, 0x23], &big_value.to_vec());
 | 
				
			||||||
		t1.insert(&[0x01, 0x34], &big_value.to_vec());
 | 
							t1.insert(&[0x01, 0x34], &big_value.to_vec());
 | 
				
			||||||
		trace!("keys remaining {:?}", t1.db_items_remaining());
 | 
							trace!("keys remaining {:?}", t1.db_items_remaining());
 | 
				
			||||||
		assert!(t1.db_items_remaining().is_empty());
 | 
							assert!(t1.db_items_remaining().is_empty());
 | 
				
			||||||
		let mut memdb2 = MemoryDB::new();
 | 
							let mut memdb2 = MemoryDB::new();
 | 
				
			||||||
		let mut t2 = TrieDB::new(&mut memdb2);
 | 
							let mut root2 = H256::new();
 | 
				
			||||||
 | 
							let mut t2 = TrieDB::new(&mut memdb2, &mut root2);
 | 
				
			||||||
		t2.insert(&[0x01], &big_value.to_vec());
 | 
							t2.insert(&[0x01], &big_value.to_vec());
 | 
				
			||||||
		t2.insert(&[0x01, 0x23], &big_value.to_vec());
 | 
							t2.insert(&[0x01, 0x23], &big_value.to_vec());
 | 
				
			||||||
		t2.insert(&[0x01, 0x34], &big_value.to_vec());
 | 
							t2.insert(&[0x01, 0x34], &big_value.to_vec());
 | 
				
			||||||
@ -1074,7 +1095,8 @@ mod tests {
 | 
				
			|||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn insert_replace_root() {
 | 
						fn insert_replace_root() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		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]) ]));
 | 
				
			||||||
@ -1083,7 +1105,8 @@ mod tests {
 | 
				
			|||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn insert_make_branch_root() {
 | 
						fn insert_make_branch_root() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
							t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
				
			||||||
		t.insert(&[0x11u8, 0x23], &[0x11u8, 0x23]);
 | 
							t.insert(&[0x11u8, 0x23], &[0x11u8, 0x23]);
 | 
				
			||||||
		assert_eq!(*t.root(), trie_root(vec![
 | 
							assert_eq!(*t.root(), trie_root(vec![
 | 
				
			||||||
@ -1095,7 +1118,8 @@ mod tests {
 | 
				
			|||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn insert_into_branch_root() {
 | 
						fn insert_into_branch_root() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
							t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
				
			||||||
		t.insert(&[0xf1u8, 0x23], &[0xf1u8, 0x23]);
 | 
							t.insert(&[0xf1u8, 0x23], &[0xf1u8, 0x23]);
 | 
				
			||||||
		t.insert(&[0x81u8, 0x23], &[0x81u8, 0x23]);
 | 
							t.insert(&[0x81u8, 0x23], &[0x81u8, 0x23]);
 | 
				
			||||||
@ -1109,7 +1133,8 @@ mod tests {
 | 
				
			|||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn insert_value_into_branch_root() {
 | 
						fn insert_value_into_branch_root() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
							t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
				
			||||||
		t.insert(&[], &[0x0]);
 | 
							t.insert(&[], &[0x0]);
 | 
				
			||||||
		assert_eq!(*t.root(), trie_root(vec![
 | 
							assert_eq!(*t.root(), trie_root(vec![
 | 
				
			||||||
@ -1121,7 +1146,8 @@ mod tests {
 | 
				
			|||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn insert_split_leaf() {
 | 
						fn insert_split_leaf() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
							t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
				
			||||||
		t.insert(&[0x01u8, 0x34], &[0x01u8, 0x34]);
 | 
							t.insert(&[0x01u8, 0x34], &[0x01u8, 0x34]);
 | 
				
			||||||
		assert_eq!(*t.root(), trie_root(vec![
 | 
							assert_eq!(*t.root(), trie_root(vec![
 | 
				
			||||||
@ -1133,7 +1159,8 @@ mod tests {
 | 
				
			|||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn insert_split_extenstion() {
 | 
						fn insert_split_extenstion() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		t.insert(&[0x01, 0x23, 0x45], &[0x01]);
 | 
							t.insert(&[0x01, 0x23, 0x45], &[0x01]);
 | 
				
			||||||
		t.insert(&[0x01, 0xf3, 0x45], &[0x02]);
 | 
							t.insert(&[0x01, 0xf3, 0x45], &[0x02]);
 | 
				
			||||||
		t.insert(&[0x01, 0xf3, 0xf5], &[0x03]);
 | 
							t.insert(&[0x01, 0xf3, 0xf5], &[0x03]);
 | 
				
			||||||
@ -1150,7 +1177,8 @@ mod tests {
 | 
				
			|||||||
		let big_value1 = b"11111111111111111111111111111111";
 | 
							let big_value1 = b"11111111111111111111111111111111";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		t.insert(&[0x01u8, 0x23], big_value0);
 | 
							t.insert(&[0x01u8, 0x23], big_value0);
 | 
				
			||||||
		t.insert(&[0x11u8, 0x23], big_value1);
 | 
							t.insert(&[0x11u8, 0x23], big_value1);
 | 
				
			||||||
		assert_eq!(*t.root(), trie_root(vec![
 | 
							assert_eq!(*t.root(), trie_root(vec![
 | 
				
			||||||
@ -1164,7 +1192,8 @@ mod tests {
 | 
				
			|||||||
		let big_value = b"00000000000000000000000000000000";
 | 
							let big_value = b"00000000000000000000000000000000";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		t.insert(&[0x01u8, 0x23], big_value);
 | 
							t.insert(&[0x01u8, 0x23], big_value);
 | 
				
			||||||
		t.insert(&[0x11u8, 0x23], big_value);
 | 
							t.insert(&[0x11u8, 0x23], big_value);
 | 
				
			||||||
		assert_eq!(*t.root(), trie_root(vec![
 | 
							assert_eq!(*t.root(), trie_root(vec![
 | 
				
			||||||
@ -1223,14 +1252,16 @@ mod tests {
 | 
				
			|||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn test_at_empty() {
 | 
						fn test_at_empty() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		assert_eq!(t.at(&[0x5]), None);
 | 
							assert_eq!(t.at(&[0x5]), None);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn test_at_one() {
 | 
						fn test_at_one() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
							t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
				
			||||||
		assert_eq!(t.at(&[0x1, 0x23]).unwrap(), &[0x1u8, 0x23]);
 | 
							assert_eq!(t.at(&[0x1, 0x23]).unwrap(), &[0x1u8, 0x23]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -1238,7 +1269,8 @@ mod tests {
 | 
				
			|||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn test_at_three() {
 | 
						fn test_at_three() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
							t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
				
			||||||
		t.insert(&[0xf1u8, 0x23], &[0xf1u8, 0x23]);
 | 
							t.insert(&[0xf1u8, 0x23], &[0xf1u8, 0x23]);
 | 
				
			||||||
		t.insert(&[0x81u8, 0x23], &[0x81u8, 0x23]);
 | 
							t.insert(&[0x81u8, 0x23], &[0x81u8, 0x23]);
 | 
				
			||||||
@ -1251,7 +1283,8 @@ mod tests {
 | 
				
			|||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn test_print_trie() {
 | 
						fn test_print_trie() {
 | 
				
			||||||
		let mut memdb = MemoryDB::new();
 | 
							let mut memdb = MemoryDB::new();
 | 
				
			||||||
		let mut t = TrieDB::new(&mut memdb);
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
		t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
							t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
				
			||||||
		t.insert(&[0x02u8, 0x23], &[0x01u8, 0x23]);
 | 
							t.insert(&[0x02u8, 0x23], &[0x01u8, 0x23]);
 | 
				
			||||||
		t.insert(&[0xf1u8, 0x23], &[0xf1u8, 0x23]);
 | 
							t.insert(&[0xf1u8, 0x23], &[0xf1u8, 0x23]);
 | 
				
			||||||
@ -1272,11 +1305,13 @@ mod tests {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			let real = trie_root(x.clone());
 | 
								let real = trie_root(x.clone());
 | 
				
			||||||
			let mut memdb = MemoryDB::new();
 | 
								let mut memdb = MemoryDB::new();
 | 
				
			||||||
			let memtrie = populate_trie(&mut memdb, &x);
 | 
								let mut root = H256::new();
 | 
				
			||||||
 | 
								let memtrie = populate_trie(&mut memdb, &mut root, &x);
 | 
				
			||||||
			let mut y = x.clone();
 | 
								let mut y = x.clone();
 | 
				
			||||||
			y.sort_by(|ref a, ref b| a.0.cmp(&b.0));
 | 
								y.sort_by(|ref a, ref b| a.0.cmp(&b.0));
 | 
				
			||||||
			let mut memdb2 = MemoryDB::new();
 | 
								let mut memdb2 = MemoryDB::new();
 | 
				
			||||||
			let memtrie_sorted = populate_trie(&mut memdb2, &y);
 | 
								let mut root2 = H256::new();
 | 
				
			||||||
 | 
								let memtrie_sorted = populate_trie(&mut memdb2, &mut root2, &y);
 | 
				
			||||||
			if *memtrie.root() != real || *memtrie_sorted.root() != real {
 | 
								if *memtrie.root() != real || *memtrie_sorted.root() != real {
 | 
				
			||||||
				println!("TRIE MISMATCH");
 | 
									println!("TRIE MISMATCH");
 | 
				
			||||||
				println!("");
 | 
									println!("");
 | 
				
			||||||
@ -1303,7 +1338,8 @@ mod tests {
 | 
				
			|||||||
			println!("file: {}", file);
 | 
								println!("file: {}", file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			let mut memdb = MemoryDB::new();
 | 
								let mut memdb = MemoryDB::new();
 | 
				
			||||||
			let mut t = TrieDB::new(&mut memdb);
 | 
								let mut root = H256::new();
 | 
				
			||||||
 | 
								let mut t = TrieDB::new(&mut memdb, &mut root);
 | 
				
			||||||
			for operation in input.into_iter() {
 | 
								for operation in input.into_iter() {
 | 
				
			||||||
				match operation {
 | 
									match operation {
 | 
				
			||||||
					trie::Operation::Insert(key, value) => t.insert(&key, &value),
 | 
										trie::Operation::Insert(key, value) => t.insert(&key, &value),
 | 
				
			||||||
@ -1314,4 +1350,18 @@ mod tests {
 | 
				
			|||||||
			assert_eq!(*t.root(), H256::from_slice(&output));
 | 
								assert_eq!(*t.root(), H256::from_slice(&output));
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#[test]
 | 
				
			||||||
 | 
						fn test_trie_existing() {
 | 
				
			||||||
 | 
							let mut root = H256::new();
 | 
				
			||||||
 | 
							let mut db = MemoryDB::new();
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								let mut t = TrieDB::new(&mut db, &mut root);
 | 
				
			||||||
 | 
								t.insert(&[0x01u8, 0x23], &[0x01u8, 0x23]);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							 	let _ = TrieDB::new_pre_existing(&mut db, &mut root);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user