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],
|
||||
./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(),
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user