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 =
|
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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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]]
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue