core/state: fix an account resurrection issue
This commit is contained in:
parent
06d4470b41
commit
92ec07d63b
@ -297,18 +297,11 @@ func (s *stateObject) updateTrie(db Database) Trie {
|
|||||||
// Retrieve the snapshot storage map for the object
|
// Retrieve the snapshot storage map for the object
|
||||||
var storage map[common.Hash][]byte
|
var storage map[common.Hash][]byte
|
||||||
if s.db.snap != nil {
|
if s.db.snap != nil {
|
||||||
// Retrieve the old storage map, if available
|
// Retrieve the old storage map, if available, create a new one otherwise
|
||||||
s.db.snapLock.RLock()
|
|
||||||
storage = s.db.snapStorage[s.addrHash]
|
storage = s.db.snapStorage[s.addrHash]
|
||||||
s.db.snapLock.RUnlock()
|
|
||||||
|
|
||||||
// If no old storage map was available, create a new one
|
|
||||||
if storage == nil {
|
if storage == nil {
|
||||||
storage = make(map[common.Hash][]byte)
|
storage = make(map[common.Hash][]byte)
|
||||||
|
|
||||||
s.db.snapLock.Lock()
|
|
||||||
s.db.snapStorage[s.addrHash] = storage
|
s.db.snapStorage[s.addrHash] = storage
|
||||||
s.db.snapLock.Unlock()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Insert all the pending updates into the trie
|
// Insert all the pending updates into the trie
|
||||||
|
@ -22,7 +22,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
"sort"
|
"sort"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
@ -72,7 +71,6 @@ type StateDB struct {
|
|||||||
snap snapshot.Snapshot
|
snap snapshot.Snapshot
|
||||||
snapAccounts map[common.Hash][]byte
|
snapAccounts map[common.Hash][]byte
|
||||||
snapStorage map[common.Hash]map[common.Hash][]byte
|
snapStorage map[common.Hash]map[common.Hash][]byte
|
||||||
snapLock sync.RWMutex // Lock for the concurrent storage updaters
|
|
||||||
|
|
||||||
// This map holds 'live' objects, which will get modified while processing a state transition.
|
// This map holds 'live' objects, which will get modified while processing a state transition.
|
||||||
stateObjects map[common.Address]*stateObject
|
stateObjects map[common.Address]*stateObject
|
||||||
@ -468,6 +466,10 @@ func (s *StateDB) updateStateObject(obj *stateObject) {
|
|||||||
|
|
||||||
// If state snapshotting is active, cache the data til commit
|
// If state snapshotting is active, cache the data til commit
|
||||||
if s.snap != nil {
|
if s.snap != nil {
|
||||||
|
// If the account is an empty resurrection, unmark the storage nil-ness
|
||||||
|
if storage, ok := s.snapStorage[obj.addrHash]; storage == nil && ok {
|
||||||
|
delete(s.snapStorage, obj.addrHash)
|
||||||
|
}
|
||||||
s.snapAccounts[obj.addrHash] = snapshot.AccountRLP(obj.data.Nonce, obj.data.Balance, obj.data.Root, obj.data.CodeHash)
|
s.snapAccounts[obj.addrHash] = snapshot.AccountRLP(obj.data.Nonce, obj.data.Balance, obj.data.Root, obj.data.CodeHash)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -484,10 +486,8 @@ func (s *StateDB) deleteStateObject(obj *stateObject) {
|
|||||||
|
|
||||||
// If state snapshotting is active, cache the data til commit
|
// If state snapshotting is active, cache the data til commit
|
||||||
if s.snap != nil {
|
if s.snap != nil {
|
||||||
s.snapLock.Lock()
|
|
||||||
s.snapAccounts[obj.addrHash] = nil // We need to maintain account deletions explicitly
|
s.snapAccounts[obj.addrHash] = nil // We need to maintain account deletions explicitly
|
||||||
s.snapStorage[obj.addrHash] = nil // We need to maintain storage deletions explicitly
|
s.snapStorage[obj.addrHash] = nil // We need to maintain storage deletions explicitly
|
||||||
s.snapLock.Unlock()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user