|
|
|
@ -9,7 +9,6 @@ import re |
|
|
|
|
|
|
|
|
|
def trace(code, calldata=""): |
|
|
|
|
log_handlers = ['eth.vm.op', 'eth.vm.op.stack', 'eth.vm.op.memory', 'eth.vm.op.storage'] |
|
|
|
|
|
|
|
|
|
output = StringIO() |
|
|
|
|
stream_handler = StreamHandler(output) |
|
|
|
|
|
|
|
|
@ -19,48 +18,33 @@ def trace(code, calldata=""): |
|
|
|
|
log_vm_op.addHandler(stream_handler) |
|
|
|
|
|
|
|
|
|
addr = bytes.fromhex('0123456789ABCDEF0123456789ABCDEF01234567') |
|
|
|
|
|
|
|
|
|
state = State() |
|
|
|
|
|
|
|
|
|
ext = messages.VMExt(state, transactions.Transaction(0, 0, 21000, addr, 0, addr)) |
|
|
|
|
|
|
|
|
|
message = vm.Message(addr, addr, 0, 21000, calldata) |
|
|
|
|
|
|
|
|
|
vm.vm_execute(ext, message, util.safe_decode(code)) |
|
|
|
|
|
|
|
|
|
stream_handler.flush() |
|
|
|
|
|
|
|
|
|
ret = output.getvalue() |
|
|
|
|
|
|
|
|
|
lines = ret.split("\n") |
|
|
|
|
|
|
|
|
|
trace = [] |
|
|
|
|
|
|
|
|
|
for line in lines: |
|
|
|
|
|
|
|
|
|
m = re.search(r'pc=b\'(\d+)\'.*op=([A-Z0-9]+)', line) |
|
|
|
|
|
|
|
|
|
if m: |
|
|
|
|
pc = m.group(1) |
|
|
|
|
op = m.group(2) |
|
|
|
|
|
|
|
|
|
m = re.match(r'.*stack=(\[.*?\])', line) |
|
|
|
|
|
|
|
|
|
if (m): |
|
|
|
|
|
|
|
|
|
if m: |
|
|
|
|
stackitems = re.findall(r'b\'(\d+)\'', m.group(1)) |
|
|
|
|
|
|
|
|
|
stack = "["; |
|
|
|
|
|
|
|
|
|
if len(stackitems): |
|
|
|
|
|
|
|
|
|
for i in range(0, len(stackitems) - 1): |
|
|
|
|
stack += hex(int(stackitems[i])) + ", " |
|
|
|
|
|
|
|
|
|
stack += hex(int(stackitems[-1])) |
|
|
|
|
|
|
|
|
|
stack += "]" |
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
stack = "[]" |
|
|
|
|
|
|
|
|
|