handle coinbase transactions explicitly
authorThomasV <thomasv@gitorious>
Sat, 19 Apr 2014 08:32:23 +0000 (10:32 +0200)
committerThomasV <thomasv@gitorious>
Sat, 19 Apr 2014 08:32:23 +0000 (10:32 +0200)
gui/qt/transaction_dialog.py
lib/transaction.py

index c4f498b..eb5d3c8 100644 (file)
@@ -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))
index 150c5d8..f0035db 100644 (file)
@@ -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 ]
@@ -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
 
 
@@ -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