diff options
author | obscuren <geffobscura@gmail.com> | 2015-03-10 00:55:01 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-03-10 00:55:01 +0800 |
commit | 8560004f380dc688a1171ad5aeffa593aae41193 (patch) | |
tree | fea395acf042b51e97a86e2c4cbcf8c16b2912b7 /state | |
parent | 9723191b19f6ddc12f0c3376ede7529b2d72e6a2 (diff) | |
parent | 676a0de58d3d7c508b0eeeff192d2095a46f7382 (diff) | |
download | dexon-8560004f380dc688a1171ad5aeffa593aae41193.tar dexon-8560004f380dc688a1171ad5aeffa593aae41193.tar.gz dexon-8560004f380dc688a1171ad5aeffa593aae41193.tar.bz2 dexon-8560004f380dc688a1171ad5aeffa593aae41193.tar.lz dexon-8560004f380dc688a1171ad5aeffa593aae41193.tar.xz dexon-8560004f380dc688a1171ad5aeffa593aae41193.tar.zst dexon-8560004f380dc688a1171ad5aeffa593aae41193.zip |
wip
Diffstat (limited to 'state')
-rw-r--r-- | state/state_object.go | 4 | ||||
-rw-r--r-- | state/statedb.go | 35 |
2 files changed, 26 insertions, 13 deletions
diff --git a/state/state_object.go b/state/state_object.go index 487952a02..ccbfea391 100644 --- a/state/state_object.go +++ b/state/state_object.go @@ -111,7 +111,7 @@ func NewStateObjectFromBytes(address, data []byte, db ethutil.Database) *StateOb func (self *StateObject) MarkForDeletion() { self.remove = true self.dirty = true - statelogger.DebugDetailf("%x: #%d %v (deletion)\n", self.Address(), self.nonce, self.balance) + statelogger.Debugf("%x: #%d %v X\n", self.Address(), self.nonce, self.balance) } func (c *StateObject) getAddr(addr []byte) *ethutil.Value { @@ -290,7 +290,7 @@ func (c *StateObject) Init() Code { return c.initCode } -func (self *StateObject) Trie() *trie.Trie { +func (self *StateObject) Trie() *trie.SecureTrie { return self.State.trie } diff --git a/state/statedb.go b/state/statedb.go index 7e2b24b94..0a4156461 100644 --- a/state/statedb.go +++ b/state/statedb.go @@ -18,7 +18,7 @@ var statelogger = logger.NewLogger("STATE") // * Accounts type StateDB struct { db ethutil.Database - trie *trie.Trie + trie *trie.SecureTrie stateObjects map[string]*StateObject @@ -29,7 +29,7 @@ type StateDB struct { // Create a new state from a given trie func New(root []byte, db ethutil.Database) *StateDB { - trie := trie.New(ethutil.CopyBytes(root), db) + trie := trie.NewSecure(ethutil.CopyBytes(root), db) return &StateDB{db: db, trie: trie, stateObjects: make(map[string]*StateObject), refund: make(map[string]*big.Int)} } @@ -54,7 +54,7 @@ func (self *StateDB) Refund(addr []byte, gas *big.Int) { // 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) + stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { return stateObject.balance } @@ -63,14 +63,14 @@ func (self *StateDB) GetBalance(addr []byte) *big.Int { } func (self *StateDB) AddBalance(addr []byte, amount *big.Int) { - stateObject := self.GetStateObject(addr) + stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.AddBalance(amount) } } func (self *StateDB) GetNonce(addr []byte) uint64 { - stateObject := self.GetStateObject(addr) + stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { return stateObject.nonce } @@ -79,7 +79,7 @@ func (self *StateDB) GetNonce(addr []byte) uint64 { } func (self *StateDB) GetCode(addr []byte) []byte { - stateObject := self.GetStateObject(addr) + stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { return stateObject.code } @@ -88,7 +88,7 @@ func (self *StateDB) GetCode(addr []byte) []byte { } func (self *StateDB) GetState(a, b []byte) []byte { - stateObject := self.GetStateObject(a) + stateObject := self.GetOrNewStateObject(a) if stateObject != nil { return stateObject.GetState(b).Bytes() } @@ -97,30 +97,31 @@ func (self *StateDB) GetState(a, b []byte) []byte { } func (self *StateDB) SetNonce(addr []byte, nonce uint64) { - stateObject := self.GetStateObject(addr) + stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetNonce(nonce) } } func (self *StateDB) SetCode(addr, code []byte) { - stateObject := self.GetStateObject(addr) + stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetCode(code) } } func (self *StateDB) SetState(addr, key []byte, value interface{}) { - stateObject := self.GetStateObject(addr) + stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetState(key, ethutil.NewValue(value)) } } func (self *StateDB) Delete(addr []byte) bool { - stateObject := self.GetStateObject(addr) + stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.MarkForDeletion() + stateObject.balance = new(big.Int) return true } @@ -128,6 +129,14 @@ func (self *StateDB) Delete(addr []byte) bool { return false } +func (self *StateDB) IsDeleted(addr []byte) bool { + stateObject := self.GetStateObject(addr) + if stateObject != nil { + return stateObject.remove + } + return false +} + // // Setting, updating & deleting state object methods // @@ -239,6 +248,10 @@ func (s *StateDB) Root() []byte { return s.trie.Root() } +func (s *StateDB) Trie() *trie.SecureTrie { + return s.trie +} + // Resets the trie and all siblings func (s *StateDB) Reset() { s.trie.Reset() |