mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-17 18:30:45 +00:00
parent
3fed9ebeb8
commit
bbc4612d9f
3 changed files with 12 additions and 34 deletions
|
|
@ -80,7 +80,6 @@ type stateObject struct {
|
||||||
originStorage Storage // Storage cache of original entries to dedup rewrites, reset for every transaction
|
originStorage Storage // Storage cache of original entries to dedup rewrites, reset for every transaction
|
||||||
pendingStorage Storage // Storage entries that need to be flushed to disk, at the end of an entire block
|
pendingStorage Storage // Storage entries that need to be flushed to disk, at the end of an entire block
|
||||||
dirtyStorage Storage // Storage entries that need to be flushed to disk
|
dirtyStorage Storage // Storage entries that need to be flushed to disk
|
||||||
fakeStorage Storage // Fake storage which constructed by caller for debugging purpose.
|
|
||||||
|
|
||||||
// Cache flags.
|
// Cache flags.
|
||||||
dirtyCode bool // true if the code was updated
|
dirtyCode bool // true if the code was updated
|
||||||
|
|
@ -168,10 +167,6 @@ func (s *stateObject) getTrie(db Database) (Trie, error) {
|
||||||
|
|
||||||
// GetState retrieves a value from the account storage trie.
|
// GetState retrieves a value from the account storage trie.
|
||||||
func (s *stateObject) GetState(db Database, key common.Hash) common.Hash {
|
func (s *stateObject) GetState(db Database, key common.Hash) common.Hash {
|
||||||
// If the fake storage is set, only lookup the state here(in the debugging mode)
|
|
||||||
if s.fakeStorage != nil {
|
|
||||||
return s.fakeStorage[key]
|
|
||||||
}
|
|
||||||
// If we have a dirty value for this state entry, return it
|
// If we have a dirty value for this state entry, return it
|
||||||
value, dirty := s.dirtyStorage[key]
|
value, dirty := s.dirtyStorage[key]
|
||||||
if dirty {
|
if dirty {
|
||||||
|
|
@ -182,10 +177,6 @@ func (s *stateObject) GetState(db Database, key common.Hash) common.Hash {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *stateObject) GetCommittedState(db Database, key common.Hash) common.Hash {
|
func (s *stateObject) GetCommittedState(db Database, key common.Hash) common.Hash {
|
||||||
// If the fake storage is set, only lookup the state here(in the debugging mode)
|
|
||||||
if s.fakeStorage != nil {
|
|
||||||
return s.fakeStorage[key]
|
|
||||||
}
|
|
||||||
// If we have a pending write or clean cached, return that
|
// If we have a pending write or clean cached, return that
|
||||||
if value, pending := s.pendingStorage[key]; pending {
|
if value, pending := s.pendingStorage[key]; pending {
|
||||||
return value
|
return value
|
||||||
|
|
@ -230,11 +221,6 @@ func (s *stateObject) GetCommittedState(db Database, key common.Hash) common.Has
|
||||||
|
|
||||||
// SetState updates a value in account storage.
|
// SetState updates a value in account storage.
|
||||||
func (s *stateObject) SetState(db Database, key, value common.Hash) {
|
func (s *stateObject) SetState(db Database, key, value common.Hash) {
|
||||||
// If the fake storage is set, put the temporary state update here.
|
|
||||||
if s.fakeStorage != nil {
|
|
||||||
s.fakeStorage[key] = value
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// If the new value is the same as old, don't set
|
// If the new value is the same as old, don't set
|
||||||
prev := s.GetState(db, key)
|
prev := s.GetState(db, key)
|
||||||
if prev == value {
|
if prev == value {
|
||||||
|
|
@ -249,24 +235,6 @@ func (s *stateObject) SetState(db Database, key, value common.Hash) {
|
||||||
s.setState(key, value)
|
s.setState(key, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetStorage replaces the entire state storage with the given one.
|
|
||||||
//
|
|
||||||
// After this function is called, all original state will be ignored and state
|
|
||||||
// lookup only happens in the fake state storage.
|
|
||||||
//
|
|
||||||
// Note this function should only be used for debugging purpose.
|
|
||||||
func (s *stateObject) SetStorage(storage map[common.Hash]common.Hash) {
|
|
||||||
// Allocate fake storage if it's nil.
|
|
||||||
if s.fakeStorage == nil {
|
|
||||||
s.fakeStorage = make(Storage, len(storage))
|
|
||||||
}
|
|
||||||
for key, value := range storage {
|
|
||||||
s.fakeStorage[key] = value
|
|
||||||
}
|
|
||||||
// Don't bother journal since this function should only be used for
|
|
||||||
// debugging and the `fake` storage won't be committed to database.
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stateObject) setState(key, value common.Hash) {
|
func (s *stateObject) setState(key, value common.Hash) {
|
||||||
s.dirtyStorage[key] = value
|
s.dirtyStorage[key] = value
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -412,9 +412,15 @@ func (s *StateDB) SetState(addr common.Address, key, value common.Hash) {
|
||||||
// SetStorage replaces the entire storage for the specified account with given
|
// SetStorage replaces the entire storage for the specified account with given
|
||||||
// storage. This function should only be used for debugging.
|
// storage. This function should only be used for debugging.
|
||||||
func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) {
|
func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) {
|
||||||
|
// SetStorage needs to wipe existing storage. We achieve this by pretending
|
||||||
|
// that the account self-destructed earlier in this block, by flagging
|
||||||
|
// it in stateObjectsDestruct. The effect of doing so is that storage lookups
|
||||||
|
// will not hit disk, since it is assumed that the disk-data is belonging
|
||||||
|
// to a previous incarnation of the object.
|
||||||
|
s.stateObjectsDestruct[addr] = struct{}{}
|
||||||
stateObject := s.GetOrNewStateObject(addr)
|
stateObject := s.GetOrNewStateObject(addr)
|
||||||
if stateObject != nil {
|
for k, v := range storage {
|
||||||
stateObject.SetStorage(storage)
|
stateObject.SetState(s.db, k, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -572,6 +572,10 @@ func (diff *StateOverride) Apply(state *state.StateDB) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Now finalize the changes. Finalize is normally performed between transactions.
|
||||||
|
// By using finalize, the overrides are semantically behaving as
|
||||||
|
// if they were created in a transaction just before the tracing occur.
|
||||||
|
state.Finalise(false)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue