import sys from graphviz import Digraph import src.tac_efg as tac_efg import src.exporter as exporter def block_k_depth(block): return f"{block.evm_ops[0].call_depth}" def block_k(block): dividing_line = "⋮" variable = "" if block.evm_ops[-1].value is None else block.evm_ops[-1].value # return f"{block.evm_ops[0].call_depth}-{block.entry}({block.evm_ops[0].opcode.name})->{block.exit}({block.evm_ops[-1].opcode.name})" return f"{block.evm_ops[0].call_depth}\n{block.entry};{block.evm_ops[0].opcode.name}; {block.evm_ops[0].value}\n{dividing_line}\n{block.exit}; {block.evm_ops[-1].opcode.name}; {variable}" def draw_cfg(efg): dot = Digraph(comment='CFG') dot.format = "svg" for block in efg.blocks: dot.node(block_k(block), block_k(block), shape='box') for edge in efg.edge_list(): dot.edge(block_k(edge[0]), block_k(edge[1])) dot.render('cfg') def draw_depth_cfg(efg): dot = Digraph(comment='depth-CFG') dot.format = "svg" for block in efg.blocks: dot.node(block_k_depth(block), block_k_depth(block), shape='box') for edge in efg.edge_list(): dot.edge(block_k_depth(edge[0]), block_k_depth(edge[1])) dot.render('depth-cfg') if __name__ == '__main__': with open(sys.argv[1], "r") as f: efg = tac_efg.TACGraph.from_opcode(f) print(efg) exporter.EFGDotExporter(efg).export(out_filename="suicidal_ganache.html") # draw_cfg(efg) # draw_depth_cfg(efg)