Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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