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 =
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)

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
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:

View File

@ -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))

View File

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

View File

@ -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