core/state, core/vm: implement EIP 6780 (#27189)

EIP-6780: SELFDESTRUCT only in same transaction

>     SELFDESTRUCT will recover all funds to the caller but not delete the account, except when called in the same transaction as creation

---------

Co-authored-by: Martin Holst Swende <martin@swende.se>
This commit is contained in:
jwasinger
2023-07-17 13:02:18 -04:00
committed by GitHub
co-authored by Martin Holst Swende
parent b058cf454b
commit 988d84aa7c
6 changed files with 50 additions and 0 deletions
+3
View File
@@ -86,6 +86,9 @@ type stateObject struct {
// or an account that is considered as empty will be marked as deleted at
// the end of transaction and no longer accessible anymore.
deleted bool
// Flag whether the object was created in the current transaction
created bool
}
// empty returns whether the account is considered empty.
+15
View File
@@ -493,6 +493,17 @@ func (s *StateDB) SelfDestruct(addr common.Address) {
stateObject.data.Balance = new(big.Int)
}
func (s *StateDB) Selfdestruct6780(addr common.Address) {
stateObject := s.getStateObject(addr)
if stateObject == nil {
return
}
if stateObject.created {
s.SelfDestruct(addr)
}
}
// SetTransientState sets transient storage for a given account. It
// adds the change to the journal so that it can be rolled back
// to its previous value if there is a revert.
@@ -681,6 +692,9 @@ func (s *StateDB) createObject(addr common.Address) (newobj, prev *stateObject)
delete(s.accountsOrigin, prev.addrHash)
delete(s.storagesOrigin, prev.addrHash)
}
newobj.created = true
s.setStateObject(newobj)
if prev != nil && !prev.deleted {
return newobj, prev
@@ -910,6 +924,7 @@ func (s *StateDB) Finalise(deleteEmptyObjects bool) {
} else {
obj.finalise(true) // Prefetch slots in the background
}
obj.created = false
s.stateObjectsPending[addr] = struct{}{}
s.stateObjectsDirty[addr] = struct{}{}