From 4849f58a7a0a5265ef57456546e88a6dd10ac652 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 4 Oct 2016 12:42:22 +0200 Subject: [PATCH] core/state: journal WIP 2 --- core/state/state_object.go | 20 ++++++++++---------- core/state/statedb.go | 3 ++- core/vm/jit_test.go | 4 ++-- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/core/state/state_object.go b/core/state/state_object.go index aa701d43a3..c990be85b8 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -260,16 +260,16 @@ func (self *StateObject) setBalance(amount *big.Int) { // Return the gas back to the origin. Used by the Virtual machine or Closures func (c *StateObject) ReturnGas(gas, price *big.Int) {} -func (self *StateObject) Copy(db trie.Database, onDirty func(addr common.Address)) *StateObject { - // stateObject := NewObject(self.address, self.data, onDirty) - // stateObject.trie = self.trie - // stateObject.code = self.code - // stateObject.dirtyStorage = self.dirtyStorage.Copy() - // stateObject.cachedStorage = self.dirtyStorage.Copy() - // stateObject.remove = self.remove - // stateObject.dirtyCode = self.dirtyCode - // stateObject.deleted = self.deleted - return self +func (self *StateObject) deepCopy(db *StateDB, onDirty func(addr common.Address)) *StateObject { + stateObject := newObject(db, self.address, self.data, onDirty) + stateObject.trie = self.trie + stateObject.code = self.code + stateObject.dirtyStorage = self.dirtyStorage.Copy() + stateObject.cachedStorage = self.dirtyStorage.Copy() + stateObject.remove = self.remove + stateObject.dirtyCode = self.dirtyCode + stateObject.deleted = self.deleted + return stateObject } // diff --git a/core/state/statedb.go b/core/state/statedb.go index bcf9f77224..62f5b91bc9 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -192,6 +192,7 @@ func (self *StateDB) Logs() vm.Logs { } func (self *StateDB) AddRefund(gas *big.Int) { + self.journal = append(self.journal, refundChange{prev: new(big.Int).Set(self.refund)}) self.refund.Add(self.refund, gas) } @@ -452,7 +453,7 @@ func (self *StateDB) Copy() *StateDB { } // Copy the dirty states and logs for addr, _ := range self.stateObjectsDirty { - state.stateObjects[addr] = self.stateObjects[addr].Copy(self.db, state.MarkStateObjectDirty) + state.stateObjects[addr] = self.stateObjects[addr].deepCopy(state, state.MarkStateObjectDirty) state.stateObjectsDirty[addr] = struct{}{} } for hash, logs := range self.logs { diff --git a/core/vm/jit_test.go b/core/vm/jit_test.go index e6922aeb74..a6de710e13 100644 --- a/core/vm/jit_test.go +++ b/core/vm/jit_test.go @@ -179,8 +179,8 @@ func (self *Env) BlockNumber() *big.Int { return big.NewInt(0) } //func (self *Env) PrevHash() []byte { return self.parent } func (self *Env) Coinbase() common.Address { return common.Address{} } -func (self *Env) MakeSnapshot() Database { return nil } -func (self *Env) SetSnapshot(Database) {} +func (self *Env) SnapshotDatabase() int { return 0 } +func (self *Env) RevertToSnapshot(int) {} func (self *Env) Time() *big.Int { return big.NewInt(time.Now().Unix()) } func (self *Env) Difficulty() *big.Int { return big.NewInt(0) } func (self *Env) Db() Database { return nil }