This commit is contained in:
andri lim 2019-02-21 15:17:43 +07:00 committed by zah
parent 4dc45550dd
commit 47a8089ff8
5 changed files with 20 additions and 15 deletions

View File

@ -333,11 +333,11 @@ proc getGasRemaining*(c: BaseComputation): GasInt =
proc tracingEnabled*(c: BaseComputation): bool = proc tracingEnabled*(c: BaseComputation): bool =
c.vmState.tracingEnabled c.vmState.tracingEnabled
proc traceOpCodeStarted*(c: BaseComputation, op: Op) = proc traceOpCodeStarted*(c: BaseComputation, op: Op): int =
c.vmState.tracer.traceOpCodeStarted(c, op) c.vmState.tracer.traceOpCodeStarted(c, op)
proc traceOpCodeEnded*(c: BaseComputation, op: Op) = proc traceOpCodeEnded*(c: BaseComputation, op: Op, lastIndex: int) =
c.vmState.tracer.traceOpCodeEnded(c, op) c.vmState.tracer.traceOpCodeEnded(c, op, lastIndex)
proc traceError*(c: BaseComputation) = proc traceError*(c: BaseComputation) =
c.vmState.tracer.traceError(c) c.vmState.tracer.traceError(c)

View File

@ -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 let asOp = quote do: Op(`op`) # TODO: unfortunately when passing to runtime, ops are transformed into int
if BaseGasCosts[op].kind == GckFixed: if BaseGasCosts[op].kind == GckFixed:
quote do: quote do:
var lastOpIndex: int
if `computation`.tracingEnabled: if `computation`.tracingEnabled:
`computation`.traceOpCodeStarted(`asOp`) lastOpIndex = `computation`.traceOpCodeStarted(`asOp`)
`computation`.gasMeter.consumeGas(`computation`.gasCosts[`asOp`].cost, reason = $`asOp`) `computation`.gasMeter.consumeGas(`computation`.gasCosts[`asOp`].cost, reason = $`asOp`)
`opImpl`(`computation`) `opImpl`(`computation`)
if `computation`.tracingEnabled: if `computation`.tracingEnabled:
`computation`.traceOpCodeEnded(`asOp`) `computation`.traceOpCodeEnded(`asOp`, lastOpIndex)
`instr` = `computation`.code.next() `instr` = `computation`.code.next()
else: else:
quote do: quote do:
var lastOpIndex: int
if `computation`.tracingEnabled: if `computation`.tracingEnabled:
`computation`.traceOpCodeStarted(`asOp`) lastOpIndex = `computation`.traceOpCodeStarted(`asOp`)
`opImpl`(`computation`) `opImpl`(`computation`)
if `computation`.tracingEnabled: if `computation`.tracingEnabled:
`computation`.traceOpCodeEnded(`asOp`) `computation`.traceOpCodeEnded(`asOp`, lastOpIndex)
when `asOp` in {Return, Revert, SelfDestruct}: when `asOp` in {Return, Revert, SelfDestruct}:
break break
else: else:

View File

@ -38,7 +38,7 @@ iterator storage(tracer: TransactionTracer, compDepth: int): Uint256 =
for key in tracer.storageKeys[compDepth]: for key in tracer.storageKeys[compDepth]:
yield key 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: if unlikely tracer.trace.isNil:
tracer.initTracer() tracer.initTracer()
@ -49,7 +49,6 @@ proc traceOpCodeStarted*(tracer: var TransactionTracer, c: BaseComputation, op:
j["pc"] = %(c.code.pc - 1) j["pc"] = %(c.code.pc - 1)
j["depth"] = %(c.msg.depth + 1) j["depth"] = %(c.msg.depth + 1)
j["gas"] = %c.gasMeter.gasRemaining j["gas"] = %c.gasMeter.gasRemaining
tracer.gasRemaining = c.gasMeter.gasRemaining
# log stack # log stack
if TracerFlags.DisableStack notin tracer.flags: if TracerFlags.DisableStack notin tracer.flags:
@ -83,8 +82,10 @@ proc traceOpCodeStarted*(tracer: var TransactionTracer, c: BaseComputation, op:
assert(c.stack.values.len > 1) assert(c.stack.values.len > 1)
tracer.rememberStorageKey(c.msg.depth, c.stack[^1, Uint256]) tracer.rememberStorageKey(c.msg.depth, c.stack[^1, Uint256])
proc traceOpCodeEnded*(tracer: var TransactionTracer, c: BaseComputation, op: Op) = result = tracer.trace["structLogs"].len - 1
let j = tracer.trace["structLogs"].elems[^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 # TODO: figure out how to get storage
# when contract execution interrupted by exception # when contract execution interrupted by exception
@ -97,7 +98,8 @@ proc traceOpCodeEnded*(tracer: var TransactionTracer, c: BaseComputation, op: Op
storage[key.dumpHex] = %(value.dumpHex) storage[key.dumpHex] = %(value.dumpHex)
j["storage"] = storage 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}: if op in {Return, Revert}:
let returnValue = %("0x" & toHex(c.rawOutput, true)) let returnValue = %("0x" & toHex(c.rawOutput, true))

View File

@ -40,7 +40,6 @@ type
TransactionTracer* = object TransactionTracer* = object
trace*: JsonNode trace*: JsonNode
gasRemaining*: GasInt
flags*: set[TracerFlags] flags*: set[TracerFlags]
accounts*: HashSet[EthAddress] accounts*: HashSet[EthAddress]
storageKeys*: seq[HashSet[Uint256]] storageKeys*: seq[HashSet[Uint256]]

View File

@ -13,8 +13,10 @@ proc fakeAlloc(n: JsonNode) =
let let
prevMem = n[i-1]["memory"] prevMem = n[i-1]["memory"]
currMem = n[i]["memory"] currMem = n[i]["memory"]
prevPc = n[i-1]["pc"].getInt()
currPc = n[i]["pc"].getInt()
if currMem.len > prevMem.len: if currMem.len > prevMem.len and prevPc == currPc - 1:
let diff = currMem.len - prevMem.len let diff = currMem.len - prevMem.len
for _ in 0 ..< diff: for _ in 0 ..< diff:
prevMem.add %chunk prevMem.add %chunk