URI: 
       thandle coinbase transactions explicitly - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 86917c2ff3d512c149500f1acc6c3e84f5ba8bf8
   DIR parent ace15d3e7eb1725b2048e162ea2d2890d578a9a4
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Sat, 19 Apr 2014 10:32:23 +0200
       
       handle coinbase transactions explicitly
       
       Diffstat:
         M gui/qt/transaction_dialog.py        |       7 +++++--
         M lib/transaction.py                  |      57 +++++++++++++++++--------------
       
       2 files changed, 36 insertions(+), 28 deletions(-)
       ---
   DIR diff --git a/gui/qt/transaction_dialog.py b/gui/qt/transaction_dialog.py
       t@@ -192,8 +192,11 @@ class TxDialog(QDialog):
        
                vbox.addWidget(QLabel(_("Inputs")))
                def format_input(x):
       -            _hash = x.get('prevout_hash')
       -            return _hash[0:16] + '...' + _hash[-8:] + ":%d"%x.get('prevout_n') + u'\t' + "%s"%x.get('address')
       +            if x.get('is_coinbase'):
       +                return 'coinbase'
       +            else:
       +                _hash = x.get('prevout_hash')
       +                return _hash[0:16] + '...' + _hash[-8:] + ":%d"%x.get('prevout_n') + u'\t' + "%s"%x.get('address')
                lines = map(format_input, self.tx.inputs )
                i_text = QTextEdit()
                i_text.setText('\n'.join(lines))
   DIR diff --git a/lib/transaction.py b/lib/transaction.py
       t@@ -314,10 +314,14 @@ def get_address_from_input_script(bytes):
            match = [ opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4 ]
            if match_decoded(decoded, match):
                sig = decoded[0][1].encode('hex')
       -        assert sig[-2:] == '01'
       -        sig = sig[:-2]
                pubkey = decoded[1][1].encode('hex')
       -        return [pubkey], {pubkey:sig}, public_key_to_bc_address(pubkey.decode('hex'))
       +        if sig[-2:] == '01':
       +            sig = sig[:-2]
       +            return [pubkey], {pubkey:sig}, public_key_to_bc_address(pubkey.decode('hex'))
       +        else:
       +            print_error("cannot find address in input script", bytes.encode('hex'))
       +            return [], {}, "(None)"
       +
        
            # p2sh transaction, 2 of n
            match = [ opcodes.OP_0 ]
       t@@ -580,21 +584,27 @@ class Transaction:
        
            def parse_input(self, vds):
                d = {}
       -        d['prevout_hash'] = hash_encode(vds.read_bytes(32))
       -        d['prevout_n'] = vds.read_uint32()
       +        prevout_hash = hash_encode(vds.read_bytes(32))
       +        prevout_n = vds.read_uint32()
                scriptSig = vds.read_bytes(vds.read_compact_size())
       -        d['sequence'] = vds.read_uint32()
       +        sequence = vds.read_uint32()
        
       -        if scriptSig:
       -            pubkeys, signatures, address = get_address_from_input_script(scriptSig)
       +        if prevout_hash == '00'*32:
       +            d['is_coinbase'] = True
                else:
       -            pubkeys = []
       -            signatures = {}
       -            address = None
       -
       -        d['address'] = address
       -        d['pubkeys'] = pubkeys
       -        d['signatures'] = signatures
       +            d['is_coinbase'] = False
       +            d['prevout_hash'] = prevout_hash
       +            d['prevout_n'] = prevout_n
       +            d['sequence'] = sequence
       +            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
                return d
        
        
       t@@ -688,19 +698,14 @@ class Transaction:
        
        
            def get_input_info(self):
       +        keys = ['prevout_hash', 'prevout_n', 'address', 'KeyID', 'scriptPubKey', 'redeemScript', 'redeemPubkey', 'pubkeys', 'signatures', 'is_coinbase']
                info = []
                for i in self.inputs:
       -            item = { 
       -                'prevout_hash':i['prevout_hash'], 
       -                'prevout_n':i['prevout_n'],
       -                'address':i.get('address'),
       -                'KeyID':i.get('KeyID'),
       -                'scriptPubKey':i.get('scriptPubKey'),
       -                'redeemScript':i.get('redeemScript'),
       -                'redeemPubkey':i.get('redeemPubkey'),
       -                'pubkeys':i.get('pubkeys'),
       -                'signatures':i.get('signatures',{}),
       -                }
       +            item = {}
       +            for k in keys:
       +                v = i.get(k)
       +                if v is not None:
       +                    item[k] = v
                    info.append(item)
                return info