diff options
Diffstat (limited to 'state/state.go')
-rw-r--r-- | state/state.go | 85 |
1 files changed, 41 insertions, 44 deletions
diff --git a/state/state.go b/state/state.go index 3abf1545b..a8d611668 100644 --- a/state/state.go +++ b/state/state.go @@ -10,12 +10,12 @@ import ( var statelogger = logger.NewLogger("STATE") -// States within the ethereum protocol are used to store anything -// within the merkle trie. States take care of caching and storing +// StateDBs within the ethereum protocol are used to store anything +// within the merkle trie. StateDBs take care of caching and storing // nested states. It's the general query interface to retrieve: // * Contracts // * Accounts -type State struct { +type StateDB struct { // The trie for this structure Trie *trie.Trie @@ -29,24 +29,24 @@ type State struct { } // Create a new state from a given trie -func New(trie *trie.Trie) *State { - return &State{Trie: trie, stateObjects: make(map[string]*StateObject), manifest: NewManifest(), refund: make(map[string]*big.Int)} +func New(trie *trie.Trie) *StateDB { + return &StateDB{Trie: trie, stateObjects: make(map[string]*StateObject), manifest: NewManifest(), refund: make(map[string]*big.Int)} } -func (self *State) EmptyLogs() { +func (self *StateDB) EmptyLogs() { self.logs = nil } -func (self *State) AddLog(log *Log) { +func (self *StateDB) AddLog(log Log) { self.logs = append(self.logs, log) } -func (self *State) Logs() Logs { +func (self *StateDB) Logs() Logs { return self.logs } // Retrieve the balance from the given address or 0 if object not found -func (self *State) GetBalance(addr []byte) *big.Int { +func (self *StateDB) GetBalance(addr []byte) *big.Int { stateObject := self.GetStateObject(addr) if stateObject != nil { return stateObject.balance @@ -55,24 +55,21 @@ func (self *State) GetBalance(addr []byte) *big.Int { return ethutil.Big0 } -func (self *State) Refund(addr []byte, gas, price *big.Int) { - amount := new(big.Int).Mul(gas, price) - +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)], amount) + self.refund[string(addr)].Add(self.refund[string(addr)], gas) } -func (self *State) AddBalance(addr []byte, amount *big.Int) { +func (self *StateDB) AddBalance(addr []byte, amount *big.Int) { stateObject := self.GetStateObject(addr) if stateObject != nil { stateObject.AddBalance(amount) } } -func (self *State) GetNonce(addr []byte) uint64 { +func (self *StateDB) GetNonce(addr []byte) uint64 { stateObject := self.GetStateObject(addr) if stateObject != nil { return stateObject.Nonce @@ -81,14 +78,14 @@ func (self *State) GetNonce(addr []byte) uint64 { return 0 } -func (self *State) SetNonce(addr []byte, nonce uint64) { +func (self *StateDB) SetNonce(addr []byte, nonce uint64) { stateObject := self.GetStateObject(addr) if stateObject != nil { stateObject.Nonce = nonce } } -func (self *State) GetCode(addr []byte) []byte { +func (self *StateDB) GetCode(addr []byte) []byte { stateObject := self.GetStateObject(addr) if stateObject != nil { return stateObject.Code @@ -97,7 +94,7 @@ func (self *State) GetCode(addr []byte) []byte { return nil } -func (self *State) GetState(a, b []byte) []byte { +func (self *StateDB) GetState(a, b []byte) []byte { stateObject := self.GetStateObject(a) if stateObject != nil { return stateObject.GetState(b).Bytes() @@ -106,14 +103,14 @@ func (self *State) GetState(a, b []byte) []byte { return nil } -func (self *State) SetState(addr, key []byte, value interface{}) { +func (self *StateDB) 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 { +func (self *StateDB) Delete(addr []byte) bool { stateObject := self.GetStateObject(addr) if stateObject != nil { stateObject.MarkForDeletion() @@ -129,7 +126,7 @@ func (self *State) Delete(addr []byte) bool { // // Update the given state object and apply it to state trie -func (self *State) UpdateStateObject(stateObject *StateObject) { +func (self *StateDB) UpdateStateObject(stateObject *StateObject) { addr := stateObject.Address() if len(stateObject.CodeHash()) > 0 { @@ -140,14 +137,14 @@ func (self *State) UpdateStateObject(stateObject *StateObject) { } // Delete the given state object and delete it from the state trie -func (self *State) DeleteStateObject(stateObject *StateObject) { +func (self *StateDB) 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 { +func (self *StateDB) GetStateObject(addr []byte) *StateObject { addr = ethutil.Address(addr) stateObject := self.stateObjects[string(addr)] @@ -166,12 +163,12 @@ func (self *State) GetStateObject(addr []byte) *StateObject { return stateObject } -func (self *State) SetStateObject(object *StateObject) { +func (self *StateDB) SetStateObject(object *StateObject) { self.stateObjects[string(object.address)] = object } // Retrieve a state object or create a new state object if nil -func (self *State) GetOrNewStateObject(addr []byte) *StateObject { +func (self *StateDB) GetOrNewStateObject(addr []byte) *StateObject { stateObject := self.GetStateObject(addr) if stateObject == nil { stateObject = self.NewStateObject(addr) @@ -181,7 +178,7 @@ func (self *State) GetOrNewStateObject(addr []byte) *StateObject { } // Create a state object whether it exist in the trie or not -func (self *State) NewStateObject(addr []byte) *StateObject { +func (self *StateDB) NewStateObject(addr []byte) *StateObject { addr = ethutil.Address(addr) statelogger.Debugf("(+) %x\n", addr) @@ -193,7 +190,7 @@ func (self *State) NewStateObject(addr []byte) *StateObject { } // Deprecated -func (self *State) GetAccount(addr []byte) *StateObject { +func (self *StateDB) GetAccount(addr []byte) *StateObject { return self.GetOrNewStateObject(addr) } @@ -201,11 +198,11 @@ func (self *State) GetAccount(addr []byte) *StateObject { // Setting, copying of the state methods // -func (s *State) Cmp(other *State) bool { +func (s *StateDB) Cmp(other *StateDB) bool { return s.Trie.Cmp(other.Trie) } -func (self *State) Copy() *State { +func (self *StateDB) Copy() *StateDB { if self.Trie != nil { state := New(self.Trie.Copy()) for k, stateObject := range self.stateObjects { @@ -213,7 +210,7 @@ func (self *State) Copy() *State { } for addr, refund := range self.refund { - state.refund[addr] = refund + state.refund[addr] = new(big.Int).Set(refund) } logs := make(Logs, len(self.logs)) @@ -226,7 +223,7 @@ func (self *State) Copy() *State { return nil } -func (self *State) Set(state *State) { +func (self *StateDB) Set(state *StateDB) { if state == nil { panic("Tried setting 'state' to nil through 'Set'") } @@ -237,12 +234,12 @@ func (self *State) Set(state *State) { self.logs = state.logs } -func (s *State) Root() []byte { +func (s *StateDB) Root() []byte { return s.Trie.GetRoot() } // Resets the trie and all siblings -func (s *State) Reset() { +func (s *StateDB) Reset() { s.Trie.Undo() // Reset all nested states @@ -251,7 +248,6 @@ func (s *State) Reset() { continue } - //stateObject.state.Reset() stateObject.Reset() } @@ -259,7 +255,7 @@ func (s *State) Reset() { } // Syncs the trie and all siblings -func (s *State) Sync() { +func (s *StateDB) Sync() { // Sync all nested states for _, stateObject := range s.stateObjects { if stateObject.State == nil { @@ -274,18 +270,19 @@ func (s *State) Sync() { s.Empty() } -func (self *State) Empty() { +func (self *StateDB) Empty() { self.stateObjects = make(map[string]*StateObject) self.refund = make(map[string]*big.Int) } -func (self *State) Update() { +func (self *StateDB) Refunds() map[string]*big.Int { + return self.refund +} + +func (self *StateDB) Update(gasUsed *big.Int) { var deleted bool - // Refund any gas that's left - for addr, amount := range self.refund { - self.GetStateObject([]byte(addr)).AddBalance(amount) - } + self.refund = make(map[string]*big.Int) for _, stateObject := range self.stateObjects { if stateObject.remove { @@ -309,12 +306,12 @@ func (self *State) Update() { } } -func (self *State) Manifest() *Manifest { +func (self *StateDB) Manifest() *Manifest { return self.manifest } // Debug stuff -func (self *State) CreateOutputForDiff() { +func (self *StateDB) CreateOutputForDiff() { for _, stateObject := range self.stateObjects { stateObject.CreateOutputForDiff() } |