Skip to content

Commit

Permalink
core/state: fix state iterator (#19127)
Browse files Browse the repository at this point in the history
* core/state: fix state iterator

* core: fix state iterator more elegant
  • Loading branch information
rjl493456442 authored and karalabe committed Apr 5, 2019
1 parent 7dd3194 commit 36f8111
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 5 deletions.
21 changes: 17 additions & 4 deletions core/state/statedb.go
Original file line number Diff line number Diff line change
Expand Up @@ -515,20 +515,33 @@ func (self *StateDB) CreateAccount(addr common.Address) {
}
}

func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) {
func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) error {
so := db.getStateObject(addr)
if so == nil {
return
return nil
}
it := trie.NewIterator(so.getTrie(db.db).NodeIterator(nil))

for it.Next() {
key := common.BytesToHash(db.trie.GetKey(it.Key))
if value, dirty := so.dirtyStorage[key]; dirty {
cb(key, value)
if !cb(key, value) {
return nil
}
continue
}
cb(key, common.BytesToHash(it.Value))

if len(it.Value) > 0 {
_, content, _, err := rlp.Split(it.Value)
if err != nil {
return err
}
if !cb(key, common.BytesToHash(content)) {
return nil
}
}
}
return nil
}

// Copy creates a deep, independent copy of the state.
Expand Down
2 changes: 1 addition & 1 deletion core/vm/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ type StateDB interface {
AddLog(*types.Log)
AddPreimage(common.Hash, []byte)

ForEachStorage(common.Address, func(common.Hash, common.Hash) bool)
ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) error
}

// CallContext provides a basic interface for the EVM calling conventions. The EVM
Expand Down

0 comments on commit 36f8111

Please sign in to comment.