aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgary rong <garyrong0905@gmail.com>2019-04-05 14:44:02 +0800
committerPéter Szilágyi <peterke@gmail.com>2019-04-05 14:44:02 +0800
commit36f81118f6d00713dbf8d1caf168ad937e0f1a90 (patch)
tree8c816e30b7ed748fdbdb2e73d9fbcc070ea7b500
parent7dd3194710f1659067f4f1113ce802dd741b1464 (diff)
downloadgo-tangerine-36f81118f6d00713dbf8d1caf168ad937e0f1a90.tar
go-tangerine-36f81118f6d00713dbf8d1caf168ad937e0f1a90.tar.gz
go-tangerine-36f81118f6d00713dbf8d1caf168ad937e0f1a90.tar.bz2
go-tangerine-36f81118f6d00713dbf8d1caf168ad937e0f1a90.tar.lz
go-tangerine-36f81118f6d00713dbf8d1caf168ad937e0f1a90.tar.xz
go-tangerine-36f81118f6d00713dbf8d1caf168ad937e0f1a90.tar.zst
go-tangerine-36f81118f6d00713dbf8d1caf168ad937e0f1a90.zip
core/state: fix state iterator (#19127)
* core/state: fix state iterator * core: fix state iterator more elegant
-rw-r--r--core/state/statedb.go21
-rw-r--r--core/vm/interface.go2
2 files changed, 18 insertions, 5 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.
diff --git a/core/vm/interface.go b/core/vm/interface.go
index fc15082f1..dd401466a 100644
--- a/core/vm/interface.go
+++ b/core/vm/interface.go
@@ -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