mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-02-25 18:35:32 +00:00
move contract address creation to 'Computation'
This commit is contained in:
parent
ea4f851f80
commit
83e9debb62
@ -12,7 +12,7 @@ import
|
|||||||
./interpreter/[opcode_values, gas_meter, gas_costs, vm_forks],
|
./interpreter/[opcode_values, gas_meter, gas_costs, vm_forks],
|
||||||
./code_stream, ./memory, ./message, ./stack, ../db/[state_db, db_chain],
|
./code_stream, ./memory, ./message, ./stack, ../db/[state_db, db_chain],
|
||||||
../utils/header, stew/[byteutils, ranges], precompiles,
|
../utils/header, stew/[byteutils, ranges], precompiles,
|
||||||
transaction_tracer
|
transaction_tracer, ../utils
|
||||||
|
|
||||||
when defined(evmc_enabled):
|
when defined(evmc_enabled):
|
||||||
import evmc/evmc, evmc_helpers, evmc_api
|
import evmc/evmc, evmc_helpers, evmc_api
|
||||||
@ -126,7 +126,14 @@ template getCode*(c: Computation, address: EthAddress): ByteRange =
|
|||||||
else:
|
else:
|
||||||
c.vmState.readOnlyStateDB.getCode(address)
|
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
|
new result
|
||||||
result.vmState = vmState
|
result.vmState = vmState
|
||||||
result.msg = message
|
result.msg = message
|
||||||
@ -137,6 +144,9 @@ proc newComputation*(vmState: BaseVMState, message: Message): Computation =
|
|||||||
result.suicides = initHashSet[EthAddress]()
|
result.suicides = initHashSet[EthAddress]()
|
||||||
result.code = newCodeStream(message.code)
|
result.code = newCodeStream(message.code)
|
||||||
|
|
||||||
|
if result.msg.isCreate():
|
||||||
|
result.msg.contractAddress = result.generateContractAddress(salt)
|
||||||
|
|
||||||
when evmc_enabled:
|
when evmc_enabled:
|
||||||
result.host.init(
|
result.host.init(
|
||||||
nim_host_get_interface(),
|
nim_host_get_interface(),
|
||||||
|
@ -12,7 +12,7 @@ import
|
|||||||
./gas_meter, ./gas_costs, ./opcode_values, ./vm_forks,
|
./gas_meter, ./gas_costs, ./opcode_values, ./vm_forks,
|
||||||
../memory, ../message, ../stack, ../code_stream, ../computation,
|
../memory, ../message, ../stack, ../code_stream, ../computation,
|
||||||
../../vm_state, ../../errors, ../../constants, ../../vm_types,
|
../../vm_state, ../../errors, ../../constants, ../../vm_types,
|
||||||
../../db/[db_chain, state_db], ../../utils
|
../../db/[db_chain, state_db]
|
||||||
|
|
||||||
when defined(evmc_enabled):
|
when defined(evmc_enabled):
|
||||||
import ../evmc_api, ../evmc_helpers
|
import ../evmc_api, ../evmc_helpers
|
||||||
@ -577,11 +577,7 @@ proc canTransfer(c: Computation, memPos, memLen: int, value: Uint256, opCode: st
|
|||||||
result = true
|
result = true
|
||||||
|
|
||||||
proc setupCreate(c: Computation, memPos, len: int, value: Uint256, opCode: static[Op]): Computation =
|
proc setupCreate(c: Computation, memPos, len: int, value: Uint256, opCode: static[Op]): Computation =
|
||||||
let
|
var createMsgGas = c.gasMeter.gasRemaining
|
||||||
callData = c.memory.read(memPos, len)
|
|
||||||
|
|
||||||
var
|
|
||||||
createMsgGas = c.gasMeter.gasRemaining
|
|
||||||
if c.fork >= FkTangerine:
|
if c.fork >= FkTangerine:
|
||||||
createMsgGas -= createMsgGas div 64
|
createMsgGas -= createMsgGas div 64
|
||||||
|
|
||||||
@ -590,26 +586,23 @@ proc setupCreate(c: Computation, memPos, len: int, value: Uint256, opCode: stati
|
|||||||
|
|
||||||
when opCode == Create:
|
when opCode == Create:
|
||||||
const callKind = evmcCreate
|
const callKind = evmcCreate
|
||||||
let creationNonce = c.vmState.readOnlyStateDb().getNonce(c.msg.contractAddress)
|
|
||||||
let contractAddress = generateAddress(c.msg.contractAddress, creationNonce)
|
|
||||||
else:
|
else:
|
||||||
const callKind = evmcCreate2
|
const callKind = evmcCreate2
|
||||||
let salt = c.stack.popInt()
|
|
||||||
let contractAddress = generateSafeAddress(c.msg.contractAddress, salt, callData)
|
|
||||||
|
|
||||||
let childMsg = Message(
|
let childMsg = Message(
|
||||||
kind: callKind,
|
kind: callKind,
|
||||||
depth: c.msg.depth + 1,
|
depth: c.msg.depth + 1,
|
||||||
gas: createMsgGas,
|
gas: createMsgGas,
|
||||||
sender: c.msg.contractAddress,
|
sender: c.msg.contractAddress,
|
||||||
contractAddress: contractAddress,
|
|
||||||
codeAddress: CREATE_CONTRACT_ADDRESS,
|
|
||||||
value: value,
|
value: value,
|
||||||
data: @[],
|
data: @[],
|
||||||
code: callData
|
code: c.memory.read(memPos, len)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
when opCode == Create:
|
||||||
result = newComputation(c.vmState, childMsg)
|
result = newComputation(c.vmState, childMsg)
|
||||||
|
else:
|
||||||
|
result = newComputation(c.vmState, childMsg, c.stack.popInt().some)
|
||||||
|
|
||||||
template genCreate(callName: untyped, opCode: Op): untyped =
|
template genCreate(callName: untyped, opCode: Op): untyped =
|
||||||
op callName, inline = false, val, startPosition, size:
|
op callName, inline = false, val, startPosition, size:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user