core/vm: clean up contract creation error handling (#22766)
Do not keep separate flag for "max code size exceeded" case, but instead assign appropriate error for it sooner.
This commit is contained in:
		
							parent
							
								
									8ff98108e5
								
							
						
					
					
						commit
						0e00ee42ec
					
				| @ -463,13 +463,16 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, | |||||||
| 
 | 
 | ||||||
| 	ret, err := run(evm, contract, nil, false) | 	ret, err := run(evm, contract, nil, false) | ||||||
| 
 | 
 | ||||||
| 	// check whether the max code size has been exceeded
 | 	// Check whether the max code size has been exceeded, assign err if the case.
 | ||||||
| 	maxCodeSizeExceeded := evm.chainRules.IsEIP158 && len(ret) > params.MaxCodeSize | 	if err == nil && evm.chainRules.IsEIP158 && len(ret) > params.MaxCodeSize { | ||||||
|  | 		err = ErrMaxCodeSizeExceeded | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// if the contract creation ran successfully and no errors were returned
 | 	// if the contract creation ran successfully and no errors were returned
 | ||||||
| 	// calculate the gas required to store the code. If the code could not
 | 	// 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
 | 	// be stored due to not enough gas set an error and let it be handled
 | ||||||
| 	// by the error checking condition below.
 | 	// by the error checking condition below.
 | ||||||
| 	if err == nil && !maxCodeSizeExceeded { | 	if err == nil { | ||||||
| 		createDataGas := uint64(len(ret)) * params.CreateDataGas | 		createDataGas := uint64(len(ret)) * params.CreateDataGas | ||||||
| 		if contract.UseGas(createDataGas) { | 		if contract.UseGas(createDataGas) { | ||||||
| 			evm.StateDB.SetCode(address, ret) | 			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
 | 	// 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
 | 	// 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.
 | 	// 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) | 		evm.StateDB.RevertToSnapshot(snapshot) | ||||||
| 		if err != ErrExecutionReverted { | 		if err != ErrExecutionReverted { | ||||||
| 			contract.UseGas(contract.Gas) | 			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 { | 	if evm.vmConfig.Debug && evm.depth == 0 { | ||||||
| 		evm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err) | 		evm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err) | ||||||
| 	} | 	} | ||||||
| 	return ret, address, contract.Gas, err | 	return ret, address, contract.Gas, err | ||||||
| 
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Create creates a new contract using code as deployment code.
 | // Create creates a new contract using code as deployment code.
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user