fix: check for eip activation in SSTORE

This commit is contained in:
Guillaume Ballet 2024-02-16 21:31:19 +01:00
parent 6bfd4837cf
commit 926104ecdc
6 changed files with 11 additions and 2 deletions

View file

@ -86,6 +86,7 @@ func NewEVMTxContext(msg *Message) vm.TxContext {
if msg.BlobGasFeeCap != nil { if msg.BlobGasFeeCap != nil {
ctx.BlobFeeCap = new(big.Int).Set(msg.BlobGasFeeCap) ctx.BlobFeeCap = new(big.Int).Set(msg.BlobGasFeeCap)
} }
ctx.Is5806 = msg.Delegate
return ctx return ctx
} }

View file

@ -33,6 +33,7 @@ var (
ErrMaxCodeSizeExceeded = errors.New("max code size exceeded") ErrMaxCodeSizeExceeded = errors.New("max code size exceeded")
ErrInvalidJump = errors.New("invalid jump destination") ErrInvalidJump = errors.New("invalid jump destination")
ErrWriteProtection = errors.New("write protection") ErrWriteProtection = errors.New("write protection")
ErrEip5806Write = errors.New("write attempt in eip5806 transaction")
ErrReturnDataOutOfBounds = errors.New("return data out of bounds") ErrReturnDataOutOfBounds = errors.New("return data out of bounds")
ErrGasUintOverflow = errors.New("gas uint64 overflow") ErrGasUintOverflow = errors.New("gas uint64 overflow")
ErrInvalidCode = errors.New("invalid code: must not begin with 0xef") ErrInvalidCode = errors.New("invalid code: must not begin with 0xef")

View file

@ -85,6 +85,7 @@ type TxContext struct {
GasPrice *big.Int // Provides information for GASPRICE (and is used to zero the basefee if NoBaseFee is set) GasPrice *big.Int // Provides information for GASPRICE (and is used to zero the basefee if NoBaseFee is set)
BlobHashes []common.Hash // Provides information for BLOBHASH BlobHashes []common.Hash // Provides information for BLOBHASH
BlobFeeCap *big.Int // Is used to zero the blobbasefee if NoBaseFee is set BlobFeeCap *big.Int // Is used to zero the blobbasefee if NoBaseFee is set
Is5806 bool // Indicates if this is an eip-5806 transaction
} }
// EVM is the Ethereum Virtual Machine base object and provides // EVM is the Ethereum Virtual Machine base object and provides

View file

@ -518,8 +518,12 @@ func opSload(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]by
} }
func opSstore(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { func opSstore(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) {
// if scope is an account with no code (EOA delegation through EIP-5806) sstore is protected if interpreter.evm.TxContext.Is5806 {
if interpreter.readOnly || scope.Contract.CodeHash == (common.Hash{}) { if scope.Contract.CodeHash == types.EmptyCodeHash || scope.Contract.CodeHash == (common.Hash{}) {
return nil, ErrEip5806Write
}
}
if interpreter.readOnly {
return nil, ErrWriteProtection return nil, ErrWriteProtection
} }
loc := scope.Stack.pop() loc := scope.Stack.pop()

View file

@ -27,6 +27,7 @@ func NewEnv(cfg *Config) *vm.EVM {
GasPrice: cfg.GasPrice, GasPrice: cfg.GasPrice,
BlobHashes: cfg.BlobHashes, BlobHashes: cfg.BlobHashes,
BlobFeeCap: cfg.BlobFeeCap, BlobFeeCap: cfg.BlobFeeCap,
Is5806: cfg.Is5806,
} }
blockContext := vm.BlockContext{ blockContext := vm.BlockContext{
CanTransfer: core.CanTransfer, CanTransfer: core.CanTransfer,

View file

@ -49,6 +49,7 @@ type Config struct {
BlobHashes []common.Hash BlobHashes []common.Hash
BlobFeeCap *big.Int BlobFeeCap *big.Int
Random *common.Hash Random *common.Hash
Is5806 bool
State *state.StateDB State *state.StateDB
GetHashFn func(n uint64) common.Hash GetHashFn func(n uint64) common.Hash