From 0e2068c99ebe2901908b7d6b554ac5af030ea65e Mon Sep 17 00:00:00 2001 From: coffeepots Date: Mon, 3 Sep 2018 19:30:27 +0100 Subject: [PATCH] Create Op now generates contract addresses & checks for collisions --- nimbus/vm/interpreter/opcodes_impl.nim | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/nimbus/vm/interpreter/opcodes_impl.nim b/nimbus/vm/interpreter/opcodes_impl.nim index dace995f4..7a6e9d99a 100644 --- a/nimbus/vm/interpreter/opcodes_impl.nim +++ b/nimbus/vm/interpreter/opcodes_impl.nim @@ -546,13 +546,16 @@ op create, inline = false, value, startPosition, size: ## TODO dynamic gas that depends on remaining gas - ##### getNonce type error: expression 'db' is of type: proc (vmState: untyped, readOnly: untyped, handler: untyped): untyped{.noSideEffect, gcsafe, locks: .} - # computation.vmState.db(readOnly=true): - # let creationNonce = db.getNonce(computation.msg.storageAddress) - # db.incrementNonce(computation.msg.storageAddress) - let contractAddress = ZERO_ADDRESS # generateContractAddress(computation.msg.storageAddress, creationNonce) + var + contractAddress: EthAddress + isCollision: bool - let isCollision = false # TODO: db.accountHasCodeOrNonce ... + computation.vmState.mutateStateDB: + let creationNonce = db.getNonce(computation.msg.storageAddress) + db.setNonce(computation.msg.storageAddress, creationNonce + 1) + + contractAddress = generateAddress(computation.msg.storageAddress, creationNonce) + isCollision = db.hasCodeOrNonce(contractAddress) if isCollision: debug("Address collision while creating contract", address = contractAddress.toHex)