|
|
@@ -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.
|