commit 86917c2ff3d512c149500f1acc6c3e84f5ba8bf8
parent ace15d3e7eb1725b2048e162ea2d2890d578a9a4
Author: ThomasV <thomasv@gitorious>
Date: Sat, 19 Apr 2014 10:32:23 +0200
handle coinbase transactions explicitly
Diffstat:
2 files changed, 36 insertions(+), 28 deletions(-)
diff --git a/gui/qt/transaction_dialog.py b/gui/qt/transaction_dialog.py
@@ -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))
diff --git a/lib/transaction.py b/lib/transaction.py
@@ -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