mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-06-16 20:01:37 +00:00
fix bug
This commit is contained in:
parent
df3d0912c2
commit
4b73f9e293
3 changed files with 33 additions and 8 deletions
|
|
@ -129,6 +129,8 @@ type StateDB struct {
|
||||||
|
|
||||||
// Transient storage
|
// Transient storage
|
||||||
transientStorage transientStorage
|
transientStorage transientStorage
|
||||||
|
// Overrides to apply after Prepare()
|
||||||
|
pendingTransientOverrides map[common.Address]map[common.Hash]common.Hash
|
||||||
|
|
||||||
// Journal of state modifications. This is the backbone of
|
// Journal of state modifications. This is the backbone of
|
||||||
// Snapshot and RevertToSnapshot.
|
// Snapshot and RevertToSnapshot.
|
||||||
|
|
@ -1465,6 +1467,22 @@ func (s *StateDB) Prepare(rules params.Rules, sender, coinbase common.Address, d
|
||||||
}
|
}
|
||||||
// Reset transient storage at the beginning of transaction execution
|
// Reset transient storage at the beginning of transaction execution
|
||||||
s.transientStorage = newTransientStorage()
|
s.transientStorage = newTransientStorage()
|
||||||
|
|
||||||
|
// Apply any pending transient storage overrides after reset
|
||||||
|
if s.pendingTransientOverrides != nil {
|
||||||
|
for addr, storage := range s.pendingTransientOverrides {
|
||||||
|
for key, value := range storage {
|
||||||
|
s.transientStorage.Set(addr, key, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s.pendingTransientOverrides = nil // Clear after applying
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetPendingTransientOverrides stores transient storage overrides to be applied
|
||||||
|
// after the next Prepare() call. This ensures overrides are applied to a clean state.
|
||||||
|
func (s *StateDB) SetPendingTransientOverrides(overrides map[common.Address]map[common.Hash]common.Hash) {
|
||||||
|
s.pendingTransientOverrides = overrides
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddAddressToAccessList adds the given address to the access list
|
// AddAddressToAccessList adds the given address to the access list
|
||||||
|
|
|
||||||
|
|
@ -1301,8 +1301,8 @@ func TestCall(t *testing.T) {
|
||||||
},
|
},
|
||||||
overrides: override.StateOverride{
|
overrides: override.StateOverride{
|
||||||
randomAccounts[2].addr: override.OverrideAccount{
|
randomAccounts[2].addr: override.OverrideAccount{
|
||||||
// PUSH1 0x01 PUSH1 0x00 TSTORE PUSH1 0x00 TLOAD PUSH1 0x00 MSTORE PUSH1 0x20 PUSH1 0x00 RETURN
|
// PUSH1 0x00 TLOAD PUSH1 0x00 MSTORE PUSH1 0x20 PUSH1 0x00 RETURN
|
||||||
Code: hex2Bytes("0x600160005d60005c60005260206000f3"),
|
Code: hex2Bytes("0x60005c60005260206000f3"),
|
||||||
TransientStorage: map[common.Hash]common.Hash{
|
TransientStorage: map[common.Hash]common.Hash{
|
||||||
common.Hash{}: common.HexToHash("0xabcd"),
|
common.Hash{}: common.HexToHash("0xabcd"),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,19 @@ func (diff *StateOverride) Apply(statedb *state.StateDB, precompiles vm.Precompi
|
||||||
if diff == nil {
|
if diff == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
// Get transient storage overrides to apply after Prepare()
|
||||||
|
transientOverrides := make(map[common.Address]map[common.Hash]common.Hash)
|
||||||
|
for addr, account := range *diff {
|
||||||
|
if account.TransientStorage != nil && len(account.TransientStorage) > 0 {
|
||||||
|
transientOverrides[addr] = account.TransientStorage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store transient storage overrides
|
||||||
|
if len(transientOverrides) > 0 {
|
||||||
|
statedb.SetPendingTransientOverrides(transientOverrides)
|
||||||
|
}
|
||||||
|
|
||||||
// Iterate in deterministic order so error messages and behavior are stable (e.g. for tests).
|
// Iterate in deterministic order so error messages and behavior are stable (e.g. for tests).
|
||||||
addrs := slices.SortedFunc(maps.Keys(*diff), common.Address.Cmp)
|
addrs := slices.SortedFunc(maps.Keys(*diff), common.Address.Cmp)
|
||||||
|
|
||||||
|
|
@ -118,12 +131,6 @@ func (diff *StateOverride) Apply(statedb *state.StateDB, precompiles vm.Precompi
|
||||||
statedb.SetState(addr, key, value)
|
statedb.SetState(addr, key, value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Apply transient storage overrides.
|
|
||||||
if account.TransientStorage != nil {
|
|
||||||
for key, value := range account.TransientStorage {
|
|
||||||
statedb.SetTransientState(addr, key, value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Now finalize the changes. Finalize is normally performed between transactions.
|
// Now finalize the changes. Finalize is normally performed between transactions.
|
||||||
// By using finalize, the overrides are semantically behaving as
|
// By using finalize, the overrides are semantically behaving as
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue