diff --git a/nimbus/vm/computation.nim b/nimbus/vm/computation.nim index 0d8accd71..86efc4a63 100644 --- a/nimbus/vm/computation.nim +++ b/nimbus/vm/computation.nim @@ -344,3 +344,6 @@ proc traceOpCodeEnded*(c: BaseComputation, op: Op, lastIndex: int) = proc traceError*(c: BaseComputation) = c.vmState.tracer.traceError(c) + +proc prepareTracer*(c: BaseComputation) = + c.vmState.tracer.prepare(c.msg.depth) diff --git a/nimbus/vm/interpreter_dispatch.nim b/nimbus/vm/interpreter_dispatch.nim index 08350897c..848849cad 100644 --- a/nimbus/vm/interpreter_dispatch.nim +++ b/nimbus/vm/interpreter_dispatch.nim @@ -228,6 +228,7 @@ proc opTableToCaseStmt(opTable: array[Op, NimNode], computation: NimNode): NimNo # Wrap the case statement in while true + computed goto result = quote do: + `computation`.prepareTracer() var `instr` = `computation`.code.next() while true: {.computedGoto.} diff --git a/nimbus/vm/transaction_tracer.nim b/nimbus/vm/transaction_tracer.nim index 0534f48f4..f863f9921 100644 --- a/nimbus/vm/transaction_tracer.nim +++ b/nimbus/vm/transaction_tracer.nim @@ -24,13 +24,16 @@ proc initTracer*(tracer: var TransactionTracer, flags: set[TracerFlags] = {}) = tracer.accounts = initSet[EthAddress]() tracer.storageKeys = @[] -proc rememberStorageKey(tracer: var TransactionTracer, compDepth: int, key: Uint256) = +proc prepare*(tracer: var TransactionTracer, compDepth: int) = if compDepth >= tracer.storageKeys.len: let prevLen = tracer.storageKeys.len tracer.storageKeys.setLen(compDepth + 1) - for i in prevLen ..< tracer.storageKeys.len: + for i in prevLen ..< tracer.storageKeys.len - 1: tracer.storageKeys[i] = initSet[Uint256]() + tracer.storageKeys[compDepth] = initSet[Uint256]() + +proc rememberStorageKey(tracer: var TransactionTracer, compDepth: int, key: Uint256) = tracer.storageKeys[compDepth].incl key iterator storage(tracer: TransactionTracer, compDepth: int): Uint256 =