def disassemble_scripts(input_script, output_script, lock_time, signature_for_hash_type_f): "yield pre_annotations, pc, opcode, instruction, post_annotations" input_annotations_f, output_annotations_f = annotation_f_for_scripts( input_script, output_script, signature_for_hash_type_f) pc = 0 while pc < len(input_script): opcode, data, new_pc = get_opcode(input_script, pc) pre_annotations, post_annotations = input_annotations_f(pc, opcode, data) yield pre_annotations, pc, opcode, instruction_for_opcode(opcode, data), post_annotations pc = new_pc pc = 0 while pc < len(output_script): opcode, data, new_pc = get_opcode(output_script, pc) pre_annotations, post_annotations = output_annotations_f(pc, opcode, data) yield pre_annotations, pc, opcode, instruction_for_opcode(opcode, data), post_annotations pc = new_pc if not is_pay_to_script_hash(output_script): return stack = [] eval_script(input_script, signature_for_hash_type_f, lock_time, expected_hash_type=None, stack=stack) if stack: signatures, new_output_script = stack[:-1], stack[-1] new_input_script = bin_script(signatures) else: signatures, new_output_script, new_input_script = [], b'', b'' for r in disassemble_scripts(new_input_script, new_output_script, lock_time, signature_for_hash_type_f): yield r
def annotation_f_for_scripts(input_script, output_script, signature_for_hash_type_f): is_p2sh = is_pay_to_script_hash(output_script) in_ap = b'\0' out_ap = b'\0' if is_p2sh: out_ap = b'\5' def input_annotations_f(pc, opcode, data): a0, a1 = [], [] if pc == 0: a0.append("--- SIGNATURE SCRIPT START") ld = len(data) if data is not None else 0 if ld in (71, 72) and not is_p2sh: add_signature_annotations(a1, data, signature_for_hash_type_f, output_script) if ld == 20: add_address_annotations(a1, data, address_prefix=in_ap) if ld in (33, 65): add_sec_annotations(a1, data, address_prefix=in_ap) return a0, a1 def output_annotations_f(pc, opcode, data): a0, a1 = [], [] if pc == 0: a0.append("--- PUBLIC KEY SCRIPT START") ld = len(data) if data is not None else 0 if ld == 20: add_address_annotations(a1, data, address_prefix=out_ap) if ld in (33, 65): add_sec_annotations(a1, data, address_prefix=out_ap) return a0, a1 return input_annotations_f, output_annotations_f
def annotation_f_for_scripts(input_script, output_script, signature_for_hash_type_f): is_p2sh = is_pay_to_script_hash(output_script) in_ap = b'\0' out_ap = b'\0' if is_p2sh: out_ap = b'\5' iaf = _make_input_annotations_f(input_script, output_script, signature_for_hash_type_f, in_ap, is_p2sh) oaf = _make_output_annotations_f(input_script, output_script, signature_for_hash_type_f, out_ap) return iaf, oaf