aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-05-09 01:09:36 +0800
committerobscuren <geffobscura@gmail.com>2014-05-09 01:09:36 +0800
commit5a0bae1dae831818740a2f20ca308c4176f5201d (patch)
tree33fc52996530ebb7c467880975554a91d94471c6
parente8fb965ccbb65807c1f462e8f2ee82508a822b58 (diff)
downloadgo-tangerine-5a0bae1dae831818740a2f20ca308c4176f5201d.tar
go-tangerine-5a0bae1dae831818740a2f20ca308c4176f5201d.tar.gz
go-tangerine-5a0bae1dae831818740a2f20ca308c4176f5201d.tar.bz2
go-tangerine-5a0bae1dae831818740a2f20ca308c4176f5201d.tar.lz
go-tangerine-5a0bae1dae831818740a2f20ca308c4176f5201d.tar.xz
go-tangerine-5a0bae1dae831818740a2f20ca308c4176f5201d.tar.zst
go-tangerine-5a0bae1dae831818740a2f20ca308c4176f5201d.zip
Auto update state changes notifications
-rw-r--r--ethchain/closure.go6
-rw-r--r--ethchain/state.go35
-rw-r--r--ethchain/state_manager.go15
-rw-r--r--ethchain/state_object.go2
-rw-r--r--ethchain/vm.go11
5 files changed, 18 insertions, 51 deletions
diff --git a/ethchain/closure.go b/ethchain/closure.go
index 0f1e386ae..59194e4e8 100644
--- a/ethchain/closure.go
+++ b/ethchain/closure.go
@@ -11,7 +11,7 @@ type ClosureRef interface {
ReturnGas(*big.Int, *big.Int, *State)
Address() []byte
GetMem(*big.Int) *ethutil.Value
- SetMem(*big.Int, *ethutil.Value)
+ SetStore(*big.Int, *ethutil.Value)
N() *big.Int
}
@@ -64,8 +64,8 @@ func (c *Closure) Gets(x, y *big.Int) *ethutil.Value {
return ethutil.NewValue(partial)
}
-func (c *Closure) SetMem(x *big.Int, val *ethutil.Value) {
- c.object.SetMem(x, val)
+func (c *Closure) SetStorage(x *big.Int, val *ethutil.Value) {
+ c.object.SetStorage(x, val)
}
func (c *Closure) Address() []byte {
diff --git a/ethchain/state.go b/ethchain/state.go
index 1b5655d4c..5d42c40c0 100644
--- a/ethchain/state.go
+++ b/ethchain/state.go
@@ -15,11 +15,13 @@ type State struct {
trie *ethutil.Trie
// Nested states
states map[string]*State
+
+ manifest *Manifest
}
// Create a new state from a given trie
func NewState(trie *ethutil.Trie) *State {
- return &State{trie: trie, states: make(map[string]*State)}
+ return &State{trie: trie, states: make(map[string]*State), manifest: NewManifest()}
}
// Resets the trie and all siblings
@@ -124,36 +126,6 @@ const (
UnknownTy
)
-/*
-// Returns the object stored at key and the type stored at key
-// Returns nil if nothing is stored
-func (s *State) GetStateObject(key []byte) (*ethutil.Value, ObjType) {
- // Fetch data from the trie
- data := s.trie.Get(string(key))
- // Returns the nil type, indicating nothing could be retrieved.
- // Anything using this function should check for this ret val
- if data == "" {
- return nil, NilTy
- }
-
- var typ ObjType
- val := ethutil.NewValueFromBytes([]byte(data))
- // Check the length of the retrieved value.
- // Len 2 = Account
- // Len 3 = Contract
- // Other = invalid for now. If other types emerge, add them here
- if val.Len() == 2 {
- typ = AccountTy
- } else if val.Len() == 3 {
- typ = ContractTy
- } else {
- typ = UnknownTy
- }
-
- return val, typ
-}
-*/
-
// Updates any given state object
func (s *State) UpdateStateObject(object *StateObject) {
addr := object.Address()
@@ -163,6 +135,7 @@ func (s *State) UpdateStateObject(object *StateObject) {
}
s.trie.Update(string(addr), string(object.RlpEncode()))
+ s.manifest.AddObjectChange(object)
}
func (s *State) Put(key, object []byte) {
diff --git a/ethchain/state_manager.go b/ethchain/state_manager.go
index 76b02f9ab..9ab378b67 100644
--- a/ethchain/state_manager.go
+++ b/ethchain/state_manager.go
@@ -47,7 +47,9 @@ type StateManager struct {
// the main states.
transState *State
// Manifest for keeping changes regarding state objects. See `notify`
- manifest *Manifest
+ // XXX Should we move the manifest to the State object. Benefit:
+ // * All states can keep their own local changes
+ //manifest *Manifest
}
func NewStateManager(ethereum EthManager) *StateManager {
@@ -57,7 +59,7 @@ func NewStateManager(ethereum EthManager) *StateManager {
Pow: &EasyPow{},
Ethereum: ethereum,
bc: ethereum.BlockChain(),
- manifest: NewManifest(),
+ //manifest: NewManifest(),
}
sm.procState = ethereum.BlockChain().CurrentBlock.State()
sm.transState = sm.procState.Copy()
@@ -190,7 +192,7 @@ func (sm *StateManager) ProcessBlock(block *Block, dontReact bool) error {
sm.notifyChanges()
- sm.manifest.Reset()
+ sm.procState.manifest.Reset()
}
} else {
fmt.Println("total diff failed")
@@ -315,18 +317,15 @@ func (sm *StateManager) EvalScript(script []byte, object *StateObject, tx *Trans
// Update the account (refunds)
sm.procState.UpdateStateObject(account)
- sm.manifest.AddObjectChange(account)
-
sm.procState.UpdateStateObject(object)
- sm.manifest.AddObjectChange(object)
}
func (sm *StateManager) notifyChanges() {
- for addr, stateObject := range sm.manifest.objectChanges {
+ for addr, stateObject := range sm.procState.manifest.objectChanges {
sm.Ethereum.Reactor().Post("object:"+addr, stateObject)
}
- for stateObjectAddr, mappedObjects := range sm.manifest.storageChanges {
+ for stateObjectAddr, mappedObjects := range sm.procState.manifest.storageChanges {
for addr, value := range mappedObjects {
sm.Ethereum.Reactor().Post("storage:"+stateObjectAddr+":"+addr, &StorageState{[]byte(stateObjectAddr), []byte(addr), value})
}
diff --git a/ethchain/state_object.go b/ethchain/state_object.go
index b38ee4f5c..7a11a1152 100644
--- a/ethchain/state_object.go
+++ b/ethchain/state_object.go
@@ -77,7 +77,7 @@ func (c *StateObject) SetAddr(addr []byte, value interface{}) {
c.state.trie.Update(string(addr), string(ethutil.NewValue(value).Encode()))
}
-func (c *StateObject) SetMem(num *big.Int, val *ethutil.Value) {
+func (c *StateObject) SetStorage(num *big.Int, val *ethutil.Value) {
addr := ethutil.BigToBytes(num, 256)
c.SetAddr(addr, val)
}
diff --git a/ethchain/vm.go b/ethchain/vm.go
index ee470c269..584c66611 100644
--- a/ethchain/vm.go
+++ b/ethchain/vm.go
@@ -395,10 +395,10 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
case oSSTORE:
require(2)
val, loc := stack.Popn()
- closure.SetMem(loc, ethutil.NewValue(val))
+ closure.SetStorage(loc, ethutil.NewValue(val))
// Add the change to manifest
- vm.stateManager.manifest.AddStorageChange(closure.Object(), loc.Bytes(), val)
+ vm.state.manifest.AddStorageChange(closure.Object(), loc.Bytes(), val)
case oJUMP:
require(1)
pc = stack.Pop()
@@ -473,7 +473,6 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
// Fetch the contract which will serve as the closure body
contract := vm.state.GetContract(addr.Bytes())
- fmt.Println("before", contract.Amount)
if contract != nil {
// Prepay for the gas
@@ -497,12 +496,9 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
//contract.State().Reset()
} else {
stack.Push(ethutil.BigTrue)
- // Notify of the changes
- vm.stateManager.manifest.AddObjectChange(contract)
}
vm.state.SetStateObject(contract)
- fmt.Println("after", contract.Amount)
mem.Set(retOffset.Int64(), retSize.Int64(), ret)
} else {
@@ -520,8 +516,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.stateManager.manifest.AddObjectChange(receiver)
+ vm.state.SetStateObject(receiver)
closure.object.state.Purge()