core: replace instances of 'suicide' with 'selfdestruct' to improve code consistency. (#27716)
--------- Co-authored-by: Martin Holst Swende <martin@swende.se> Co-authored-by: lightclient <14004106+lightclient@users.noreply.github.com>
This commit is contained in:
parent
00408f7479
commit
d233b6b23a
@ -29,7 +29,7 @@ import (
|
|||||||
var (
|
var (
|
||||||
// ErrNoCode is returned by call and transact operations for which the requested
|
// ErrNoCode is returned by call and transact operations for which the requested
|
||||||
// recipient contract to operate on does not exist in the state db or does not
|
// recipient contract to operate on does not exist in the state db or does not
|
||||||
// have any code associated with it (i.e. suicided).
|
// have any code associated with it (i.e. self-destructed).
|
||||||
ErrNoCode = errors.New("no contract code at given address")
|
ErrNoCode = errors.New("no contract code at given address")
|
||||||
|
|
||||||
// ErrNoPendingState is raised when attempting to perform a pending state action
|
// ErrNoPendingState is raised when attempting to perform a pending state action
|
||||||
|
@ -239,7 +239,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
|
|||||||
if miningReward >= 0 {
|
if miningReward >= 0 {
|
||||||
// Add mining reward. The mining reward may be `0`, which only makes a difference in the cases
|
// Add mining reward. The mining reward may be `0`, which only makes a difference in the cases
|
||||||
// where
|
// where
|
||||||
// - the coinbase suicided, or
|
// - the coinbase self-destructed, or
|
||||||
// - there are only 'bad' transactions, which aren't executed. In those cases,
|
// - there are only 'bad' transactions, which aren't executed. In those cases,
|
||||||
// the coinbase gets no txfee, so isn't created, and thus needs to be touched
|
// the coinbase gets no txfee, so isn't created, and thus needs to be touched
|
||||||
var (
|
var (
|
||||||
|
@ -100,9 +100,9 @@ type (
|
|||||||
prevAccountOrigin []byte
|
prevAccountOrigin []byte
|
||||||
prevStorageOrigin map[common.Hash][]byte
|
prevStorageOrigin map[common.Hash][]byte
|
||||||
}
|
}
|
||||||
suicideChange struct {
|
selfDestructChange struct {
|
||||||
account *common.Address
|
account *common.Address
|
||||||
prev bool // whether account had already suicided
|
prev bool // whether account had already self-destructed
|
||||||
prevbalance *big.Int
|
prevbalance *big.Int
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,15 +184,15 @@ func (ch resetObjectChange) dirtied() *common.Address {
|
|||||||
return ch.account
|
return ch.account
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ch suicideChange) revert(s *StateDB) {
|
func (ch selfDestructChange) revert(s *StateDB) {
|
||||||
obj := s.getStateObject(*ch.account)
|
obj := s.getStateObject(*ch.account)
|
||||||
if obj != nil {
|
if obj != nil {
|
||||||
obj.suicided = ch.prev
|
obj.selfDestructed = ch.prev
|
||||||
obj.setBalance(ch.prevbalance)
|
obj.setBalance(ch.prevbalance)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ch suicideChange) dirtied() *common.Address {
|
func (ch selfDestructChange) dirtied() *common.Address {
|
||||||
return ch.account
|
return ch.account
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,12 +78,12 @@ type stateObject struct {
|
|||||||
// Cache flags.
|
// Cache flags.
|
||||||
dirtyCode bool // true if the code was updated
|
dirtyCode bool // true if the code was updated
|
||||||
|
|
||||||
// Flag whether the account was marked as suicided. The suicided account
|
// Flag whether the account was marked as self-destructed. The self-destructed account
|
||||||
// is still accessible in the scope of same transaction.
|
// is still accessible in the scope of same transaction.
|
||||||
suicided bool
|
selfDestructed bool
|
||||||
|
|
||||||
// Flag whether the account was marked as deleted. The suicided account
|
// Flag whether the account was marked as deleted. A self-destructed account
|
||||||
// or the account is considered as empty will be marked as deleted at
|
// or an account that is considered as empty will be marked as deleted at
|
||||||
// the end of transaction and no longer accessible anymore.
|
// the end of transaction and no longer accessible anymore.
|
||||||
deleted bool
|
deleted bool
|
||||||
}
|
}
|
||||||
@ -116,8 +116,8 @@ func (s *stateObject) EncodeRLP(w io.Writer) error {
|
|||||||
return rlp.Encode(w, &s.data)
|
return rlp.Encode(w, &s.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *stateObject) markSuicided() {
|
func (s *stateObject) markSelfdestructed() {
|
||||||
s.suicided = true
|
s.selfDestructed = true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *stateObject) touch() {
|
func (s *stateObject) touch() {
|
||||||
@ -446,7 +446,7 @@ func (s *stateObject) deepCopy(db *StateDB) *stateObject {
|
|||||||
obj.dirtyStorage = s.dirtyStorage.Copy()
|
obj.dirtyStorage = s.dirtyStorage.Copy()
|
||||||
obj.originStorage = s.originStorage.Copy()
|
obj.originStorage = s.originStorage.Copy()
|
||||||
obj.pendingStorage = s.pendingStorage.Copy()
|
obj.pendingStorage = s.pendingStorage.Copy()
|
||||||
obj.suicided = s.suicided
|
obj.selfDestructed = s.selfDestructed
|
||||||
obj.dirtyCode = s.dirtyCode
|
obj.dirtyCode = s.dirtyCode
|
||||||
obj.deleted = s.deleted
|
obj.deleted = s.deleted
|
||||||
return obj
|
return obj
|
||||||
|
@ -208,7 +208,7 @@ func TestSnapshot2(t *testing.T) {
|
|||||||
so0.SetBalance(big.NewInt(42))
|
so0.SetBalance(big.NewInt(42))
|
||||||
so0.SetNonce(43)
|
so0.SetNonce(43)
|
||||||
so0.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e'}), []byte{'c', 'a', 'f', 'e'})
|
so0.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e'}), []byte{'c', 'a', 'f', 'e'})
|
||||||
so0.suicided = false
|
so0.selfDestructed = false
|
||||||
so0.deleted = false
|
so0.deleted = false
|
||||||
state.setStateObject(so0)
|
state.setStateObject(so0)
|
||||||
|
|
||||||
@ -220,7 +220,7 @@ func TestSnapshot2(t *testing.T) {
|
|||||||
so1.SetBalance(big.NewInt(52))
|
so1.SetBalance(big.NewInt(52))
|
||||||
so1.SetNonce(53)
|
so1.SetNonce(53)
|
||||||
so1.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e', '2'}), []byte{'c', 'a', 'f', 'e', '2'})
|
so1.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e', '2'}), []byte{'c', 'a', 'f', 'e', '2'})
|
||||||
so1.suicided = true
|
so1.selfDestructed = true
|
||||||
so1.deleted = true
|
so1.deleted = true
|
||||||
state.setStateObject(so1)
|
state.setStateObject(so1)
|
||||||
|
|
||||||
|
@ -271,7 +271,7 @@ func (s *StateDB) SubRefund(gas uint64) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Exist reports whether the given account address exists in the state.
|
// Exist reports whether the given account address exists in the state.
|
||||||
// Notably this also returns true for suicided accounts.
|
// Notably this also returns true for self-destructed accounts.
|
||||||
func (s *StateDB) Exist(addr common.Address) bool {
|
func (s *StateDB) Exist(addr common.Address) bool {
|
||||||
return s.getStateObject(addr) != nil
|
return s.getStateObject(addr) != nil
|
||||||
}
|
}
|
||||||
@ -397,10 +397,10 @@ func (s *StateDB) StorageTrie(addr common.Address) (Trie, error) {
|
|||||||
return cpy.getTrie(s.db)
|
return cpy.getTrie(s.db)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StateDB) HasSuicided(addr common.Address) bool {
|
func (s *StateDB) HasSelfDestructed(addr common.Address) bool {
|
||||||
stateObject := s.getStateObject(addr)
|
stateObject := s.getStateObject(addr)
|
||||||
if stateObject != nil {
|
if stateObject != nil {
|
||||||
return stateObject.suicided
|
return stateObject.selfDestructed
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -474,24 +474,23 @@ func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Suicide marks the given account as suicided.
|
// SelfDestruct marks the given account as selfdestructed.
|
||||||
// This clears the account balance.
|
// This clears the account balance.
|
||||||
//
|
//
|
||||||
// The account's state object is still available until the state is committed,
|
// The account's state object is still available until the state is committed,
|
||||||
// getStateObject will return a non-nil account after Suicide.
|
// getStateObject will return a non-nil account after SelfDestruct.
|
||||||
func (s *StateDB) Suicide(addr common.Address) bool {
|
func (s *StateDB) SelfDestruct(addr common.Address) {
|
||||||
stateObject := s.getStateObject(addr)
|
stateObject := s.getStateObject(addr)
|
||||||
if stateObject == nil {
|
if stateObject == nil {
|
||||||
return false
|
return
|
||||||
}
|
}
|
||||||
s.journal.append(suicideChange{
|
s.journal.append(selfDestructChange{
|
||||||
account: &addr,
|
account: &addr,
|
||||||
prev: stateObject.suicided,
|
prev: stateObject.selfDestructed,
|
||||||
prevbalance: new(big.Int).Set(stateObject.Balance()),
|
prevbalance: new(big.Int).Set(stateObject.Balance()),
|
||||||
})
|
})
|
||||||
stateObject.markSuicided()
|
stateObject.markSelfdestructed()
|
||||||
stateObject.data.Balance = new(big.Int)
|
stateObject.data.Balance = new(big.Int)
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTransientState sets transient storage for a given account. It
|
// SetTransientState sets transient storage for a given account. It
|
||||||
@ -892,7 +891,7 @@ func (s *StateDB) Finalise(deleteEmptyObjects bool) {
|
|||||||
// Thus, we can safely ignore it here
|
// Thus, we can safely ignore it here
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if obj.suicided || (deleteEmptyObjects && obj.empty()) {
|
if obj.selfDestructed || (deleteEmptyObjects && obj.empty()) {
|
||||||
obj.deleted = true
|
obj.deleted = true
|
||||||
|
|
||||||
// We need to maintain account deletions explicitly (will remain
|
// We need to maintain account deletions explicitly (will remain
|
||||||
|
@ -95,9 +95,9 @@ func newStateTestAction(addr common.Address, r *rand.Rand, index int) testAction
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Suicide",
|
name: "Selfdestruct",
|
||||||
fn: func(a testAction, s *StateDB) {
|
fn: func(a testAction, s *StateDB) {
|
||||||
s.Suicide(addr)
|
s.SelfDestruct(addr)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -301,9 +301,9 @@ func newTestAction(addr common.Address, r *rand.Rand) testAction {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Suicide",
|
name: "SelfDestruct",
|
||||||
fn: func(a testAction, s *StateDB) {
|
fn: func(a testAction, s *StateDB) {
|
||||||
s.Suicide(addr)
|
s.SelfDestruct(addr)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -453,7 +453,7 @@ func (test *snapshotTest) checkEqual(state, checkstate *StateDB) error {
|
|||||||
}
|
}
|
||||||
// Check basic accessor methods.
|
// Check basic accessor methods.
|
||||||
checkeq("Exist", state.Exist(addr), checkstate.Exist(addr))
|
checkeq("Exist", state.Exist(addr), checkstate.Exist(addr))
|
||||||
checkeq("HasSuicided", state.HasSuicided(addr), checkstate.HasSuicided(addr))
|
checkeq("HasSelfdestructed", state.HasSelfDestructed(addr), checkstate.HasSelfDestructed(addr))
|
||||||
checkeq("GetBalance", state.GetBalance(addr), checkstate.GetBalance(addr))
|
checkeq("GetBalance", state.GetBalance(addr), checkstate.GetBalance(addr))
|
||||||
checkeq("GetNonce", state.GetNonce(addr), checkstate.GetNonce(addr))
|
checkeq("GetNonce", state.GetNonce(addr), checkstate.GetNonce(addr))
|
||||||
checkeq("GetCode", state.GetCode(addr), checkstate.GetCode(addr))
|
checkeq("GetCode", state.GetCode(addr), checkstate.GetCode(addr))
|
||||||
@ -727,7 +727,7 @@ func TestDeleteCreateRevert(t *testing.T) {
|
|||||||
state, _ = New(root, state.db, state.snaps)
|
state, _ = New(root, state.db, state.snaps)
|
||||||
|
|
||||||
// Simulate self-destructing in one transaction, then create-reverting in another
|
// Simulate self-destructing in one transaction, then create-reverting in another
|
||||||
state.Suicide(addr)
|
state.SelfDestruct(addr)
|
||||||
state.Finalise(true)
|
state.Finalise(true)
|
||||||
|
|
||||||
id := state.Snapshot()
|
id := state.Snapshot()
|
||||||
|
@ -472,7 +472,7 @@ func gasSelfdestruct(evm *EVM, contract *Contract, stack *Stack, mem *Memory, me
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !evm.StateDB.HasSuicided(contract.Address()) {
|
if !evm.StateDB.HasSelfDestructed(contract.Address()) {
|
||||||
evm.StateDB.AddRefund(params.SelfdestructRefundGas)
|
evm.StateDB.AddRefund(params.SelfdestructRefundGas)
|
||||||
}
|
}
|
||||||
return gas, nil
|
return gas, nil
|
||||||
|
@ -408,7 +408,7 @@ func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext)
|
|||||||
// emptyCodeHash. If the precompile account is not transferred any amount on a private or
|
// emptyCodeHash. If the precompile account is not transferred any amount on a private or
|
||||||
// customized chain, the return value will be zero.
|
// customized chain, the return value will be zero.
|
||||||
//
|
//
|
||||||
// 5. Caller tries to get the code hash for an account which is marked as suicided
|
// 5. Caller tries to get the code hash for an account which is marked as self-destructed
|
||||||
// in the current transaction, the code hash of this account should be returned.
|
// in the current transaction, the code hash of this account should be returned.
|
||||||
//
|
//
|
||||||
// 6. Caller tries to get the code hash for an account which is marked as deleted, this
|
// 6. Caller tries to get the code hash for an account which is marked as deleted, this
|
||||||
@ -821,7 +821,7 @@ func opSelfdestruct(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext
|
|||||||
beneficiary := scope.Stack.pop()
|
beneficiary := scope.Stack.pop()
|
||||||
balance := interpreter.evm.StateDB.GetBalance(scope.Contract.Address())
|
balance := interpreter.evm.StateDB.GetBalance(scope.Contract.Address())
|
||||||
interpreter.evm.StateDB.AddBalance(beneficiary.Bytes20(), balance)
|
interpreter.evm.StateDB.AddBalance(beneficiary.Bytes20(), balance)
|
||||||
interpreter.evm.StateDB.Suicide(scope.Contract.Address())
|
interpreter.evm.StateDB.SelfDestruct(scope.Contract.Address())
|
||||||
if tracer := interpreter.evm.Config.Tracer; tracer != nil {
|
if tracer := interpreter.evm.Config.Tracer; tracer != nil {
|
||||||
tracer.CaptureEnter(SELFDESTRUCT, scope.Contract.Address(), beneficiary.Bytes20(), []byte{}, 0, balance)
|
tracer.CaptureEnter(SELFDESTRUCT, scope.Contract.Address(), beneficiary.Bytes20(), []byte{}, 0, balance)
|
||||||
tracer.CaptureExit([]byte{}, 0, nil)
|
tracer.CaptureExit([]byte{}, 0, nil)
|
||||||
|
@ -51,11 +51,11 @@ type StateDB interface {
|
|||||||
GetTransientState(addr common.Address, key common.Hash) common.Hash
|
GetTransientState(addr common.Address, key common.Hash) common.Hash
|
||||||
SetTransientState(addr common.Address, key, value common.Hash)
|
SetTransientState(addr common.Address, key, value common.Hash)
|
||||||
|
|
||||||
Suicide(common.Address) bool
|
SelfDestruct(common.Address)
|
||||||
HasSuicided(common.Address) bool
|
HasSelfDestructed(common.Address) bool
|
||||||
|
|
||||||
// Exist reports whether the given account exists in state.
|
// Exist reports whether the given account exists in state.
|
||||||
// Notably this should also return true for suicided accounts.
|
// Notably this should also return true for self-destructed accounts.
|
||||||
Exist(common.Address) bool
|
Exist(common.Address) bool
|
||||||
// Empty returns whether the given account is empty. Empty
|
// Empty returns whether the given account is empty. Empty
|
||||||
// is defined according to EIP161 (balance = nonce = code = 0).
|
// is defined according to EIP161 (balance = nonce = code = 0).
|
||||||
|
@ -235,7 +235,7 @@ func makeSelfdestructGasFn(refundsEnabled bool) gasFunc {
|
|||||||
if evm.StateDB.Empty(address) && evm.StateDB.GetBalance(contract.Address()).Sign() != 0 {
|
if evm.StateDB.Empty(address) && evm.StateDB.GetBalance(contract.Address()).Sign() != 0 {
|
||||||
gas += params.CreateBySelfdestructGas
|
gas += params.CreateBySelfdestructGas
|
||||||
}
|
}
|
||||||
if refundsEnabled && !evm.StateDB.HasSuicided(contract.Address()) {
|
if refundsEnabled && !evm.StateDB.HasSelfDestructed(contract.Address()) {
|
||||||
evm.StateDB.AddRefund(params.SelfdestructRefundGas)
|
evm.StateDB.AddRefund(params.SelfdestructRefundGas)
|
||||||
}
|
}
|
||||||
return gas, nil
|
return gas, nil
|
||||||
|
@ -248,7 +248,7 @@ func flatFromNested(input *callFrame, traceAddress []int, convertErrs bool, ctx
|
|||||||
case vm.CREATE, vm.CREATE2:
|
case vm.CREATE, vm.CREATE2:
|
||||||
frame = newFlatCreate(input)
|
frame = newFlatCreate(input)
|
||||||
case vm.SELFDESTRUCT:
|
case vm.SELFDESTRUCT:
|
||||||
frame = newFlatSuicide(input)
|
frame = newFlatSelfdestruct(input)
|
||||||
case vm.CALL, vm.STATICCALL, vm.CALLCODE, vm.DELEGATECALL:
|
case vm.CALL, vm.STATICCALL, vm.CALLCODE, vm.DELEGATECALL:
|
||||||
frame = newFlatCall(input)
|
frame = newFlatCall(input)
|
||||||
default:
|
default:
|
||||||
@ -330,7 +330,7 @@ func newFlatCall(input *callFrame) *flatCallFrame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newFlatSuicide(input *callFrame) *flatCallFrame {
|
func newFlatSelfdestruct(input *callFrame) *flatCallFrame {
|
||||||
return &flatCallFrame{
|
return &flatCallFrame{
|
||||||
Type: "suicide",
|
Type: "suicide",
|
||||||
Action: flatCallAction{
|
Action: flatCallAction{
|
||||||
|
@ -197,7 +197,7 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config, snapshotter bo
|
|||||||
}
|
}
|
||||||
post := t.json.Post[subtest.Fork][subtest.Index]
|
post := t.json.Post[subtest.Fork][subtest.Index]
|
||||||
// N.B: We need to do this in a two-step process, because the first Commit takes care
|
// N.B: We need to do this in a two-step process, because the first Commit takes care
|
||||||
// of suicides, and we need to touch the coinbase _after_ it has potentially suicided.
|
// of self-destructs, and we need to touch the coinbase _after_ it has potentially self-destructed.
|
||||||
if root != common.Hash(post.Root) {
|
if root != common.Hash(post.Root) {
|
||||||
return snaps, statedb, fmt.Errorf("post state root mismatch: got %x, want %x", root, post.Root)
|
return snaps, statedb, fmt.Errorf("post state root mismatch: got %x, want %x", root, post.Root)
|
||||||
}
|
}
|
||||||
@ -275,7 +275,7 @@ func (t *StateTest) RunNoVerify(subtest StateSubtest, vmconfig vm.Config, snapsh
|
|||||||
}
|
}
|
||||||
// Add 0-value mining reward. This only makes a difference in the cases
|
// Add 0-value mining reward. This only makes a difference in the cases
|
||||||
// where
|
// where
|
||||||
// - the coinbase suicided, or
|
// - the coinbase self-destructed, or
|
||||||
// - there are only 'bad' transactions, which aren't executed. In those cases,
|
// - there are only 'bad' transactions, which aren't executed. In those cases,
|
||||||
// the coinbase gets no txfee, so isn't created, and thus needs to be touched
|
// the coinbase gets no txfee, so isn't created, and thus needs to be touched
|
||||||
statedb.AddBalance(block.Coinbase(), new(big.Int))
|
statedb.AddBalance(block.Coinbase(), new(big.Int))
|
||||||
|
Loading…
Reference in New Issue
Block a user