diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2016-11-11 17:23:30 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2016-11-14 06:26:10 +0800 |
commit | 0231d8f86dd1c12a4e308b4f120a89254dc2d02d (patch) | |
tree | b5c2d1cc395e0ccb5737e38d1c3118cc1b5fa3d8 /core | |
parent | a91908e5678397a466060aa614081974a4a36455 (diff) | |
download | go-tangerine-0231d8f86dd1c12a4e308b4f120a89254dc2d02d.tar go-tangerine-0231d8f86dd1c12a4e308b4f120a89254dc2d02d.tar.gz go-tangerine-0231d8f86dd1c12a4e308b4f120a89254dc2d02d.tar.bz2 go-tangerine-0231d8f86dd1c12a4e308b4f120a89254dc2d02d.tar.lz go-tangerine-0231d8f86dd1c12a4e308b4f120a89254dc2d02d.tar.xz go-tangerine-0231d8f86dd1c12a4e308b4f120a89254dc2d02d.tar.zst go-tangerine-0231d8f86dd1c12a4e308b4f120a89254dc2d02d.zip |
core, params: EIP#170
Diffstat (limited to 'core')
-rw-r--r-- | core/execution.go | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/core/execution.go b/core/execution.go index 576e05851..e3ea1006c 100644 --- a/core/execution.go +++ b/core/execution.go @@ -150,11 +150,13 @@ func Create(env vm.Environment, caller vm.ContractRef, code []byte, gas, gasPric defer contract.Finalise() ret, err = env.Vm().Run(contract, nil) + // check whether the max code size has been exceeded + maxCodeSizeExceeded := len(ret) > params.MaxCodeSize // 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 { + if err == nil && !maxCodeSizeExceeded { dataGas := big.NewInt(int64(len(ret))) dataGas.Mul(dataGas, params.CreateDataGas) if contract.UseGas(dataGas) { @@ -167,9 +169,9 @@ func Create(env vm.Environment, caller vm.ContractRef, code []byte, gas, gasPric // 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 err != nil && (env.ChainConfig().IsHomestead(env.BlockNumber()) || err != vm.CodeStoreOutOfGasError) { + if maxCodeSizeExceeded || + (err != nil && (env.ChainConfig().IsHomestead(env.BlockNumber()) || err != vm.CodeStoreOutOfGasError)) { contract.UseGas(contract.Gas) - env.RevertToSnapshot(snapshotPreTransfer) // Nothing should be returned when an error is thrown. |