handle coinbase transactions explicitly

This commit is contained in:
ThomasV 2014-04-19 10:32:23 +02:00
parent ace15d3e7e
commit 86917c2ff3
2 changed files with 36 additions and 28 deletions

View 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))

View 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