URI: 
       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