diff options
author | obscuren <geffobscura@gmail.com> | 2015-04-01 16:53:32 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-04-01 16:53:32 +0800 |
commit | 0a554a1f27ece4235d180373643482ceb57d90ca (patch) | |
tree | 6ab7d4cd70f7c49f64822d8e626f422158c70e78 /core/state | |
parent | d3e86f9208d775ee8020d5583d0aac8f3cfb52b2 (diff) | |
download | go-tangerine-0a554a1f27ece4235d180373643482ceb57d90ca.tar.gz go-tangerine-0a554a1f27ece4235d180373643482ceb57d90ca.tar.zst go-tangerine-0a554a1f27ece4235d180373643482ceb57d90ca.zip |
Blocktest fixed, Execution fixed
* Added new CreateAccount method which properly overwrites previous
accounts (excluding balance)
* Fixed block tests (100% success)
Diffstat (limited to 'core/state')
-rw-r--r-- | core/state/statedb.go | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/core/state/statedb.go b/core/state/statedb.go index 6fcd39dbc..2dc8239ef 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -57,6 +57,10 @@ func (self *StateDB) Refund(address common.Address, gas *big.Int) { self.refund[addr].Add(self.refund[addr], gas) } +/* + * GETTERS + */ + // Retrieve the balance from the given address or 0 if object not found func (self *StateDB) GetBalance(addr common.Address) *big.Int { stateObject := self.GetStateObject(addr) @@ -67,13 +71,6 @@ func (self *StateDB) GetBalance(addr common.Address) *big.Int { return common.Big0 } -func (self *StateDB) AddBalance(addr common.Address, amount *big.Int) { - stateObject := self.GetStateObject(addr) - if stateObject != nil { - stateObject.AddBalance(amount) - } -} - func (self *StateDB) GetNonce(addr common.Address) uint64 { stateObject := self.GetStateObject(addr) if stateObject != nil { @@ -101,22 +98,41 @@ func (self *StateDB) GetState(a common.Address, b common.Hash) []byte { return nil } -func (self *StateDB) SetNonce(addr common.Address, nonce uint64) { +func (self *StateDB) IsDeleted(addr common.Address) bool { stateObject := self.GetStateObject(addr) if stateObject != nil { + return stateObject.remove + } + return false +} + +/* + * SETTERS + */ + +func (self *StateDB) AddBalance(addr common.Address, amount *big.Int) { + stateObject := self.GetOrNewStateObject(addr) + if stateObject != nil { + stateObject.AddBalance(amount) + } +} + +func (self *StateDB) SetNonce(addr common.Address, nonce uint64) { + stateObject := self.GetOrNewStateObject(addr) + if stateObject != nil { stateObject.SetNonce(nonce) } } func (self *StateDB) SetCode(addr common.Address, code []byte) { - stateObject := self.GetStateObject(addr) + stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetCode(code) } } func (self *StateDB) SetState(addr common.Address, key common.Hash, value interface{}) { - stateObject := self.GetStateObject(addr) + stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetState(key, common.NewValue(value)) } @@ -134,14 +150,6 @@ func (self *StateDB) Delete(addr common.Address) bool { return false } -func (self *StateDB) IsDeleted(addr common.Address) bool { - stateObject := self.GetStateObject(addr) - if stateObject != nil { - return stateObject.remove - } - return false -} - // // Setting, updating & deleting state object methods // @@ -194,16 +202,14 @@ func (self *StateDB) SetStateObject(object *StateObject) { func (self *StateDB) GetOrNewStateObject(addr common.Address) *StateObject { stateObject := self.GetStateObject(addr) if stateObject == nil { - stateObject = self.NewStateObject(addr) + stateObject = self.CreateAccount(addr) } return stateObject } -// Create a state object whether it exist in the trie or not -func (self *StateDB) NewStateObject(addr common.Address) *StateObject { - //addr = common.Address(addr) - +// NewStateObject create a state object whether it exist in the trie or not +func (self *StateDB) newStateObject(addr common.Address) *StateObject { statelogger.Debugf("(+) %x\n", addr) stateObject := NewStateObject(addr, self.db) @@ -212,9 +218,19 @@ func (self *StateDB) NewStateObject(addr common.Address) *StateObject { return stateObject } -// Deprecated -func (self *StateDB) GetAccount(addr common.Address) *StateObject { - return self.GetOrNewStateObject(addr) +// Creates creates a new state object and takes ownership. This is different from "NewStateObject" +func (self *StateDB) CreateAccount(addr common.Address) *StateObject { + // Get previous (if any) + so := self.GetStateObject(addr) + // Create a new one + newSo := self.newStateObject(addr) + + // If it existed set the balance to the new account + if so != nil { + newSo.balance = so.balance + } + + return newSo } // |