aboutsummaryrefslogtreecommitdiffstats
path: root/state/statedb.go
diff options
context:
space:
mode:
Diffstat (limited to 'state/statedb.go')
-rw-r--r--state/statedb.go70
1 files changed, 23 insertions, 47 deletions
diff --git a/state/statedb.go b/state/statedb.go
index 3176ab755..c83d59ed7 100644
--- a/state/statedb.go
+++ b/state/statedb.go
@@ -22,8 +22,6 @@ type StateDB struct {
stateObjects map[string]*StateObject
- manifest *Manifest
-
refund map[string]*big.Int
logs Logs
@@ -31,8 +29,8 @@ type StateDB struct {
// Create a new state from a given trie
func New(root []byte, db ethutil.Database) *StateDB {
- trie := trie.New(root, db)
- return &StateDB{db: db, trie: trie, stateObjects: make(map[string]*StateObject), manifest: NewManifest(), refund: make(map[string]*big.Int)}
+ trie := trie.New(ethutil.CopyBytes(root), db)
+ return &StateDB{db: db, trie: trie, stateObjects: make(map[string]*StateObject), refund: make(map[string]*big.Int)}
}
func (self *StateDB) EmptyLogs() {
@@ -47,6 +45,13 @@ func (self *StateDB) Logs() Logs {
return self.logs
}
+func (self *StateDB) Refund(addr []byte, gas *big.Int) {
+ if self.refund[string(addr)] == nil {
+ self.refund[string(addr)] = new(big.Int)
+ }
+ self.refund[string(addr)].Add(self.refund[string(addr)], gas)
+}
+
// Retrieve the balance from the given address or 0 if object not found
func (self *StateDB) GetBalance(addr []byte) *big.Int {
stateObject := self.GetStateObject(addr)
@@ -57,13 +62,6 @@ func (self *StateDB) GetBalance(addr []byte) *big.Int {
return ethutil.Big0
}
-func (self *StateDB) Refund(addr []byte, gas *big.Int) {
- if self.refund[string(addr)] == nil {
- self.refund[string(addr)] = new(big.Int)
- }
- self.refund[string(addr)].Add(self.refund[string(addr)], gas)
-}
-
func (self *StateDB) AddBalance(addr []byte, amount *big.Int) {
stateObject := self.GetStateObject(addr)
if stateObject != nil {
@@ -103,6 +101,7 @@ func (self *StateDB) SetCode(addr, code []byte) {
}
}
+// TODO vars
func (self *StateDB) GetState(a, b []byte) []byte {
stateObject := self.GetStateObject(a)
if stateObject != nil {
@@ -212,34 +211,27 @@ func (s *StateDB) Cmp(other *StateDB) bool {
}
func (self *StateDB) Copy() *StateDB {
- if self.trie != nil {
- state := New(nil, self.db)
- state.trie = self.trie.Copy()
- for k, stateObject := range self.stateObjects {
- state.stateObjects[k] = stateObject.Copy()
- }
-
- for addr, refund := range self.refund {
- state.refund[addr] = new(big.Int).Set(refund)
- }
-
- logs := make(Logs, len(self.logs))
- copy(logs, self.logs)
- state.logs = logs
+ state := New(nil, self.db)
+ state.trie = self.trie.Copy()
+ for k, stateObject := range self.stateObjects {
+ state.stateObjects[k] = stateObject.Copy()
+ }
- return state
+ for addr, refund := range self.refund {
+ state.refund[addr] = new(big.Int).Set(refund)
}
- return nil
+ logs := make(Logs, len(self.logs))
+ copy(logs, self.logs)
+ state.logs = logs
+
+ return state
}
func (self *StateDB) Set(state *StateDB) {
- if state == nil {
- panic("Tried setting 'state' to nil through 'Set'")
- }
-
self.trie = state.trie
self.stateObjects = state.stateObjects
+
self.refund = state.refund
self.logs = state.logs
}
@@ -290,34 +282,18 @@ func (self *StateDB) Refunds() map[string]*big.Int {
}
func (self *StateDB) Update(gasUsed *big.Int) {
- var deleted bool
self.refund = make(map[string]*big.Int)
for _, stateObject := range self.stateObjects {
if stateObject.remove {
self.DeleteStateObject(stateObject)
- deleted = true
} else {
stateObject.Sync()
self.UpdateStateObject(stateObject)
}
}
-
- // FIXME trie delete is broken
- if deleted {
- valid, t2 := trie.ParanoiaCheck(self.trie, self.db)
- if !valid {
- statelogger.Infof("Warn: PARANOIA: Different state root during copy %x vs %x\n", self.trie.Root(), t2.Root())
-
- self.trie = t2
- }
- }
-}
-
-func (self *StateDB) Manifest() *Manifest {
- return self.manifest
}
// Debug stuff