aboutsummaryrefslogtreecommitdiffstats
path: root/ethstate
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-10-16 19:38:21 +0800
committerobscuren <geffobscura@gmail.com>2014-10-16 19:38:21 +0800
commit70f7a0be1187cc0e487e7b95cad238c6530d29ae (patch)
treef7b2787bf598db75ae6750e0d7c3fbf1fdfb4ede /ethstate
parent311c6f8a3fed5ac03ee4b442fd0f420072bc41b4 (diff)
downloadgo-tangerine-70f7a0be1187cc0e487e7b95cad238c6530d29ae.tar
go-tangerine-70f7a0be1187cc0e487e7b95cad238c6530d29ae.tar.gz
go-tangerine-70f7a0be1187cc0e487e7b95cad238c6530d29ae.tar.bz2
go-tangerine-70f7a0be1187cc0e487e7b95cad238c6530d29ae.tar.lz
go-tangerine-70f7a0be1187cc0e487e7b95cad238c6530d29ae.tar.xz
go-tangerine-70f7a0be1187cc0e487e7b95cad238c6530d29ae.tar.zst
go-tangerine-70f7a0be1187cc0e487e7b95cad238c6530d29ae.zip
Use the state instead of the state object directly.
If a state gets reset and you still hold a pointer to the previous, incorrect, state object you'll operate on the wrong object. Using the state to set/get objects and attributes you won't have this problem since the state will always have the correct object.
Diffstat (limited to 'ethstate')
-rw-r--r--ethstate/state.go25
-rw-r--r--ethstate/state_object.go4
2 files changed, 29 insertions, 0 deletions
diff --git a/ethstate/state.go b/ethstate/state.go
index b897b7ce3..2efe2a311 100644
--- a/ethstate/state.go
+++ b/ethstate/state.go
@@ -48,6 +48,13 @@ func (self *State) GetNonce(addr []byte) uint64 {
return 0
}
+func (self *State) SetNonce(addr []byte, nonce uint64) {
+ stateObject := self.GetStateObject(addr)
+ if stateObject != nil {
+ stateObject.Nonce = nonce
+ }
+}
+
func (self *State) GetCode(addr []byte) []byte {
stateObject := self.GetStateObject(addr)
if stateObject != nil {
@@ -66,6 +73,24 @@ func (self *State) GetState(a, b []byte) []byte {
return nil
}
+func (self *State) SetState(addr, key []byte, value interface{}) {
+ stateObject := self.GetStateObject(addr)
+ if stateObject != nil {
+ stateObject.SetState(key, ethutil.NewValue(value))
+ }
+}
+
+func (self *State) Delete(addr []byte) bool {
+ stateObject := self.GetStateObject(addr)
+ if stateObject != nil {
+ stateObject.MarkForDeletion()
+
+ return true
+ }
+
+ return false
+}
+
//
// Setting, updating & deleting state object methods
//
diff --git a/ethstate/state_object.go b/ethstate/state_object.go
index 4d2aae1a7..a5b7c65e9 100644
--- a/ethstate/state_object.go
+++ b/ethstate/state_object.go
@@ -104,6 +104,10 @@ func (self *StateObject) SetStorage(key *big.Int, value *ethutil.Value) {
self.SetState(key.Bytes(), value)
}
+func (self *StateObject) Storage() map[string]*ethutil.Value {
+ return self.storage
+}
+
func (self *StateObject) GetState(k []byte) *ethutil.Value {
key := ethutil.LeftPadBytes(k, 32)