@ -26,79 +26,36 @@ func NewState(trie *ethtrie.Trie) *State {
return & State { trie : trie , stateObjects : make ( map [ string ] * StateObject ) , manifest : NewManifest ( ) }
}
// Resets the trie and all siblings
func ( s * State ) Reset ( ) {
s . trie . Undo ( )
// Reset all nested states
for _ , stateObject := range s . stateObjects {
if stateObject . state == nil {
continue
}
//stateObject.state.Reset()
stateObject . Reset ( )
}
s . Empty ( )
}
// Syncs the trie and all siblings
func ( s * State ) Sync ( ) {
// Sync all nested states
for _ , stateObject := range s . stateObjects {
s . UpdateStateObject ( stateObject )
if stateObject . state == nil {
continue
}
stateObject . state . Sync ( )
}
s . trie . Sync ( )
s . Empty ( )
}
func ( self * State ) Empty ( ) {
self . stateObjects = make ( map [ string ] * StateObject )
// Iterate over each storage address and yield callback
func ( s * State ) EachStorage ( cb ethtrie . EachCallback ) {
it := s . trie . NewIterator ( )
it . Each ( cb )
}
func ( self * State ) Update ( ) {
for _ , stateObject := range self . stateObjects {
if stateObject . remove {
self . DeleteStateObject ( stateObject )
} else {
stateObject . Sync ( )
self . UpdateStateObject ( stateObject )
}
// Retrieve the balance from the given address or 0 if object not found
func ( self * State ) GetBalance ( addr [ ] byte ) * big . Int {
stateObject := self . GetStateObject ( addr )
if stateObject != nil {
return stateObject . Amount
}
// FIXME trie delete is broken
valid , t2 := ethtrie . ParanoiaCheck ( self . trie )
if ! valid {
self . trie = t2
}
return ethutil . Big0
}
// Purges the current trie.
func ( s * State ) Purge ( ) int {
return s . trie . NewIterator ( ) . Purge ( )
func ( self * State ) GetNonce ( addr [ ] byte ) uint64 {
stateObject := self . GetStateObject ( addr )
if stateObject != nil {
return stateObject . Nonce
}
func ( s * State ) EachStorage ( cb ethtrie . EachCallback ) {
it := s . trie . NewIterator ( )
it . Each ( cb )
return 0
}
func ( self * State ) ResetStateObject ( stateObject * StateObject ) {
delete ( self . stateObjects , string ( stateObject . Address ( ) ) )
stateObject . state . Reset ( )
}
//
// Setting, updating & deleting state object methods
//
// Update the given state object and apply it to state trie
func ( self * State ) UpdateStateObject ( stateObject * StateObject ) {
addr := stateObject . Address ( )
@ -109,12 +66,14 @@ func (self *State) UpdateStateObject(stateObject *StateObject) {
self . manifest . AddObjectChange ( stateObject )
}
// Delete the given state object and delete it from the state trie
func ( self * State ) DeleteStateObject ( stateObject * StateObject ) {
self . trie . Delete ( string ( stateObject . Address ( ) ) )
delete ( self . stateObjects , string ( stateObject . Address ( ) ) )
}
// Retrieve a state object given my the address. Nil if not found
func ( self * State ) GetStateObject ( addr [ ] byte ) * StateObject {
stateObject := self . stateObjects [ string ( addr ) ]
if stateObject != nil {
@ -132,6 +91,7 @@ func (self *State) GetStateObject(addr []byte) *StateObject {
return stateObject
}
// Retrieve a state object or create a new state object if nil
func ( self * State ) GetOrNewStateObject ( addr [ ] byte ) * StateObject {
stateObject := self . GetStateObject ( addr )
if stateObject == nil {
@ -141,6 +101,7 @@ func (self *State) GetOrNewStateObject(addr []byte) *StateObject {
return stateObject
}
// Create a state object whether it exist in the trie or not
func ( self * State ) NewStateObject ( addr [ ] byte ) * StateObject {
statelogger . Infof ( "(+) %x\n" , addr )
@ -150,10 +111,15 @@ func (self *State) NewStateObject(addr []byte) *StateObject {
return stateObject
}
// Deprecated
func ( self * State ) GetAccount ( addr [ ] byte ) * StateObject {
return self . GetOrNewStateObject ( addr )
}
//
// Setting, copying of the state methods
//
func ( s * State ) Cmp ( other * State ) bool {
return s . trie . Cmp ( other . trie )
}
@ -181,14 +147,67 @@ func (self *State) Set(state *State) {
//*self = *state
}
func ( s * State ) Put ( key , object [ ] byte ) {
s . trie . Update ( string ( key ) , string ( object ) )
}
func ( s * State ) Root ( ) interface { } {
return s . trie . Root
}
// Resets the trie and all siblings
func ( s * State ) Reset ( ) {
s . trie . Undo ( )
// Reset all nested states
for _ , stateObject := range s . stateObjects {
if stateObject . state == nil {
continue
}
//stateObject.state.Reset()
stateObject . Reset ( )
}
s . Empty ( )
}
// Syncs the trie and all siblings
func ( s * State ) Sync ( ) {
// Sync all nested states
for _ , stateObject := range s . stateObjects {
s . UpdateStateObject ( stateObject )
if stateObject . state == nil {
continue
}
stateObject . state . Sync ( )
}
s . trie . Sync ( )
s . Empty ( )
}
func ( self * State ) Empty ( ) {
self . stateObjects = make ( map [ string ] * StateObject )
}
func ( self * State ) Update ( ) {
for _ , stateObject := range self . stateObjects {
if stateObject . remove {
self . DeleteStateObject ( stateObject )
} else {
stateObject . Sync ( )
self . UpdateStateObject ( stateObject )
}
}
// FIXME trie delete is broken
valid , t2 := ethtrie . ParanoiaCheck ( self . trie )
if ! valid {
self . trie = t2
}
}
// Object manifest
//
// The object manifest is used to keep changes to the state so we can keep track of the changes