diff --git a/core/state/journal.go b/core/state/journal.go index f3f976f24f..fdbab73edd 100644 --- a/core/state/journal.go +++ b/core/state/journal.go @@ -110,10 +110,17 @@ func (j *journal) append(entry journalEntry) { func (j *journal) revert(statedb *StateDB, snapshot int) { for i := len(j.entries) - 1; i >= snapshot; i-- { // Undo the changes made by the operation - j.entries[i].revert(statedb) + entry := j.entries[i] + if addr := entry.dirtied(); addr != nil { + if statedb.getStateObject(*addr) == nil { + // State object was deleted, recreate it for safe reversion + statedb.createObject(*addr) + } + } + entry.revert(statedb) // Drop any dirty tracking induced by the change - if addr := j.entries[i].dirtied(); addr != nil { + if addr := entry.dirtied(); addr != nil { if j.dirties[*addr]--; j.dirties[*addr] == 0 { delete(j.dirties, *addr) }