Przeglądaj źródła

core/state: Fix memory expansion bug by not copying clean objects

Nick Johnson 9 lat temu
rodzic
commit
581b320b9d
3 zmienionych plików z 8 dodań i 5 usunięć
  1. 1 1
      core/state/state_object.go
  2. 4 2
      core/state/state_test.go
  3. 3 2
      core/state/statedb.go

+ 1 - 1
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

+ 4 - 2
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)

+ 3 - 2
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()