aboutsummaryrefslogtreecommitdiffstats
path: root/core/state
diff options
context:
space:
mode:
Diffstat (limited to 'core/state')
-rw-r--r--core/state/statedb.go21
1 files changed, 17 insertions, 4 deletions
diff --git a/core/state/statedb.go b/core/state/statedb.go
index db2e0d5e0..3bb9862ed 100644
--- a/core/state/statedb.go
+++ b/core/state/statedb.go
@@ -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.