diff --git a/src/account.rs b/src/account.rs index 44a07738b..658144654 100644 --- a/src/account.rs +++ b/src/account.rs @@ -182,14 +182,14 @@ impl Account { /// Commit the `storage_overlay` to the backing DB and update `storage_root`. pub fn commit_storage(&mut self, db: &mut HashDB) { - let mut t = SecTrieDBMut::new(db, &mut self.storage_root); + let mut t = SecTrieDBMut::from_existing(db, &mut self.storage_root); for (k, &mut (ref mut f, ref mut v)) in self.storage_overlay.borrow_mut().iter_mut() { if f == &Filth::Dirty { // cast key and value to trait type, // so we can call overloaded `to_bytes` method match v.is_zero() { - true => t.remove(k), - false => t.insert(k, &encode(&U256::from(v.as_slice()))), + true => { t.remove(k); }, + false => { t.insert(k, &encode(&U256::from(v.as_slice()))); }, } *f = Filth::Clean; } @@ -272,12 +272,25 @@ mod tests { fn commit_storage() { let mut a = Account::new_contract(U256::from(69u8)); let mut db = OverlayDB::new_temp(); - a.set_storage(H256::from(&U256::from(0x00u64)), H256::from(&U256::from(0x1234u64))); + a.set_storage(x!(0), x!(0x1234)); assert_eq!(a.storage_root(), None); a.commit_storage(&mut db); assert_eq!(a.storage_root().unwrap().hex(), "c57e1afb758b07f8d2c8f13a3b6e44fa5ff94ab266facc5a4fd3f062426e50b2"); } + #[test] + fn commit_remove_commit_storage() { + let mut a = Account::new_contract(U256::from(69u8)); + let mut db = OverlayDB::new_temp(); + a.set_storage(x!(0), x!(0x1234)); + a.commit_storage(&mut db); + a.set_storage(x!(1), x!(0x1234)); + a.commit_storage(&mut db); + a.set_storage(x!(1), x!(0)); + a.commit_storage(&mut db); + assert_eq!(a.storage_root().unwrap().hex(), "c57e1afb758b07f8d2c8f13a3b6e44fa5ff94ab266facc5a4fd3f062426e50b2"); + } + #[test] fn commit_code() { let mut a = Account::new_contract(U256::from(69u8));