diff options
author | Felix Lange <fjl@twurst.com> | 2016-11-14 17:52:02 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-14 17:52:02 +0800 |
commit | ca73dea3b9bcdf3b5424b5c48c70817439e2e304 (patch) | |
tree | 670e2833878e72555644fbbd81db6c5a1b44493f /core/state/state_object.go | |
parent | 21701190ac0a838e347f31b7a918bb0a60c1e8c1 (diff) | |
parent | 648bd22427000b6e20a5e1a9c397005aa1ad4f9b (diff) | |
download | go-tangerine-ca73dea3b9bcdf3b5424b5c48c70817439e2e304.tar go-tangerine-ca73dea3b9bcdf3b5424b5c48c70817439e2e304.tar.gz go-tangerine-ca73dea3b9bcdf3b5424b5c48c70817439e2e304.tar.bz2 go-tangerine-ca73dea3b9bcdf3b5424b5c48c70817439e2e304.tar.lz go-tangerine-ca73dea3b9bcdf3b5424b5c48c70817439e2e304.tar.xz go-tangerine-ca73dea3b9bcdf3b5424b5c48c70817439e2e304.tar.zst go-tangerine-ca73dea3b9bcdf3b5424b5c48c70817439e2e304.zip |
Merge pull request #3179 from obscuren/eip-158
EIP158 & 160 Hardfork
Diffstat (limited to 'core/state/state_object.go')
-rw-r--r-- | core/state/state_object.go | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/core/state/state_object.go b/core/state/state_object.go index edb073173..2b5dfea7d 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -91,6 +91,11 @@ type StateObject struct { onDirty func(addr common.Address) // Callback method to mark a state object newly dirty } +// empty returns whether the account is considered empty. +func (s *StateObject) empty() bool { + return s.data.Nonce == 0 && s.data.Balance.BitLen() == 0 && bytes.Equal(s.data.CodeHash, emptyCodeHash) +} + // Account is the Ethereum consensus representation of accounts. // These objects are stored in the main account trie. type Account struct { @@ -221,8 +226,12 @@ func (self *StateObject) CommitTrie(db trie.Database, dbw trie.DatabaseWriter) e return err } +// AddBalance removes amount from c's balance. +// It is used to add funds to the destination account of a transfer. func (c *StateObject) AddBalance(amount *big.Int) { - if amount.Cmp(common.Big0) == 0 { + // EIP158: We must check emptiness for the objects such that the account + // clearing (0,0,0 objects) can take effect. + if amount.Cmp(common.Big0) == 0 && !c.empty() { return } c.SetBalance(new(big.Int).Add(c.Balance(), amount)) @@ -232,6 +241,8 @@ func (c *StateObject) AddBalance(amount *big.Int) { } } +// SubBalance removes amount from c's balance. +// It is used to remove funds from the origin account of a transfer. func (c *StateObject) SubBalance(amount *big.Int) { if amount.Cmp(common.Big0) == 0 { return |