|
|
|
@ -7,69 +7,68 @@ from io import StringIO |
|
|
|
|
import re |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def trace(code, calldata = ""): |
|
|
|
|
def trace(code, calldata=""): |
|
|
|
|
log_handlers = ['eth.vm.op', 'eth.vm.op.stack', 'eth.vm.op.memory', 'eth.vm.op.storage'] |
|
|
|
|
|
|
|
|
|
log_handlers = ['eth.vm.op', 'eth.vm.op.stack', 'eth.vm.op.memory', 'eth.vm.op.storage'] |
|
|
|
|
output = StringIO() |
|
|
|
|
stream_handler = StreamHandler(output) |
|
|
|
|
|
|
|
|
|
output = StringIO() |
|
|
|
|
stream_handler = StreamHandler(output) |
|
|
|
|
for handler in log_handlers: |
|
|
|
|
log_vm_op = get_logger(handler) |
|
|
|
|
log_vm_op.setLevel("TRACE") |
|
|
|
|
log_vm_op.addHandler(stream_handler) |
|
|
|
|
|
|
|
|
|
for handler in log_handlers: |
|
|
|
|
log_vm_op = get_logger(handler) |
|
|
|
|
log_vm_op.setLevel("TRACE") |
|
|
|
|
log_vm_op.addHandler(stream_handler) |
|
|
|
|
addr = bytes.fromhex('0123456789ABCDEF0123456789ABCDEF01234567') |
|
|
|
|
|
|
|
|
|
addr = bytes.fromhex('0123456789ABCDEF0123456789ABCDEF01234567') |
|
|
|
|
state = State() |
|
|
|
|
|
|
|
|
|
state = State() |
|
|
|
|
ext = messages.VMExt(state, transactions.Transaction(0, 0, 21000, addr, 0, addr)) |
|
|
|
|
|
|
|
|
|
ext = messages.VMExt(state, transactions.Transaction(0, 0, 21000, addr, 0, addr)) |
|
|
|
|
message = vm.Message(addr, addr, 0, 21000, calldata) |
|
|
|
|
|
|
|
|
|
message = vm.Message(addr, addr, 0, 21000, calldata) |
|
|
|
|
res, gas, dat = vm.vm_execute(ext, message, util.safe_decode(code)) |
|
|
|
|
|
|
|
|
|
res, gas, dat = vm.vm_execute(ext, message, util.safe_decode(code)) |
|
|
|
|
stream_handler.flush() |
|
|
|
|
|
|
|
|
|
stream_handler.flush() |
|
|
|
|
ret = output.getvalue() |
|
|
|
|
|
|
|
|
|
ret = output.getvalue() |
|
|
|
|
lines = ret.split("\n") |
|
|
|
|
|
|
|
|
|
lines = ret.split("\n") |
|
|
|
|
trace = [] |
|
|
|
|
|
|
|
|
|
trace = [] |
|
|
|
|
for line in lines: |
|
|
|
|
|
|
|
|
|
for line in lines: |
|
|
|
|
m = re.search(r'pc=b\'(\d+)\'.*op=([A-Z0-9]+)', line) |
|
|
|
|
|
|
|
|
|
m = re.search(r'pc=b\'(\d+)\'.*op=([A-Z0-9]+)', line) |
|
|
|
|
if m: |
|
|
|
|
pc = m.group(1) |
|
|
|
|
op = m.group(2) |
|
|
|
|
|
|
|
|
|
if m: |
|
|
|
|
pc = m.group(1) |
|
|
|
|
op = m.group(2) |
|
|
|
|
m = re.match(r'.*stack=(\[.*?\])', line) |
|
|
|
|
|
|
|
|
|
m = re.match(r'.*stack=(\[.*?\])', line) |
|
|
|
|
|
|
|
|
|
if (m): |
|
|
|
|
if (m): |
|
|
|
|
|
|
|
|
|
stackitems = re.findall(r'b\'(\d+)\'', m.group(1)) |
|
|
|
|
stackitems = re.findall(r'b\'(\d+)\'', m.group(1)) |
|
|
|
|
|
|
|
|
|
stack = "["; |
|
|
|
|
stack = "["; |
|
|
|
|
|
|
|
|
|
if (len(stackitems)): |
|
|
|
|
if (len(stackitems)): |
|
|
|
|
|
|
|
|
|
for i in range(0, len(stackitems) - 1): |
|
|
|
|
stack += hex(int(stackitems[i])) + ", " |
|
|
|
|
for i in range(0, len(stackitems) - 1): |
|
|
|
|
stack += hex(int(stackitems[i])) + ", " |
|
|
|
|
|
|
|
|
|
stack += hex(int(stackitems[-1])) |
|
|
|
|
stack += hex(int(stackitems[-1])) |
|
|
|
|
|
|
|
|
|
stack += "]" |
|
|
|
|
stack += "]" |
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
stack = "[]" |
|
|
|
|
else: |
|
|
|
|
stack = "[]" |
|
|
|
|
|
|
|
|
|
if (re.match(r'^PUSH.*', op)): |
|
|
|
|
val = re.search(r'pushvalue=(\d+)', line).group(1) |
|
|
|
|
pushvalue = hex(int(val)) |
|
|
|
|
trace.append({'pc': pc, 'op': op, 'stack': stack, 'pushvalue': pushvalue}) |
|
|
|
|
else: |
|
|
|
|
trace.append({'pc': pc, 'op': op, 'stack': stack}) |
|
|
|
|
if (re.match(r'^PUSH.*', op)): |
|
|
|
|
val = re.search(r'pushvalue=(\d+)', line).group(1) |
|
|
|
|
pushvalue = hex(int(val)) |
|
|
|
|
trace.append({'pc': pc, 'op': op, 'stack': stack, 'pushvalue': pushvalue}) |
|
|
|
|
else: |
|
|
|
|
trace.append({'pc': pc, 'op': op, 'stack': stack}) |
|
|
|
|
|
|
|
|
|
return trace |
|
|
|
|
return trace |
|
|
|
|