move contract address creation to 'Computation'

This commit is contained in:
andri lim 2020-01-20 19:55:29 +07:00 committed by zah
parent ea4f851f80
commit 83e9debb62
2 changed files with 19 additions and 16 deletions

View File

@ -12,7 +12,7 @@ import
./interpreter/[opcode_values, gas_meter, gas_costs, vm_forks],
./code_stream, ./memory, ./message, ./stack, ../db/[state_db, db_chain],
../utils/header, stew/[byteutils, ranges], precompiles,
transaction_tracer
transaction_tracer, ../utils
when defined(evmc_enabled):
import evmc/evmc, evmc_helpers, evmc_api
@ -126,7 +126,14 @@ template getCode*(c: Computation, address: EthAddress): ByteRange =
else:
c.vmState.readOnlyStateDB.getCode(address)
proc newComputation*(vmState: BaseVMState, message: Message): Computation =
proc generateContractAddress(c: Computation, salt: Option[Uint256]): EthAddress =
if c.msg.kind == evmcCreate:
let creationNonce = c.vmState.readOnlyStateDb().getNonce(c.msg.sender)
result = generateAddress(c.msg.sender, creationNonce)
else:
result = generateSafeAddress(c.msg.sender, salt.get(), c.msg.code)
proc newComputation*(vmState: BaseVMState, message: Message, salt=none(Uint256)): Computation =
new result
result.vmState = vmState
result.msg = message
@ -137,6 +144,9 @@ proc newComputation*(vmState: BaseVMState, message: Message): Computation =
result.suicides = initHashSet[EthAddress]()
result.code = newCodeStream(message.code)
if result.msg.isCreate():
result.msg.contractAddress = result.generateContractAddress(salt)
when evmc_enabled:
result.host.init(
nim_host_get_interface(),

View File

@ -12,7 +12,7 @@ import
./gas_meter, ./gas_costs, ./opcode_values, ./vm_forks,
../memory, ../message, ../stack, ../code_stream, ../computation,
../../vm_state, ../../errors, ../../constants, ../../vm_types,
../../db/[db_chain, state_db], ../../utils
../../db/[db_chain, state_db]
when defined(evmc_enabled):
import ../evmc_api, ../evmc_helpers
@ -577,11 +577,7 @@ proc canTransfer(c: Computation, memPos, memLen: int, value: Uint256, opCode: st
result = true
proc setupCreate(c: Computation, memPos, len: int, value: Uint256, opCode: static[Op]): Computation =
let
callData = c.memory.read(memPos, len)
var
createMsgGas = c.gasMeter.gasRemaining
var createMsgGas = c.gasMeter.gasRemaining
if c.fork >= FkTangerine:
createMsgGas -= createMsgGas div 64
@ -590,26 +586,23 @@ proc setupCreate(c: Computation, memPos, len: int, value: Uint256, opCode: stati
when opCode == Create:
const callKind = evmcCreate
let creationNonce = c.vmState.readOnlyStateDb().getNonce(c.msg.contractAddress)
let contractAddress = generateAddress(c.msg.contractAddress, creationNonce)
else:
const callKind = evmcCreate2
let salt = c.stack.popInt()
let contractAddress = generateSafeAddress(c.msg.contractAddress, salt, callData)
let childMsg = Message(
kind: callKind,
depth: c.msg.depth + 1,
gas: createMsgGas,
sender: c.msg.contractAddress,
contractAddress: contractAddress,
codeAddress: CREATE_CONTRACT_ADDRESS,
value: value,
data: @[],
code: callData
code: c.memory.read(memPos, len)
)
result = newComputation(c.vmState, childMsg)
when opCode == Create:
result = newComputation(c.vmState, childMsg)
else:
result = newComputation(c.vmState, childMsg, c.stack.popInt().some)
template genCreate(callName: untyped, opCode: Op): untyped =
op callName, inline = false, val, startPosition, size: