handle coinbase transactions explicitly
This commit is contained in:
parent
ace15d3e7e
commit
86917c2ff3
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue