提交 e44b2dc8 编写于 作者: N Nick Johnson 提交者: Péter Szilágyi

[release 1.4.12] core/state: Fix memory expansion bug by not copying clean objects

(cherry picked from commit 581b320b)
上级 99a0c764
...@@ -187,7 +187,7 @@ func (self *StateObject) Copy() *StateObject { ...@@ -187,7 +187,7 @@ func (self *StateObject) Copy() *StateObject {
stateObject.codeHash = common.CopyBytes(self.codeHash) stateObject.codeHash = common.CopyBytes(self.codeHash)
stateObject.nonce = self.nonce stateObject.nonce = self.nonce
stateObject.trie = self.trie stateObject.trie = self.trie
stateObject.code = common.CopyBytes(self.code) stateObject.code = self.code
stateObject.initCode = common.CopyBytes(self.initCode) stateObject.initCode = common.CopyBytes(self.initCode)
stateObject.storage = self.storage.Copy() stateObject.storage = self.storage.Copy()
stateObject.remove = self.remove stateObject.remove = self.remove
......
...@@ -149,10 +149,11 @@ func TestSnapshot2(t *testing.T) { ...@@ -149,10 +149,11 @@ func TestSnapshot2(t *testing.T) {
so0.balance = big.NewInt(42) so0.balance = big.NewInt(42)
so0.nonce = 43 so0.nonce = 43
so0.SetCode([]byte{'c', 'a', 'f', 'e'}) so0.SetCode([]byte{'c', 'a', 'f', 'e'})
so0.remove = true so0.remove = false
so0.deleted = false so0.deleted = false
so0.dirty = false so0.dirty = true
state.SetStateObject(so0) state.SetStateObject(so0)
state.Commit()
// and one with deleted == true // and one with deleted == true
so1 := state.GetStateObject(stateobjaddr1) so1 := state.GetStateObject(stateobjaddr1)
...@@ -173,6 +174,7 @@ func TestSnapshot2(t *testing.T) { ...@@ -173,6 +174,7 @@ func TestSnapshot2(t *testing.T) {
state.Set(snapshot) state.Set(snapshot)
so0Restored := state.GetStateObject(stateobjaddr0) so0Restored := state.GetStateObject(stateobjaddr0)
so0Restored.GetState(storageaddr)
so1Restored := state.GetStateObject(stateobjaddr1) so1Restored := state.GetStateObject(stateobjaddr1)
// non-deleted is equal (restored) // non-deleted is equal (restored)
compareStateObjects(so0Restored, so0, t) compareStateObjects(so0Restored, so0, t)
......
...@@ -324,7 +324,9 @@ func (self *StateDB) Copy() *StateDB { ...@@ -324,7 +324,9 @@ func (self *StateDB) Copy() *StateDB {
state, _ := New(common.Hash{}, self.db) state, _ := New(common.Hash{}, self.db)
state.trie = self.trie state.trie = self.trie
for k, stateObject := range self.stateObjects { for k, stateObject := range self.stateObjects {
state.stateObjects[k] = stateObject.Copy() if stateObject.dirty {
state.stateObjects[k] = stateObject.Copy()
}
} }
state.refund.Set(self.refund) state.refund.Set(self.refund)
...@@ -364,7 +366,6 @@ func (s *StateDB) IntermediateRoot() common.Hash { ...@@ -364,7 +366,6 @@ func (s *StateDB) IntermediateRoot() common.Hash {
stateObject.Update() stateObject.Update()
s.UpdateStateObject(stateObject) s.UpdateStateObject(stateObject)
} }
stateObject.dirty = false
} }
} }
return s.trie.Hash() return s.trie.Hash()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册