diff --git a/nimbus/p2p/executor.nim b/nimbus/p2p/executor.nim index 02c33a5ca..040b4e441 100644 --- a/nimbus/p2p/executor.nim +++ b/nimbus/p2p/executor.nim @@ -34,7 +34,6 @@ proc processTransaction*(tx: Transaction, sender: EthAddress, vmState: BaseVMSta break vmState.mutateStateDB: - db.incNonce(sender) db.subBalance(sender, upfrontGasCost) execComputation(c) diff --git a/nimbus/vm/computation.nim b/nimbus/vm/computation.nim index ed867c2e8..5c333d3c6 100644 --- a/nimbus/vm/computation.nim +++ b/nimbus/vm/computation.nim @@ -243,6 +243,10 @@ proc postExecuteVM(c: Computation, opCode: static[Op]) {.gcsafe.} = proc executeOpcodes*(c: Computation) {.gcsafe.} proc applyMessage*(c: Computation, opCode: static[Op]) = + when opCode == Create: + c.vmState.mutateStateDB: + db.incNonce(c.msg.sender) + c.snapshot() defer: c.dispose() diff --git a/nimbus/vm/interpreter/opcodes_impl.nim b/nimbus/vm/interpreter/opcodes_impl.nim index 018f73639..1c5641aba 100644 --- a/nimbus/vm/interpreter/opcodes_impl.nim +++ b/nimbus/vm/interpreter/opcodes_impl.nim @@ -588,24 +588,14 @@ proc setupCreate(c: Computation, memPos, len: int, value: Uint256, opCode: stati # Consume gas here that will be passed to child c.gasMeter.consumeGas(createMsgGas, reason="CREATE") - # Generate new address and check for collisions - var - contractAddress: EthAddress - isCollision: bool - when opCode == Create: const callKind = evmcCreate - c.vmState.mutateStateDB: - let creationNonce = db.getNonce(c.msg.contractAddress) - db.setNonce(c.msg.contractAddress, creationNonce + 1) - - contractAddress = generateAddress(c.msg.contractAddress, creationNonce) + let creationNonce = c.vmState.readOnlyStateDb().getNonce(c.msg.contractAddress) + let contractAddress = generateAddress(c.msg.contractAddress, creationNonce) else: const callKind = evmcCreate2 - c.vmState.mutateStateDB: - db.incNonce(c.msg.contractAddress) - let salt = c.stack.popInt() - contractAddress = generateSafeAddress(c.msg.contractAddress, salt, callData) + let salt = c.stack.popInt() + let contractAddress = generateSafeAddress(c.msg.contractAddress, salt, callData) let childMsg = Message( kind: callKind, diff --git a/nimbus/vm_state_transactions.nim b/nimbus/vm_state_transactions.nim index aefcbb924..644275feb 100644 --- a/nimbus/vm_state_transactions.nim +++ b/nimbus/vm_state_transactions.nim @@ -69,6 +69,8 @@ proc execComputation*(c: Computation) = if c.msg.isCreate: c.applyMessage(Create) else: + c.vmState.mutateStateDB: + db.incNonce(c.msg.sender) c.applyMessage(Call) if c.fork >= FkSpurious: