diff options
author | obscuren <geffobscura@gmail.com> | 2014-05-21 07:12:39 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-05-21 07:12:39 +0800 |
commit | 734b2e4cf7a2e6ed3ab0815b795730c62e235a6b (patch) | |
tree | b86a624e21eedc4eceb695a88a1ff3bb81e17848 /ethchain | |
parent | 5ceb1620e93e1999c6f72e6164c7c65af63244ec (diff) | |
parent | 3c35ba7c31423da644c5fb73030af4673cff90ec (diff) | |
download | dexon-734b2e4cf7a2e6ed3ab0815b795730c62e235a6b.tar.gz dexon-734b2e4cf7a2e6ed3ab0815b795730c62e235a6b.tar.zst dexon-734b2e4cf7a2e6ed3ab0815b795730c62e235a6b.zip |
Merge branch 'hotfix/4' into develop
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 9be38fcc1..d8254998e 100644 --- a/ethchain/vm.go +++ b/ethchain/vm.go @@ -450,7 +450,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) @@ -499,7 +499,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 { @@ -517,7 +517,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() |