core/state: fix an account resurrection issue

This commit is contained in:
Péter Szilágyi 2020-02-27 15:03:10 +02:00
parent 06d4470b41
commit 92ec07d63b
No known key found for this signature in database
GPG Key ID: E9AE538CEDF8293D
2 changed files with 5 additions and 12 deletions

View File

@ -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

View File

@ -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()
} }
} }