Skip to content

Commit

Permalink
fixes #236
Browse files Browse the repository at this point in the history
  • Loading branch information
jangko authored and zah committed Feb 21, 2019
1 parent 4dc4555 commit 47a8089
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 15 deletions.
6 changes: 3 additions & 3 deletions nimbus/vm/computation.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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)
10 changes: 6 additions & 4 deletions nimbus/vm/interpreter_dispatch.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
12 changes: 7 additions & 5 deletions nimbus/vm/transaction_tracer.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand All @@ -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:
Expand Down Expand Up @@ -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
Expand All @@ -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))
Expand Down
1 change: 0 additions & 1 deletion nimbus/vm_types.nim
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ type

TransactionTracer* = object
trace*: JsonNode
gasRemaining*: GasInt
flags*: set[TracerFlags]
accounts*: HashSet[EthAddress]
storageKeys*: seq[HashSet[Uint256]]
Expand Down
6 changes: 4 additions & 2 deletions premix/premixcore.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 47a8089

Please sign in to comment.