parent
fe0bf325a6
commit
ab6419ccd8
|
@ -17,6 +17,8 @@
|
||||||
package state
|
package state
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"maps"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -57,16 +59,10 @@ func newAccessList() *accessList {
|
||||||
// Copy creates an independent copy of an accessList.
|
// Copy creates an independent copy of an accessList.
|
||||||
func (a *accessList) Copy() *accessList {
|
func (a *accessList) Copy() *accessList {
|
||||||
cp := newAccessList()
|
cp := newAccessList()
|
||||||
for k, v := range a.addresses {
|
cp.addresses = maps.Clone(a.addresses)
|
||||||
cp.addresses[k] = v
|
|
||||||
}
|
|
||||||
cp.slots = make([]map[common.Hash]struct{}, len(a.slots))
|
cp.slots = make([]map[common.Hash]struct{}, len(a.slots))
|
||||||
for i, slotMap := range a.slots {
|
for i, slotMap := range a.slots {
|
||||||
newSlotmap := make(map[common.Hash]struct{}, len(slotMap))
|
cp.slots[i] = maps.Clone(slotMap)
|
||||||
for k := range slotMap {
|
|
||||||
newSlotmap[k] = struct{}{}
|
|
||||||
}
|
|
||||||
cp.slots[i] = newSlotmap
|
|
||||||
}
|
}
|
||||||
return cp
|
return cp
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"maps"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
@ -47,11 +48,7 @@ func (s Storage) String() (str string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s Storage) Copy() Storage {
|
func (s Storage) Copy() Storage {
|
||||||
cpy := make(Storage, len(s))
|
return maps.Clone(s)
|
||||||
for key, value := range s {
|
|
||||||
cpy[key] = value
|
|
||||||
}
|
|
||||||
return cpy
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// stateObject represents an Ethereum account which is being modified.
|
// stateObject represents an Ethereum account which is being modified.
|
||||||
|
|
|
@ -19,6 +19,7 @@ package state
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"maps"
|
||||||
"math/big"
|
"math/big"
|
||||||
"slices"
|
"slices"
|
||||||
"sort"
|
"sort"
|
||||||
|
@ -750,9 +751,8 @@ func (s *StateDB) Copy() *StateDB {
|
||||||
state.stateObjectsDirty[addr] = struct{}{}
|
state.stateObjectsDirty[addr] = struct{}{}
|
||||||
}
|
}
|
||||||
// Deep copy the destruction markers.
|
// Deep copy the destruction markers.
|
||||||
for addr, value := range s.stateObjectsDestruct {
|
state.stateObjectsDestruct = maps.Clone(s.stateObjectsDestruct)
|
||||||
state.stateObjectsDestruct[addr] = value
|
|
||||||
}
|
|
||||||
// Deep copy the state changes made in the scope of block
|
// Deep copy the state changes made in the scope of block
|
||||||
// along with their original values.
|
// along with their original values.
|
||||||
state.accounts = copySet(s.accounts)
|
state.accounts = copySet(s.accounts)
|
||||||
|
@ -770,9 +770,7 @@ func (s *StateDB) Copy() *StateDB {
|
||||||
state.logs[hash] = cpy
|
state.logs[hash] = cpy
|
||||||
}
|
}
|
||||||
// Deep copy the preimages occurred in the scope of block
|
// Deep copy the preimages occurred in the scope of block
|
||||||
for hash, preimage := range s.preimages {
|
state.preimages = maps.Clone(s.preimages)
|
||||||
state.preimages[hash] = preimage
|
|
||||||
}
|
|
||||||
// Do we need to copy the access list and transient storage?
|
// 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: No. At the start of a transaction, these two lists are empty.
|
||||||
// In practice, we only ever copy state _between_ transactions/blocks, never
|
// In practice, we only ever copy state _between_ transactions/blocks, never
|
||||||
|
|
Loading…
Reference in New Issue