mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 18:32:23 +00:00
fix storage clearing
This commit is contained in:
parent
c5e33fac0e
commit
d4e332e268
3 changed files with 129 additions and 0 deletions
|
|
@ -418,6 +418,15 @@ func (s *stateObject) deepCopy(db *StateDB) *stateObject {
|
||||||
return stateObject
|
return stateObject
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// clearStorageCache clears the various storage caches
|
||||||
|
// belonging to the state object.
|
||||||
|
// It is only used for RPC.
|
||||||
|
func (s *stateObject) clearStorageCache() {
|
||||||
|
s.dirtyStorage = make(Storage)
|
||||||
|
s.originStorage = make(Storage)
|
||||||
|
s.pendingStorage = make(Storage)
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Attribute accessors
|
// Attribute accessors
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -448,6 +448,9 @@ func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common
|
||||||
// to a previous incarnation of the object.
|
// to a previous incarnation of the object.
|
||||||
s.stateObjectsDestruct[addr] = struct{}{}
|
s.stateObjectsDestruct[addr] = struct{}{}
|
||||||
stateObject := s.GetOrNewStateObject(addr)
|
stateObject := s.GetOrNewStateObject(addr)
|
||||||
|
// If object was already in memory, it might have cached
|
||||||
|
// storage slots. These should be cleared.
|
||||||
|
stateObject.clearStorageCache()
|
||||||
for k, v := range storage {
|
for k, v := range storage {
|
||||||
stateObject.SetState(s.db, k, v)
|
stateObject.SetState(s.db, k, v)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -640,6 +640,7 @@ func TestMulticallV1(t *testing.T) {
|
||||||
genBlocks = 10
|
genBlocks = 10
|
||||||
signer = types.HomesteadSigner{}
|
signer = types.HomesteadSigner{}
|
||||||
cac = common.HexToAddress("0x0000000000000000000000000000000000000cac")
|
cac = common.HexToAddress("0x0000000000000000000000000000000000000cac")
|
||||||
|
bab = common.HexToAddress("0x0000000000000000000000000000000000000bab")
|
||||||
coinbase = "0x000000000000000000000000000000000000ffff"
|
coinbase = "0x000000000000000000000000000000000000ffff"
|
||||||
genesis = &core.Genesis{
|
genesis = &core.Genesis{
|
||||||
Config: params.TestChainConfig,
|
Config: params.TestChainConfig,
|
||||||
|
|
@ -655,6 +656,30 @@ func TestMulticallV1(t *testing.T) {
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
cac: {Balance: big.NewInt(params.Ether), Code: common.Hex2Bytes("610dad80ff")},
|
cac: {Balance: big.NewInt(params.Ether), Code: common.Hex2Bytes("610dad80ff")},
|
||||||
|
bab: {
|
||||||
|
Balance: big.NewInt(1),
|
||||||
|
// object "Test" {
|
||||||
|
// code {
|
||||||
|
// let value1 := sload(1)
|
||||||
|
// let value2 := sload(2)
|
||||||
|
//
|
||||||
|
// // Shift value1 by 128 bits to the left by multiplying it with 2^128
|
||||||
|
// value1 := mul(value1, 0x100000000000000000000000000000000)
|
||||||
|
//
|
||||||
|
// // Concatenate value1 and value2
|
||||||
|
// let concatenatedValue := add(value1, value2)
|
||||||
|
//
|
||||||
|
// // Store the result in memory and return it
|
||||||
|
// mstore(0, concatenatedValue)
|
||||||
|
// return(0, 0x20)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
Code: common.FromHex("0x600154600254700100000000000000000000000000000000820291508082018060005260206000f3"),
|
||||||
|
Storage: map[common.Hash]common.Hash{
|
||||||
|
common.BigToHash(big.NewInt(1)): common.BigToHash(big.NewInt(10)),
|
||||||
|
common.BigToHash(big.NewInt(2)): common.BigToHash(big.NewInt(12)),
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
n10hash = crypto.Keccak256Hash([]byte{0xa}).Hex()
|
n10hash = crypto.Keccak256Hash([]byte{0xa}).Hex()
|
||||||
|
|
@ -1195,6 +1220,11 @@ func TestMulticallV1(t *testing.T) {
|
||||||
// }
|
// }
|
||||||
Input: hex2Bytes("610cac610dad600082311115601357600080fd5b6000823b1115602157600080fd5b6000813103602e57600080fd5b5050"),
|
Input: hex2Bytes("610cac610dad600082311115601357600080fd5b6000823b1115602157600080fd5b6000813103602e57600080fd5b5050"),
|
||||||
}},
|
}},
|
||||||
|
}, {
|
||||||
|
Calls: []TransactionArgs{{
|
||||||
|
From: &accounts[0].addr,
|
||||||
|
Input: hex2Bytes("610cac610dad600082311115601357600080fd5b6000823b1115602157600080fd5b6000813103602e57600080fd5b5050"),
|
||||||
|
}},
|
||||||
}},
|
}},
|
||||||
want: []blockRes{{
|
want: []blockRes{{
|
||||||
Number: "0xa",
|
Number: "0xa",
|
||||||
|
|
@ -1213,6 +1243,18 @@ func TestMulticallV1(t *testing.T) {
|
||||||
Logs: []types.Log{},
|
Logs: []types.Log{},
|
||||||
Status: "0x1",
|
Status: "0x1",
|
||||||
}},
|
}},
|
||||||
|
}, {
|
||||||
|
Number: "0xa",
|
||||||
|
Hash: n10hash,
|
||||||
|
GasLimit: "0x47e7c4",
|
||||||
|
GasUsed: "0xe6d9",
|
||||||
|
FeeRecipient: coinbase,
|
||||||
|
Calls: []callRes{{
|
||||||
|
ReturnValue: "0x",
|
||||||
|
GasUsed: "0xe6d9",
|
||||||
|
Logs: []types.Log{},
|
||||||
|
Status: "0x1",
|
||||||
|
}},
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
// Enable validation checks.
|
// Enable validation checks.
|
||||||
|
|
@ -1242,6 +1284,76 @@ func TestMulticallV1(t *testing.T) {
|
||||||
}},
|
}},
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
|
// Clear storage.
|
||||||
|
{
|
||||||
|
name: "clear-storage",
|
||||||
|
tag: latest,
|
||||||
|
blocks: []CallBatch{{
|
||||||
|
StateOverrides: &StateOverride{
|
||||||
|
randomAccounts[2].addr: {
|
||||||
|
Code: newBytes(genesis.Alloc[bab].Code),
|
||||||
|
StateDiff: &map[common.Hash]common.Hash{
|
||||||
|
common.BigToHash(big.NewInt(1)): common.BigToHash(big.NewInt(2)),
|
||||||
|
common.BigToHash(big.NewInt(2)): common.BigToHash(big.NewInt(3)),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
bab: {
|
||||||
|
State: &map[common.Hash]common.Hash{
|
||||||
|
common.BigToHash(big.NewInt(1)): common.BigToHash(big.NewInt(1)),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Calls: []TransactionArgs{{
|
||||||
|
From: &accounts[0].addr,
|
||||||
|
To: &randomAccounts[2].addr,
|
||||||
|
}, {
|
||||||
|
From: &accounts[0].addr,
|
||||||
|
To: &bab,
|
||||||
|
}},
|
||||||
|
}, {
|
||||||
|
StateOverrides: &StateOverride{
|
||||||
|
randomAccounts[2].addr: {
|
||||||
|
State: &map[common.Hash]common.Hash{
|
||||||
|
common.BigToHash(big.NewInt(1)): common.BigToHash(big.NewInt(5)),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Calls: []TransactionArgs{{
|
||||||
|
From: &accounts[0].addr,
|
||||||
|
To: &randomAccounts[2].addr,
|
||||||
|
}},
|
||||||
|
}},
|
||||||
|
want: []blockRes{{
|
||||||
|
Number: "0xa",
|
||||||
|
Hash: n10hash,
|
||||||
|
GasLimit: "0x47e7c4",
|
||||||
|
GasUsed: "0xc542",
|
||||||
|
FeeRecipient: coinbase,
|
||||||
|
Calls: []callRes{{
|
||||||
|
ReturnValue: "0x0000000000000000000000000000000200000000000000000000000000000003",
|
||||||
|
GasUsed: "0x62a1",
|
||||||
|
Logs: []types.Log{},
|
||||||
|
Status: "0x1",
|
||||||
|
}, {
|
||||||
|
ReturnValue: "0x0000000000000000000000000000000100000000000000000000000000000000",
|
||||||
|
GasUsed: "0x62a1",
|
||||||
|
Logs: []types.Log{},
|
||||||
|
Status: "0x1",
|
||||||
|
}},
|
||||||
|
}, {
|
||||||
|
Number: "0xa",
|
||||||
|
Hash: n10hash,
|
||||||
|
GasLimit: "0x47e7c4",
|
||||||
|
GasUsed: "0x62a1",
|
||||||
|
FeeRecipient: coinbase,
|
||||||
|
Calls: []callRes{{
|
||||||
|
ReturnValue: "0x0000000000000000000000000000000500000000000000000000000000000000",
|
||||||
|
GasUsed: "0x62a1",
|
||||||
|
Logs: []types.Log{},
|
||||||
|
Status: "0x1",
|
||||||
|
}},
|
||||||
|
}},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range testSuite {
|
for _, tc := range testSuite {
|
||||||
|
|
@ -1318,6 +1430,11 @@ func newUint64(v uint64) *hexutil.Uint64 {
|
||||||
return &rpcUint64
|
return &rpcUint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newBytes(b []byte) *hexutil.Bytes {
|
||||||
|
rpcBytes := hexutil.Bytes(b)
|
||||||
|
return &rpcBytes
|
||||||
|
}
|
||||||
|
|
||||||
// testHasher is the helper tool for transaction/receipt list hashing.
|
// testHasher is the helper tool for transaction/receipt list hashing.
|
||||||
// The original hasher is trie, in order to get rid of import cycle,
|
// The original hasher is trie, in order to get rid of import cycle,
|
||||||
// use the testing hasher instead.
|
// use the testing hasher instead.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue