fixes #236
This commit is contained in:
parent
4dc45550dd
commit
47a8089ff8
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -40,7 +40,6 @@ type
|
|||
|
||||
TransactionTracer* = object
|
||||
trace*: JsonNode
|
||||
gasRemaining*: GasInt
|
||||
flags*: set[TracerFlags]
|
||||
accounts*: HashSet[EthAddress]
|
||||
storageKeys*: seq[HashSet[Uint256]]
|
||||
|
|
|
@ -13,8 +13,10 @@ proc fakeAlloc(n: JsonNode) =
|
|||
let
|
||||
prevMem = n[i-1]["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
|
||||
for _ in 0 ..< diff:
|
||||
prevMem.add %chunk
|
||||
|
|
Loading…
Reference in New Issue