From 678e27d4e374a44604794cbaa01c24c9e3d8810a Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Wed, 12 Sep 2018 02:49:43 +0800 Subject: [PATCH] state: test when contract creation fails, old storage values should re-appear --- ethcore/src/state/mod.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/ethcore/src/state/mod.rs b/ethcore/src/state/mod.rs index 98f877617d0..56de95b5257 100644 --- a/ethcore/src/state/mod.rs +++ b/ethcore/src/state/mod.rs @@ -2472,6 +2472,33 @@ mod tests { assert_eq!(orig_root, state.root().clone()); } + #[test] + fn create_contract_fail_previous_storage() { + let mut state = get_temp_state(); + let a: Address = 1000.into(); + let k = H256::from(U256::from(0)); + + state.set_storage(&a, k, H256::from(U256::from(0xffff))).unwrap(); + state.commit().unwrap(); + state.clear(); + + let orig_root = state.root().clone(); + assert_eq!(state.storage_at(&a, &k).unwrap(), H256::from(U256::from(0xffff))); + state.clear(); + + state.checkpoint(); // c1 + state.new_contract(&a, U256::zero(), U256::zero()).unwrap(); + state.checkpoint(); // c2 + state.set_storage(&a, k, H256::from(U256::from(2))).unwrap(); + state.revert_to_checkpoint(); // revert to c2 + assert_eq!(state.storage_at(&a, &k).unwrap(), H256::from(U256::from(0))); + state.revert_to_checkpoint(); // revert to c1 + assert_eq!(state.storage_at(&a, &k).unwrap(), H256::from(U256::from(0xffff))); + + state.commit().unwrap(); + assert_eq!(orig_root, state.root().clone()); + } + #[test] fn create_empty() { let mut state = get_temp_state();