Skip to content

Commit

Permalink
Update according to ethereum/tests/pull/1105
Browse files Browse the repository at this point in the history
  • Loading branch information
yperbasis committed Nov 30, 2022
1 parent e69f227 commit db19fa9
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 10 deletions.
8 changes: 4 additions & 4 deletions core/vm/evm.go
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,10 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64,
if !evm.context.CanTransfer(evm.intraBlockState, caller.Address(), value) {
return nil, common.Address{}, gas, ErrInsufficientBalance
}
// Check whether the init code size has been exceeded.
if evm.config.HasEip3860(evm.chainRules) && len(codeAndHash.code) > params.MaxInitCodeSize {
return nil, address, gas, ErrMaxInitCodeSizeExceeded
}
if evm.config.Debug {
evm.config.Tracer.CaptureStart(evm, evm.depth, caller.Address(), address, false /* precompile */, true /* create */, calltype, codeAndHash.code, gas, value, nil)
defer func(startGas uint64, startTime time.Time) { // Lazy evaluation of the parameters
Expand All @@ -331,10 +335,6 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64,
err = ErrContractAddressCollision
return nil, common.Address{}, 0, err
}
// Check whether the init code size has been exceeded.
if evm.config.HasEip3860(evm.chainRules) && len(codeAndHash.code) > params.MaxInitCodeSize {
return nil, address, gas, ErrMaxInitCodeSizeExceeded
}
// Create a new account on the state
snapshot := evm.intraBlockState.Snapshot()
evm.intraBlockState.CreateAccount(address, true)
Expand Down
48 changes: 42 additions & 6 deletions core/vm/gas_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -287,18 +287,50 @@ var (
)

func gasCreate2(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, memorySize uint64) (uint64, error) {
return gasCreateImplementation(stack, mem, memorySize, params.Keccak256WordGas)
gas, err := memoryGasCost(mem, memorySize)
if err != nil {
return 0, err
}
len, overflow := stack.Back(2).Uint64WithOverflow()
if overflow {
return 0, ErrGasUintOverflow
}
numWords := ToWordSize(len)
wordGas, overflow := math.SafeMul(numWords, params.Keccak256WordGas)
if overflow {
return 0, ErrGasUintOverflow
}
gas, overflow = math.SafeAdd(gas, wordGas)
if overflow {
return 0, ErrGasUintOverflow
}
return gas, nil
}

func gasCreateEip3860(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, memorySize uint64) (uint64, error) {
return gasCreateImplementation(stack, mem, memorySize, params.InitCodeWordGas)
gas, err := memoryGasCost(mem, memorySize)
if err != nil {
return 0, err
}
len, overflow := stack.Back(2).Uint64WithOverflow()
if overflow {
return 0, ErrGasUintOverflow
}
if len <= params.MaxInitCodeSize {
numWords := ToWordSize(len)
wordGas, overflow := math.SafeMul(numWords, params.InitCodeWordGas)
if overflow {
return 0, ErrGasUintOverflow
}
gas, overflow = math.SafeAdd(gas, wordGas)
if overflow {
return 0, ErrGasUintOverflow
}
}
return gas, nil
}

func gasCreate2Eip3860(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, memorySize uint64) (uint64, error) {
return gasCreateImplementation(stack, mem, memorySize, params.Keccak256WordGas+params.InitCodeWordGas)
}

func gasCreateImplementation(stack *stack.Stack, mem *Memory, memorySize uint64, wordCost uint64) (uint64, error) {
gas, err := memoryGasCost(mem, memorySize)
if err != nil {
return 0, err
Expand All @@ -307,6 +339,10 @@ func gasCreateImplementation(stack *stack.Stack, mem *Memory, memorySize uint64,
if overflow {
return 0, ErrGasUintOverflow
}
wordCost := params.Keccak256WordGas
if len <= params.MaxInitCodeSize {
wordCost += params.InitCodeWordGas
}
numWords := ToWordSize(len)
wordGas, overflow := math.SafeMul(numWords, wordCost)
if overflow {
Expand Down

0 comments on commit db19fa9

Please sign in to comment.