diff options
author | Nick Johnson <arachnid@notdot.net> | 2016-09-19 07:56:23 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2016-09-19 09:23:36 +0800 |
commit | e44b2dc8817c3f9ff4bfcc03d73ec7890dd36fcf (patch) | |
tree | 79f6e26ee861e180b44c1ea21ac0aa2b45edd830 | |
parent | 99a0c7643542aecf4fae43acabfb0a8efbd4b560 (diff) | |
download | go-tangerine-e44b2dc8817c3f9ff4bfcc03d73ec7890dd36fcf.tar go-tangerine-e44b2dc8817c3f9ff4bfcc03d73ec7890dd36fcf.tar.gz go-tangerine-e44b2dc8817c3f9ff4bfcc03d73ec7890dd36fcf.tar.bz2 go-tangerine-e44b2dc8817c3f9ff4bfcc03d73ec7890dd36fcf.tar.lz go-tangerine-e44b2dc8817c3f9ff4bfcc03d73ec7890dd36fcf.tar.xz go-tangerine-e44b2dc8817c3f9ff4bfcc03d73ec7890dd36fcf.tar.zst go-tangerine-e44b2dc8817c3f9ff4bfcc03d73ec7890dd36fcf.zip |
[release 1.4.12] core/state: Fix memory expansion bug by not copying clean objects
(cherry picked from commit 581b320b9dfb42c0c4842e0bc5aeb507267a8eba)
-rw-r--r-- | core/state/state_object.go | 2 | ||||
-rw-r--r-- | core/state/state_test.go | 6 | ||||
-rw-r--r-- | core/state/statedb.go | 5 |
3 files changed, 8 insertions, 5 deletions
diff --git a/core/state/state_object.go b/core/state/state_object.go index 769c63d42..20da1006f 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -187,7 +187,7 @@ func (self *StateObject) Copy() *StateObject { stateObject.codeHash = common.CopyBytes(self.codeHash) stateObject.nonce = self.nonce stateObject.trie = self.trie - stateObject.code = common.CopyBytes(self.code) + stateObject.code = self.code stateObject.initCode = common.CopyBytes(self.initCode) stateObject.storage = self.storage.Copy() stateObject.remove = self.remove diff --git a/core/state/state_test.go b/core/state/state_test.go index ce86a5b76..5a6cb0b50 100644 --- a/core/state/state_test.go +++ b/core/state/state_test.go @@ -149,10 +149,11 @@ func TestSnapshot2(t *testing.T) { so0.balance = big.NewInt(42) so0.nonce = 43 so0.SetCode([]byte{'c', 'a', 'f', 'e'}) - so0.remove = true + so0.remove = false so0.deleted = false - so0.dirty = false + so0.dirty = true state.SetStateObject(so0) + state.Commit() // and one with deleted == true so1 := state.GetStateObject(stateobjaddr1) @@ -173,6 +174,7 @@ func TestSnapshot2(t *testing.T) { state.Set(snapshot) so0Restored := state.GetStateObject(stateobjaddr0) + so0Restored.GetState(storageaddr) so1Restored := state.GetStateObject(stateobjaddr1) // non-deleted is equal (restored) compareStateObjects(so0Restored, so0, t) diff --git a/core/state/statedb.go b/core/state/statedb.go index 3e25e0c16..8ba81613d 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -324,7 +324,9 @@ func (self *StateDB) Copy() *StateDB { state, _ := New(common.Hash{}, self.db) state.trie = self.trie for k, stateObject := range self.stateObjects { - state.stateObjects[k] = stateObject.Copy() + if stateObject.dirty { + state.stateObjects[k] = stateObject.Copy() + } } state.refund.Set(self.refund) @@ -364,7 +366,6 @@ func (s *StateDB) IntermediateRoot() common.Hash { stateObject.Update() s.UpdateStateObject(stateObject) } - stateObject.dirty = false } } return s.trie.Hash() |