Skip to content
This repository was archived by the owner on Nov 6, 2020. It is now read-only.

Commit 631df0f

Browse files
sorpaas5chdn
authored andcommitted
Fix checkpointing when creating contract failed (#9514)
1 parent 4858702 commit 631df0f

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

ethcore/src/state/mod.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -421,16 +421,7 @@ impl<B: Backend> State<B> {
421421
**prev = checkpoint;
422422
} else {
423423
for (k, v) in checkpoint.drain() {
424-
match prev.entry(k) {
425-
Entry::Occupied(mut e) => {
426-
if e.get().is_none() {
427-
e.insert(v);
428-
}
429-
},
430-
Entry::Vacant(e) => {
431-
e.insert(v);
432-
}
433-
}
424+
prev.entry(k).or_insert(v);
434425
}
435426
}
436427
}
@@ -2462,6 +2453,25 @@ mod tests {
24622453
assert_eq!(state.storage_at(&a, &k).unwrap(), H256::from(U256::from(1)));
24632454
}
24642455

2456+
#[test]
2457+
fn create_contract_fail() {
2458+
let mut state = get_temp_state();
2459+
let orig_root = state.root().clone();
2460+
let a: Address = 1000.into();
2461+
2462+
state.checkpoint(); // c1
2463+
state.new_contract(&a, U256::zero(), U256::zero()).unwrap();
2464+
state.add_balance(&a, &U256::from(1), CleanupMode::ForceCreate).unwrap();
2465+
state.checkpoint(); // c2
2466+
state.add_balance(&a, &U256::from(1), CleanupMode::ForceCreate).unwrap();
2467+
state.discard_checkpoint(); // discard c2
2468+
state.revert_to_checkpoint(); // revert to c1
2469+
assert_eq!(state.exists(&a).unwrap(), false);
2470+
2471+
state.commit().unwrap();
2472+
assert_eq!(orig_root, state.root().clone());
2473+
}
2474+
24652475
#[test]
24662476
fn create_empty() {
24672477
let mut state = get_temp_state();

0 commit comments

Comments
 (0)