|
|
|
@ -696,18 +696,18 @@ func (s *StateDB) Copy() *StateDB { |
|
|
|
|
db: s.db, |
|
|
|
|
trie: s.db.CopyTrie(s.trie), |
|
|
|
|
originalRoot: s.originalRoot, |
|
|
|
|
accounts: make(map[common.Hash][]byte), |
|
|
|
|
storages: make(map[common.Hash]map[common.Hash][]byte), |
|
|
|
|
accountsOrigin: make(map[common.Address][]byte), |
|
|
|
|
storagesOrigin: make(map[common.Address]map[common.Hash][]byte), |
|
|
|
|
accounts: copySet(s.accounts), |
|
|
|
|
storages: copy2DSet(s.storages), |
|
|
|
|
accountsOrigin: copySet(s.accountsOrigin), |
|
|
|
|
storagesOrigin: copy2DSet(s.storagesOrigin), |
|
|
|
|
stateObjects: make(map[common.Address]*stateObject, len(s.journal.dirties)), |
|
|
|
|
stateObjectsPending: make(map[common.Address]struct{}, len(s.stateObjectsPending)), |
|
|
|
|
stateObjectsDirty: make(map[common.Address]struct{}, len(s.journal.dirties)), |
|
|
|
|
stateObjectsDestruct: make(map[common.Address]*types.StateAccount, len(s.stateObjectsDestruct)), |
|
|
|
|
stateObjectsDestruct: maps.Clone(s.stateObjectsDestruct), |
|
|
|
|
refund: s.refund, |
|
|
|
|
logs: make(map[common.Hash][]*types.Log, len(s.logs)), |
|
|
|
|
logSize: s.logSize, |
|
|
|
|
preimages: make(map[common.Hash][]byte, len(s.preimages)), |
|
|
|
|
preimages: maps.Clone(s.preimages), |
|
|
|
|
journal: newJournal(), |
|
|
|
|
hasher: crypto.NewKeccakState(), |
|
|
|
|
|
|
|
|
@ -750,15 +750,6 @@ func (s *StateDB) Copy() *StateDB { |
|
|
|
|
} |
|
|
|
|
state.stateObjectsDirty[addr] = struct{}{} |
|
|
|
|
} |
|
|
|
|
// Deep copy the destruction markers.
|
|
|
|
|
state.stateObjectsDestruct = maps.Clone(s.stateObjectsDestruct) |
|
|
|
|
|
|
|
|
|
// Deep copy the state changes made in the scope of block
|
|
|
|
|
// along with their original values.
|
|
|
|
|
state.accounts = copySet(s.accounts) |
|
|
|
|
state.storages = copy2DSet(s.storages) |
|
|
|
|
state.accountsOrigin = copySet(state.accountsOrigin) |
|
|
|
|
state.storagesOrigin = copy2DSet(state.storagesOrigin) |
|
|
|
|
|
|
|
|
|
// Deep copy the logs occurred in the scope of block
|
|
|
|
|
for hash, logs := range s.logs { |
|
|
|
@ -769,8 +760,7 @@ func (s *StateDB) Copy() *StateDB { |
|
|
|
|
} |
|
|
|
|
state.logs[hash] = cpy |
|
|
|
|
} |
|
|
|
|
// Deep copy the preimages occurred in the scope of block
|
|
|
|
|
state.preimages = maps.Clone(s.preimages) |
|
|
|
|
|
|
|
|
|
// Do we need to copy the access list and transient storage?
|
|
|
|
|
// In practice: No. At the start of a transaction, these two lists are empty.
|
|
|
|
|
// In practice, we only ever copy state _between_ transactions/blocks, never
|
|
|
|
|