fix internal transactions account tracing
This commit is contained in:
parent
281b7dffac
commit
b93d809805
|
@ -121,6 +121,7 @@ proc traceTransaction*(db: BaseChainDB, header: BlockHeader,
|
||||||
after.captureAccount(stateDb, sender, senderName)
|
after.captureAccount(stateDb, sender, senderName)
|
||||||
after.captureAccount(stateDb, recipient, recipientName)
|
after.captureAccount(stateDb, recipient, recipientName)
|
||||||
after.captureAccount(stateDb, header.coinbase, minerName)
|
after.captureAccount(stateDb, header.coinbase, minerName)
|
||||||
|
vmState.removeTracedAccounts(sender, recipient, header.coinbase)
|
||||||
stateDiff["afterRoot"] = %($stateDb.rootHash)
|
stateDiff["afterRoot"] = %($stateDb.rootHash)
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -176,11 +177,14 @@ proc dumpBlockState*(db: BaseChainDB, header: BlockHeader, body: BlockBody, dump
|
||||||
let recipient = tx.getRecipient
|
let recipient = tx.getRecipient
|
||||||
after.captureAccount(stateAfter, sender, senderName & $idx)
|
after.captureAccount(stateAfter, sender, senderName & $idx)
|
||||||
after.captureAccount(stateAfter, recipient, recipientName & $idx)
|
after.captureAccount(stateAfter, recipient, recipientName & $idx)
|
||||||
|
vmState.removeTracedAccounts(sender, recipient)
|
||||||
|
|
||||||
after.captureAccount(stateAfter, header.coinbase, minerName)
|
after.captureAccount(stateAfter, header.coinbase, minerName)
|
||||||
|
vmState.removeTracedAccounts(header.coinbase)
|
||||||
|
|
||||||
for idx, uncle in body.uncles:
|
for idx, uncle in body.uncles:
|
||||||
after.captureAccount(stateAfter, uncle.coinbase, uncleName & $idx)
|
after.captureAccount(stateAfter, uncle.coinbase, uncleName & $idx)
|
||||||
|
vmState.removeTracedAccounts(uncle.coinbase)
|
||||||
|
|
||||||
# internal transactions:
|
# internal transactions:
|
||||||
for idx, acc in tracedAccountsPairs(vmState):
|
for idx, acc in tracedAccountsPairs(vmState):
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import
|
import
|
||||||
json, strutils,
|
json, strutils, sets,
|
||||||
chronicles, nimcrypto, eth_common, stint,
|
chronicles, nimcrypto, eth_common, stint,
|
||||||
../vm_types, memory, stack, ../db/[db_chain, state_db],
|
../vm_types, memory, stack, ../db/[db_chain, state_db],
|
||||||
eth_trie/hexary, ./message, ranges/typedranges,
|
eth_trie/hexary, ./message, ranges/typedranges,
|
||||||
|
@ -18,7 +18,7 @@ proc initTracer*(tracer: var TransactionTracer, flags: set[TracerFlags] = {}) =
|
||||||
|
|
||||||
tracer.trace["structLogs"] = newJArray()
|
tracer.trace["structLogs"] = newJArray()
|
||||||
tracer.flags = flags
|
tracer.flags = flags
|
||||||
tracer.accounts = @[]
|
tracer.accounts = initSet[EthAddress]()
|
||||||
|
|
||||||
proc traceOpCodeStarted*(tracer: var TransactionTracer, c: BaseComputation, op: Op) =
|
proc traceOpCodeStarted*(tracer: var TransactionTracer, c: BaseComputation, op: Op) =
|
||||||
if unlikely tracer.trace.isNil:
|
if unlikely tracer.trace.isNil:
|
||||||
|
@ -53,10 +53,10 @@ proc traceOpCodeStarted*(tracer: var TransactionTracer, c: BaseComputation, op:
|
||||||
case op
|
case op
|
||||||
of Call, CallCode, DelegateCall, StaticCall:
|
of Call, CallCode, DelegateCall, StaticCall:
|
||||||
assert(c.stack.values.len > 2)
|
assert(c.stack.values.len > 2)
|
||||||
tracer.accounts.add c.stack[^2, EthAddress]
|
tracer.accounts.incl c.stack[^2, EthAddress]
|
||||||
of SelfDestruct:
|
of ExtCodeCopy, ExtCodeSize, Balance, SelfDestruct:
|
||||||
assert(c.stack.values.len > 1)
|
assert(c.stack.values.len > 1)
|
||||||
tracer.accounts.add c.stack[^1, EthAddress]
|
tracer.accounts.incl c.stack[^1, EthAddress]
|
||||||
else:
|
else:
|
||||||
discard
|
discard
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
||||||
|
|
||||||
import
|
import
|
||||||
macros, strformat, tables,
|
macros, strformat, tables, sets,
|
||||||
eth_common, eth_trie/db,
|
eth_common, eth_trie/db,
|
||||||
./constants, ./errors, ./transaction, ./db/[db_chain, state_db],
|
./constants, ./errors, ./transaction, ./db/[db_chain, state_db],
|
||||||
./utils/header, json, vm_types, vm/transaction_tracer
|
./utils/header, json, vm_types, vm/transaction_tracer
|
||||||
|
@ -150,5 +150,12 @@ iterator tracedAccounts*(vmState: BaseVMState): EthAddress =
|
||||||
yield acc
|
yield acc
|
||||||
|
|
||||||
iterator tracedAccountsPairs*(vmState: BaseVMState): (int, EthAddress) =
|
iterator tracedAccountsPairs*(vmState: BaseVMState): (int, EthAddress) =
|
||||||
for idx, acc in vmState.tracer.accounts:
|
var idx = 0
|
||||||
|
for acc in vmState.tracer.accounts:
|
||||||
yield (idx, acc)
|
yield (idx, acc)
|
||||||
|
inc idx
|
||||||
|
|
||||||
|
proc removeTracedAccounts*(vmState: BaseVMState, accounts: varargs[EthAddress]) =
|
||||||
|
for acc in accounts:
|
||||||
|
vmState.tracer.accounts.excl acc
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
import
|
import
|
||||||
tables, eth_common, options,
|
tables, eth_common, options,
|
||||||
./constants, json,
|
./constants, json, sets,
|
||||||
./vm/[memory, stack, code_stream],
|
./vm/[memory, stack, code_stream],
|
||||||
./vm/interpreter/[gas_costs, opcode_values, vm_forks], # TODO - will be hidden at a lower layer
|
./vm/interpreter/[gas_costs, opcode_values, vm_forks], # TODO - will be hidden at a lower layer
|
||||||
./db/[db_chain, state_db]
|
./db/[db_chain, state_db]
|
||||||
|
@ -42,7 +42,7 @@ type
|
||||||
trace*: JsonNode
|
trace*: JsonNode
|
||||||
gasRemaining*: GasInt
|
gasRemaining*: GasInt
|
||||||
flags*: set[TracerFlags]
|
flags*: set[TracerFlags]
|
||||||
accounts*: seq[EthAddress]
|
accounts*: HashSet[EthAddress]
|
||||||
|
|
||||||
OpcodeExecutor* = proc(computation: var BaseComputation)
|
OpcodeExecutor* = proc(computation: var BaseComputation)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue