Fix checkpointing when creating contract failed (#9514)
This commit is contained in:
parent
485870296d
commit
631df0fe56
@ -421,16 +421,7 @@ impl<B: Backend> State<B> {
|
||||
**prev = checkpoint;
|
||||
} else {
|
||||
for (k, v) in checkpoint.drain() {
|
||||
match prev.entry(k) {
|
||||
Entry::Occupied(mut e) => {
|
||||
if e.get().is_none() {
|
||||
e.insert(v);
|
||||
}
|
||||
},
|
||||
Entry::Vacant(e) => {
|
||||
e.insert(v);
|
||||
}
|
||||
}
|
||||
prev.entry(k).or_insert(v);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2462,6 +2453,25 @@ mod tests {
|
||||
assert_eq!(state.storage_at(&a, &k).unwrap(), H256::from(U256::from(1)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn create_contract_fail() {
|
||||
let mut state = get_temp_state();
|
||||
let orig_root = state.root().clone();
|
||||
let a: Address = 1000.into();
|
||||
|
||||
state.checkpoint(); // c1
|
||||
state.new_contract(&a, U256::zero(), U256::zero()).unwrap();
|
||||
state.add_balance(&a, &U256::from(1), CleanupMode::ForceCreate).unwrap();
|
||||
state.checkpoint(); // c2
|
||||
state.add_balance(&a, &U256::from(1), CleanupMode::ForceCreate).unwrap();
|
||||
state.discard_checkpoint(); // discard c2
|
||||
state.revert_to_checkpoint(); // revert to c1
|
||||
assert_eq!(state.exists(&a).unwrap(), false);
|
||||
|
||||
state.commit().unwrap();
|
||||
assert_eq!(orig_root, state.root().clone());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn create_empty() {
|
||||
let mut state = get_temp_state();
|
||||
|
Loading…
Reference in New Issue
Block a user