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