tparse_scriptSig - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 52e74ccda12eb21397770e58631f294a8a3339c2 DIR parent c07c1c58ed1f753f02a55039f3ef65157d680964 HTML Author: ThomasV <thomasv@gitorious> Date: Tue, 17 Jun 2014 13:48:58 +0200 parse_scriptSig Diffstat: M lib/transaction.py | 53 +++++++++++++++---------------- 1 file changed, 25 insertions(+), 28 deletions(-) --- DIR diff --git a/lib/transaction.py b/lib/transaction.py t@@ -295,18 +295,18 @@ def match_decoded(decoded, to_match): return False return True -def get_address_from_input_script(bytes): +def parse_scriptSig(d, bytes): try: decoded = [ x for x in script_GetOp(bytes) ] except Exception: # coinbase transactions raise an exception print_error("cannot find address in input script", bytes.encode('hex')) - return [], {}, "(None)" + return # payto_pubkey match = [ opcodes.OP_PUSHDATA4 ] if match_decoded(decoded, match): - return None, {}, "(pubkey)" + return # non-generated TxIn transactions push a signature # (seventy-something bytes) and then their public key t@@ -317,11 +317,13 @@ def get_address_from_input_script(bytes): pubkey = decoded[1][1].encode('hex') if sig[-2:] == '01': sig = sig[:-2] - return [pubkey], {pubkey:sig}, public_key_to_bc_address(pubkey.decode('hex')) + d['pubkeys'] = [pubkey] + d['signatures'] = {pubkey:sig} + d['address'] = public_key_to_bc_address(pubkey.decode('hex')) + return else: print_error("cannot find address in input script", bytes.encode('hex')) - return [], {}, "(None)" - + return # p2sh transaction, 2 of n match = [ opcodes.OP_0 ] t@@ -329,27 +331,25 @@ def get_address_from_input_script(bytes): match.append(opcodes.OP_PUSHDATA4) if match_decoded(decoded, match): - redeemScript = decoded[-1][1] num = len(match) - 2 - signatures = map(lambda x:x[1][:-1].encode('hex'), decoded[1:-1]) - + d['signatures'] = map(lambda x:x[1][:-1].encode('hex'), decoded[1:-1]) + d['address'] = hash_160_to_bc_address(hash_160(redeemScript), 5) + d['redeemScript'] = redeemScript.encode('hex') dec2 = [ x for x in script_GetOp(redeemScript) ] - - # 2 of 2 - match2 = [ opcodes.OP_2, opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4, opcodes.OP_2, opcodes.OP_CHECKMULTISIG ] - if match_decoded(dec2, match2): + match_2of2 = [ opcodes.OP_2, opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4, opcodes.OP_2, opcodes.OP_CHECKMULTISIG ] + match_2of3 = [ opcodes.OP_2, opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4, opcodes.OP_3, opcodes.OP_CHECKMULTISIG ] + if match_decoded(dec2, match_2of2): pubkeys = [ dec2[1][1].encode('hex'), dec2[2][1].encode('hex') ] - return pubkeys, signatures, hash_160_to_bc_address(hash_160(redeemScript), 5) - - # 2 of 3 - match2 = [ opcodes.OP_2, opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4, opcodes.OP_3, opcodes.OP_CHECKMULTISIG ] - if match_decoded(dec2, match2): + elif match_decoded(dec2, match_2of3): pubkeys = [ dec2[1][1].encode('hex'), dec2[2][1].encode('hex'), dec2[3][1].encode('hex') ] - return pubkeys, signatures, hash_160_to_bc_address(hash_160(redeemScript), 5) + else: + return + d['pubkeys'] = pubkeys + return print_error("cannot find address in input script", bytes.encode('hex')) - return [], {}, "(None)" + t@@ -626,15 +626,12 @@ class Transaction: d['prevout_hash'] = prevout_hash d['prevout_n'] = prevout_n d['sequence'] = sequence + + d['pubkeys'] = [] + d['signatures'] = {} + d['address'] = None if scriptSig: - pubkeys, signatures, address = get_address_from_input_script(scriptSig) - else: - pubkeys = [] - signatures = {} - address = None - d['address'] = address - d['pubkeys'] = pubkeys - d['signatures'] = signatures + parse_scriptSig(d, scriptSig) return d