From 47a8089ff8c1ad85d6ff30fe19d8d981561a9016 Mon Sep 17 00:00:00 2001 From: andri lim Date: Thu, 21 Feb 2019 15:17:43 +0700 Subject: [PATCH] fixes #236 --- nimbus/vm/computation.nim | 6 +++--- nimbus/vm/interpreter_dispatch.nim | 10 ++++++---- nimbus/vm/transaction_tracer.nim | 12 +++++++----- nimbus/vm_types.nim | 1 - premix/premixcore.nim | 6 ++++-- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/nimbus/vm/computation.nim b/nimbus/vm/computation.nim index 3391a9172..c5a4646c4 100644 --- a/nimbus/vm/computation.nim +++ b/nimbus/vm/computation.nim @@ -333,11 +333,11 @@ proc getGasRemaining*(c: BaseComputation): GasInt = proc tracingEnabled*(c: BaseComputation): bool = c.vmState.tracingEnabled -proc traceOpCodeStarted*(c: BaseComputation, op: Op) = +proc traceOpCodeStarted*(c: BaseComputation, op: Op): int = c.vmState.tracer.traceOpCodeStarted(c, op) -proc traceOpCodeEnded*(c: BaseComputation, op: Op) = - c.vmState.tracer.traceOpCodeEnded(c, op) +proc traceOpCodeEnded*(c: BaseComputation, op: Op, lastIndex: int) = + c.vmState.tracer.traceOpCodeEnded(c, op, lastIndex) proc traceError*(c: BaseComputation) = c.vmState.tracer.traceError(c) diff --git a/nimbus/vm/interpreter_dispatch.nim b/nimbus/vm/interpreter_dispatch.nim index 81ba5df9a..62a5eaabc 100644 --- a/nimbus/vm/interpreter_dispatch.nim +++ b/nimbus/vm/interpreter_dispatch.nim @@ -196,20 +196,22 @@ proc opTableToCaseStmt(opTable: array[Op, NimNode], computation: NimNode): NimNo let asOp = quote do: Op(`op`) # TODO: unfortunately when passing to runtime, ops are transformed into int if BaseGasCosts[op].kind == GckFixed: quote do: + var lastOpIndex: int if `computation`.tracingEnabled: - `computation`.traceOpCodeStarted(`asOp`) + lastOpIndex = `computation`.traceOpCodeStarted(`asOp`) `computation`.gasMeter.consumeGas(`computation`.gasCosts[`asOp`].cost, reason = $`asOp`) `opImpl`(`computation`) if `computation`.tracingEnabled: - `computation`.traceOpCodeEnded(`asOp`) + `computation`.traceOpCodeEnded(`asOp`, lastOpIndex) `instr` = `computation`.code.next() else: quote do: + var lastOpIndex: int if `computation`.tracingEnabled: - `computation`.traceOpCodeStarted(`asOp`) + lastOpIndex = `computation`.traceOpCodeStarted(`asOp`) `opImpl`(`computation`) if `computation`.tracingEnabled: - `computation`.traceOpCodeEnded(`asOp`) + `computation`.traceOpCodeEnded(`asOp`, lastOpIndex) when `asOp` in {Return, Revert, SelfDestruct}: break else: diff --git a/nimbus/vm/transaction_tracer.nim b/nimbus/vm/transaction_tracer.nim index d82fac0dc..f6a053d7c 100644 --- a/nimbus/vm/transaction_tracer.nim +++ b/nimbus/vm/transaction_tracer.nim @@ -38,7 +38,7 @@ iterator storage(tracer: TransactionTracer, compDepth: int): Uint256 = for key in tracer.storageKeys[compDepth]: yield key -proc traceOpCodeStarted*(tracer: var TransactionTracer, c: BaseComputation, op: Op) = +proc traceOpCodeStarted*(tracer: var TransactionTracer, c: BaseComputation, op: Op): int = if unlikely tracer.trace.isNil: tracer.initTracer() @@ -49,7 +49,6 @@ proc traceOpCodeStarted*(tracer: var TransactionTracer, c: BaseComputation, op: j["pc"] = %(c.code.pc - 1) j["depth"] = %(c.msg.depth + 1) j["gas"] = %c.gasMeter.gasRemaining - tracer.gasRemaining = c.gasMeter.gasRemaining # log stack if TracerFlags.DisableStack notin tracer.flags: @@ -83,8 +82,10 @@ proc traceOpCodeStarted*(tracer: var TransactionTracer, c: BaseComputation, op: assert(c.stack.values.len > 1) tracer.rememberStorageKey(c.msg.depth, c.stack[^1, Uint256]) -proc traceOpCodeEnded*(tracer: var TransactionTracer, c: BaseComputation, op: Op) = - let j = tracer.trace["structLogs"].elems[^1] + result = tracer.trace["structLogs"].len - 1 + +proc traceOpCodeEnded*(tracer: var TransactionTracer, c: BaseComputation, op: Op, lastIndex: int) = + let j = tracer.trace["structLogs"].elems[lastIndex] # TODO: figure out how to get storage # when contract execution interrupted by exception @@ -97,7 +98,8 @@ proc traceOpCodeEnded*(tracer: var TransactionTracer, c: BaseComputation, op: Op storage[key.dumpHex] = %(value.dumpHex) j["storage"] = storage - j["gasCost"] = %(tracer.gasRemaining - c.gasMeter.gasRemaining) + let gasRemaining = j["gas"].getInt() + j["gasCost"] = %(gasRemaining - c.gasMeter.gasRemaining) if op in {Return, Revert}: let returnValue = %("0x" & toHex(c.rawOutput, true)) diff --git a/nimbus/vm_types.nim b/nimbus/vm_types.nim index d1555be38..b29af1540 100644 --- a/nimbus/vm_types.nim +++ b/nimbus/vm_types.nim @@ -40,7 +40,6 @@ type TransactionTracer* = object trace*: JsonNode - gasRemaining*: GasInt flags*: set[TracerFlags] accounts*: HashSet[EthAddress] storageKeys*: seq[HashSet[Uint256]] diff --git a/premix/premixcore.nim b/premix/premixcore.nim index f018c2499..80870d8e6 100644 --- a/premix/premixcore.nim +++ b/premix/premixcore.nim @@ -13,8 +13,10 @@ proc fakeAlloc(n: JsonNode) = let prevMem = n[i-1]["memory"] currMem = n[i]["memory"] - - if currMem.len > prevMem.len: + prevPc = n[i-1]["pc"].getInt() + currPc = n[i]["pc"].getInt() + + if currMem.len > prevMem.len and prevPc == currPc - 1: let diff = currMem.len - prevMem.len for _ in 0 ..< diff: prevMem.add %chunk