|
|
|
@ -22,7 +22,6 @@ import ( |
|
|
|
|
"fmt" |
|
|
|
|
"math/big" |
|
|
|
|
"sort" |
|
|
|
|
"sync" |
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
@ -72,7 +71,6 @@ type StateDB struct { |
|
|
|
|
snap snapshot.Snapshot |
|
|
|
|
snapAccounts 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.
|
|
|
|
|
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 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) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -484,10 +486,8 @@ func (s *StateDB) deleteStateObject(obj *stateObject) { |
|
|
|
|
|
|
|
|
|
// If state snapshotting is active, cache the data til commit
|
|
|
|
|
if s.snap != nil { |
|
|
|
|
s.snapLock.Lock() |
|
|
|
|
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.snapLock.Unlock() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|