diff --git a/nimbus/p2p/executor.nim b/nimbus/p2p/executor.nim index 5d6f9244d..5b704171b 100644 --- a/nimbus/p2p/executor.nim +++ b/nimbus/p2p/executor.nim @@ -29,7 +29,6 @@ proc processTransaction*(tx: Transaction, sender: EthAddress, vmState: BaseVMSta if balance < upfrontGasCost: break let recipient = tx.getRecipient() - let isCollision = vmState.readOnlyStateDb().hasCodeOrNonce(recipient) var c = setupComputation(vmState, tx, sender, recipient, fork) if c.isNil: # OOG in setupComputation @@ -40,7 +39,6 @@ proc processTransaction*(tx: Transaction, sender: EthAddress, vmState: BaseVMSta db.incNonce(sender) db.subBalance(sender, upfrontGasCost) - if tx.isContractCreation and isCollision: break execComputation(c) if not c.shouldBurnGas: gasUsed = c.refundGas(tx, sender) diff --git a/nimbus/vm/computation.nim b/nimbus/vm/computation.nim index d3c48edfa..62eb57972 100644 --- a/nimbus/vm/computation.nim +++ b/nimbus/vm/computation.nim @@ -144,7 +144,13 @@ proc applyMessage*(c: Computation, opCode: static[Op]) = defer: c.dispose() - when opCode in {Create, Create2}: + when opCode == Create: + if c.vmState.readOnlyStateDb().hasCodeOrNonce(c.msg.contractAddress): + c.setError("Address collision when creating contract address={c.msg.contractAddress.toHex}", true) + c.rollback() + c.nextProc() + return + c.vmState.mutateStateDb: db.clearStorage(c.msg.contractAddress) if c.fork >= FkSpurious: diff --git a/nimbus/vm/interpreter/opcodes_impl.nim b/nimbus/vm/interpreter/opcodes_impl.nim index 50b27c328..078ee0cdf 100644 --- a/nimbus/vm/interpreter/opcodes_impl.nim +++ b/nimbus/vm/interpreter/opcodes_impl.nim @@ -539,8 +539,7 @@ proc setupCreate(c: Computation, memPos, len: int, value: Uint256, opCode: stati callData = c.memory.read(memPos, len) var - createMsgGas = c.getGasRemaining() - + createMsgGas = c.gasMeter.gasRemaining if c.fork >= FkTangerine: createMsgGas -= createMsgGas div 64 @@ -555,25 +554,16 @@ proc setupCreate(c: Computation, memPos, len: int, value: Uint256, opCode: stati when opCode == Create: const callKind = evmcCreate c.vmState.mutateStateDB: - # Regarding collisions, see: https://github.com/status-im/nimbus/issues/133 - # See: https://github.com/ethereum/EIPs/issues/684 let creationNonce = db.getNonce(c.msg.contractAddress) db.setNonce(c.msg.contractAddress, creationNonce + 1) contractAddress = generateAddress(c.msg.contractAddress, creationNonce) - isCollision = db.hasCodeOrNonce(contractAddress) else: const callKind = evmcCreate2 c.vmState.mutateStateDB: db.incNonce(c.msg.contractAddress) let salt = c.stack.popInt() contractAddress = generateSafeAddress(c.msg.contractAddress, salt, callData) - isCollision = db.hasCodeOrNonce(contractAddress) - - if isCollision: - debug "Address collision while creating contract", address = contractAddress.toHex - push: 0 - return let childMsg = Message( kind: callKind, diff --git a/nimbus/vm_state_transactions.nim b/nimbus/vm_state_transactions.nim index 83d51def4..428952bca 100644 --- a/nimbus/vm_state_transactions.nim +++ b/nimbus/vm_state_transactions.nim @@ -70,9 +70,10 @@ proc execComputation*(c: Computation) = if c.fork >= FkSpurious: c.collectTouchedAccounts() - c.refundSelfDestruct() + if c.isSuccess: + c.refundSelfDestruct() c.vmState.suicides = c.getSuicides() - + c.vmstate.status = c.isSuccess if c.isSuccess: c.vmState.addLogs(c.logEntries)