|
|
|
@ -463,13 +463,16 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, |
|
|
|
|
|
|
|
|
|
ret, err := run(evm, contract, nil, false) |
|
|
|
|
|
|
|
|
|
// check whether the max code size has been exceeded
|
|
|
|
|
maxCodeSizeExceeded := evm.chainRules.IsEIP158 && len(ret) > params.MaxCodeSize |
|
|
|
|
// Check whether the max code size has been exceeded, assign err if the case.
|
|
|
|
|
if err == nil && evm.chainRules.IsEIP158 && len(ret) > params.MaxCodeSize { |
|
|
|
|
err = ErrMaxCodeSizeExceeded |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// if the contract creation ran successfully and no errors were returned
|
|
|
|
|
// calculate the gas required to store the code. If the code could not
|
|
|
|
|
// be stored due to not enough gas set an error and let it be handled
|
|
|
|
|
// by the error checking condition below.
|
|
|
|
|
if err == nil && !maxCodeSizeExceeded { |
|
|
|
|
if err == nil { |
|
|
|
|
createDataGas := uint64(len(ret)) * params.CreateDataGas |
|
|
|
|
if contract.UseGas(createDataGas) { |
|
|
|
|
evm.StateDB.SetCode(address, ret) |
|
|
|
@ -481,21 +484,17 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, |
|
|
|
|
// When an error was returned by the EVM or when setting the creation code
|
|
|
|
|
// above we revert to the snapshot and consume any gas remaining. Additionally
|
|
|
|
|
// when we're in homestead this also counts for code storage gas errors.
|
|
|
|
|
if maxCodeSizeExceeded || (err != nil && (evm.chainRules.IsHomestead || err != ErrCodeStoreOutOfGas)) { |
|
|
|
|
if err != nil && (evm.chainRules.IsHomestead || err != ErrCodeStoreOutOfGas) { |
|
|
|
|
evm.StateDB.RevertToSnapshot(snapshot) |
|
|
|
|
if err != ErrExecutionReverted { |
|
|
|
|
contract.UseGas(contract.Gas) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Assign err if contract code size exceeds the max while the err is still empty.
|
|
|
|
|
if maxCodeSizeExceeded && err == nil { |
|
|
|
|
err = ErrMaxCodeSizeExceeded |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if evm.vmConfig.Debug && evm.depth == 0 { |
|
|
|
|
evm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err) |
|
|
|
|
} |
|
|
|
|
return ret, address, contract.Gas, err |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Create creates a new contract using code as deployment code.
|
|
|
|
|