Skip to content

Commit

Permalink
core/vm, core/state: implement eip-6780
Browse files Browse the repository at this point in the history
  • Loading branch information
jwasinger committed Jul 15, 2023
1 parent 281e8cd commit 842f76e
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 1 deletion.
1 change: 1 addition & 0 deletions core/state/state_object.go
Expand Up @@ -80,6 +80,7 @@ type stateObject struct {
dirtyCode bool // true if the code was updated
suicided bool
deleted bool
created bool // true if the object was created in the current transaction
}

// empty returns whether the account is considered empty.
Expand Down
15 changes: 15 additions & 0 deletions core/state/statedb.go
Expand Up @@ -474,6 +474,17 @@ func (s *StateDB) Suicide(addr common.Address) bool {
return true
}

func (s *StateDB) Selfdestruct6780(addr common.Address) {
stateObject := s.getStateObject(addr)
if stateObject == nil {
return
}

if stateObject.created {
s.Suicide(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.
Expand Down Expand Up @@ -656,6 +667,9 @@ func (s *StateDB) createObject(addr common.Address) (newobj, prev *stateObject)
prevStorage: storage,
})
}

newobj.created = true

s.setStateObject(newobj)
if prev != nil && !prev.deleted {
return newobj, prev
Expand Down Expand Up @@ -882,6 +896,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{}{}

Expand Down
12 changes: 12 additions & 0 deletions core/vm/eips.go
Expand Up @@ -26,6 +26,7 @@ import (
)

var activators = map[int]func(*JumpTable){
6780: enable6780,
3855: enable3855,
3860: enable3860,
3529: enable3529,
Expand Down Expand Up @@ -264,3 +265,14 @@ func enable4844(jt *JumpTable) {
maxStack: maxStack(1, 1),
}
}

// enable4844 applies EIP-6780 (deactivate SELFDESTRUCT)
func enable6780(jt *JumpTable) {
jt[SELFDESTRUCT] = &operation{
execute: opSelfdestruct6780,
dynamicGas: gasSelfdestructEIP3529,
constantGas: params.SelfdestructGasEIP150,
minStack: minStack(1, 0),
maxStack: maxStack(1, 0),
}
}
16 changes: 16 additions & 0 deletions core/vm/instructions.go
Expand Up @@ -829,6 +829,22 @@ func opSelfdestruct(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext
return nil, errStopToken
}

func opSelfdestruct6780(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) {
if interpreter.readOnly {
return nil, ErrWriteProtection
}
beneficiary := scope.Stack.pop()
balance := interpreter.evm.StateDB.GetBalance(scope.Contract.Address())
interpreter.evm.StateDB.SubBalance(scope.Contract.Address(), balance)
interpreter.evm.StateDB.AddBalance(beneficiary.Bytes20(), balance)
interpreter.evm.StateDB.Selfdestruct6780(scope.Contract.Address())
if tracer := interpreter.evm.Config.Tracer; tracer != nil {
tracer.CaptureEnter(SELFDESTRUCT, scope.Contract.Address(), beneficiary.Bytes20(), []byte{}, 0, balance)
tracer.CaptureExit([]byte{}, 0, nil)
}
return nil, errStopToken
}

// following functions are used by the instruction jump table

// make log instruction function
Expand Down
2 changes: 2 additions & 0 deletions core/vm/interface.go
Expand Up @@ -54,6 +54,8 @@ type StateDB interface {
Suicide(common.Address) bool
HasSuicided(common.Address) bool

Selfdestruct6780(common.Address)

// Exist reports whether the given account exists in state.
// Notably this should also return true for suicided accounts.
Exist(common.Address) bool
Expand Down
2 changes: 2 additions & 0 deletions core/vm/jump_table.go
Expand Up @@ -83,13 +83,15 @@ func validate(jt JumpTable) JumpTable {
func newCancunInstructionSet() JumpTable {
instructionSet := newShanghaiInstructionSet()
enable4844(&instructionSet) // BLOBHASH opcode
enable6780(&instructionSet) // deactivate SELFDESTRUCT
return validate(instructionSet)
}

func newShanghaiInstructionSet() JumpTable {
instructionSet := newMergeInstructionSet()
enable3855(&instructionSet) // PUSH0 instruction
enable3860(&instructionSet) // Limit and meter initcode

return validate(instructionSet)
}

Expand Down
2 changes: 1 addition & 1 deletion core/vm/jump_table_export.go
Expand Up @@ -29,7 +29,7 @@ func LookupInstructionSet(rules params.Rules) (JumpTable, error) {
case rules.IsPrague:
return newShanghaiInstructionSet(), errors.New("prague-fork not defined yet")
case rules.IsCancun:
return newShanghaiInstructionSet(), errors.New("cancun-fork not defined yet")
return newCancunInstructionSet(), nil
case rules.IsShanghai:
return newShanghaiInstructionSet(), nil
case rules.IsMerge:
Expand Down

0 comments on commit 842f76e

Please sign in to comment.