diff options
author | obscuren <geffobscura@gmail.com> | 2014-05-21 07:12:28 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-05-21 07:12:28 +0800 |
commit | 3c35ba7c31423da644c5fb73030af4673cff90ec (patch) | |
tree | c8e19b5a16b70780d6d837c3a60a260b13c6fd62 /ethchain | |
parent | 6ef2832083ad9d1e3cb1895f1aa836517dbf042d (diff) | |
download | go-tangerine-3c35ba7c31423da644c5fb73030af4673cff90ec.tar go-tangerine-3c35ba7c31423da644c5fb73030af4673cff90ec.tar.gz go-tangerine-3c35ba7c31423da644c5fb73030af4673cff90ec.tar.bz2 go-tangerine-3c35ba7c31423da644c5fb73030af4673cff90ec.tar.lz go-tangerine-3c35ba7c31423da644c5fb73030af4673cff90ec.tar.xz go-tangerine-3c35ba7c31423da644c5fb73030af4673cff90ec.tar.zst go-tangerine-3c35ba7c31423da644c5fb73030af4673cff90ec.zip |
Fixed state overwriting issue
Diffstat (limited to 'ethchain')
-rw-r--r-- | ethchain/state.go | 10 | ||||
-rw-r--r-- | ethchain/state_object.go | 1 | ||||
-rw-r--r-- | ethchain/vm.go | 6 |
3 files changed, 7 insertions, 10 deletions
diff --git a/ethchain/state.go b/ethchain/state.go index db715f1cb..6ec6916f4 100644 --- a/ethchain/state.go +++ b/ethchain/state.go @@ -60,6 +60,7 @@ func (s *State) GetStateObject(addr []byte) *StateObject { // Check if there's a cached state for this contract cachedStateObject := s.states[string(addr)] if cachedStateObject != nil { + //fmt.Printf("get cached #%d %x addr: %x\n", cachedStateObject.trie.Cache().Len(), cachedStateObject.Root(), addr[0:4]) stateObject.state = cachedStateObject } @@ -70,8 +71,9 @@ func (s *State) GetStateObject(addr []byte) *StateObject { func (s *State) UpdateStateObject(object *StateObject) { addr := object.Address() - if object.state != nil { + if object.state != nil && s.states[string(addr)] == nil { s.states[string(addr)] = object.state + //fmt.Printf("update cached #%d %x addr: %x\n", object.state.trie.Cache().Len(), object.state.Root(), addr[0:4]) } ethutil.Config.Db.Put(ethutil.Sha3Bin(object.Script()), object.Script()) @@ -81,12 +83,6 @@ func (s *State) UpdateStateObject(object *StateObject) { s.manifest.AddObjectChange(object) } -func (s *State) SetStateObject(stateObject *StateObject) { - s.states[string(stateObject.address)] = stateObject.state - - s.UpdateStateObject(stateObject) -} - func (s *State) GetAccount(addr []byte) (account *StateObject) { data := s.trie.Get(string(addr)) if data == "" { diff --git a/ethchain/state_object.go b/ethchain/state_object.go index cb6211ea6..8e059f334 100644 --- a/ethchain/state_object.go +++ b/ethchain/state_object.go @@ -78,6 +78,7 @@ func (c *StateObject) SetAddr(addr []byte, value interface{}) { func (c *StateObject) SetStorage(num *big.Int, val *ethutil.Value) { addr := ethutil.BigToBytes(num, 256) + //fmt.Println("storing", val.BigInt(), "@", num) c.SetAddr(addr, val) } diff --git a/ethchain/vm.go b/ethchain/vm.go index e732d22a4..c4304e5ac 100644 --- a/ethchain/vm.go +++ b/ethchain/vm.go @@ -448,7 +448,7 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro } else { stack.Push(ethutil.BigD(addr)) - vm.state.SetStateObject(contract) + vm.state.UpdateStateObject(contract) } case oCALL: require(7) @@ -497,7 +497,7 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro stack.Push(ethutil.BigTrue) } - vm.state.SetStateObject(contract) + vm.state.UpdateStateObject(contract) mem.Set(retOffset.Int64(), retSize.Int64(), ret) } else { @@ -515,7 +515,7 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro receiver := vm.state.GetAccount(stack.Pop().Bytes()) receiver.AddAmount(closure.object.Amount) - vm.state.SetStateObject(receiver) + vm.state.UpdateStateObject(receiver) closure.object.state.Purge() |