Commit 2b247595 authored by Mark Tyneway's avatar Mark Tyneway Committed by GitHub

state-surgery: safer memorydb (#3261)

Do not overwrite accounts that already exist when
creating accounts with the memory db. Also panic
if trying to set state in an account that doesn't
yet exist in the state.
Co-authored-by: default avatarmergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
parent 692ca3ff
...@@ -60,12 +60,15 @@ func (db *MemoryStateDB) CreateAccount(addr common.Address) { ...@@ -60,12 +60,15 @@ func (db *MemoryStateDB) CreateAccount(addr common.Address) {
db.rw.Lock() db.rw.Lock()
defer db.rw.Unlock() defer db.rw.Unlock()
db.genesis.Alloc[addr] = core.GenesisAccount{ if _, ok := db.genesis.Alloc[addr]; !ok {
Code: []byte{}, db.genesis.Alloc[addr] = core.GenesisAccount{
Storage: make(map[common.Hash]common.Hash), Code: []byte{},
Balance: big.NewInt(0), Storage: make(map[common.Hash]common.Hash),
Nonce: 0, Balance: big.NewInt(0),
Nonce: 0,
}
} }
} }
func (db *MemoryStateDB) SubBalance(addr common.Address, amount *big.Int) { func (db *MemoryStateDB) SubBalance(addr common.Address, amount *big.Int) {
...@@ -216,7 +219,7 @@ func (db *MemoryStateDB) SetState(addr common.Address, key, value common.Hash) { ...@@ -216,7 +219,7 @@ func (db *MemoryStateDB) SetState(addr common.Address, key, value common.Hash) {
account, ok := db.genesis.Alloc[addr] account, ok := db.genesis.Alloc[addr]
if !ok { if !ok {
return panic(fmt.Sprintf("%s not in state", addr))
} }
account.Storage[key] = value account.Storage[key] = value
db.genesis.Alloc[addr] = account db.genesis.Alloc[addr] = account
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment