tw.txhistory,tx.base: use nonlocal in nested funcs
This commit is contained in:
parent
323331d258
commit
2935f24731
2 changed files with 35 additions and 33 deletions
|
|
@ -180,35 +180,38 @@ class BitcoinTwTransaction:
|
|||
|
||||
def vouts_disp(self,src,width,color):
|
||||
|
||||
class x: space_left = width or 0
|
||||
|
||||
def gen_output():
|
||||
|
||||
nonlocal space_left
|
||||
|
||||
for e in self.vouts_info[src]:
|
||||
mmid = e.twlabel.twmmid if e.twlabel else None
|
||||
bal_star,addr_w,co = ('*',16,'melon') if mmid in self.unspent_info else ('',15,'brown')
|
||||
if not mmid:
|
||||
if width and x.space_left < addr_w:
|
||||
if width and space_left < addr_w:
|
||||
break
|
||||
yield CoinAddr( self.proto, e.coin_addr ).fmt(width=addr_w,color=color)
|
||||
x.space_left -= addr_w
|
||||
space_left -= addr_w
|
||||
elif mmid.type == 'mmgen':
|
||||
mmid_disp = mmid + bal_star
|
||||
if width and x.space_left < len(mmid_disp):
|
||||
if width and space_left < len(mmid_disp):
|
||||
break
|
||||
yield TwMMGenID.hl2( TwMMGenID, s=mmid_disp, color=color, color_override=co )
|
||||
x.space_left -= len(mmid_disp)
|
||||
space_left -= len(mmid_disp)
|
||||
else:
|
||||
if width and x.space_left < addr_w:
|
||||
if width and space_left < addr_w:
|
||||
break
|
||||
yield TwMMGenID.hl2(
|
||||
TwMMGenID,
|
||||
s = CoinAddr.fmtc( mmid.split(':',1)[1] + bal_star, width=addr_w ),
|
||||
color = color,
|
||||
color_override = co )
|
||||
x.space_left -= addr_w
|
||||
x.space_left -= 1
|
||||
space_left -= addr_w
|
||||
space_left -= 1
|
||||
|
||||
return ' '.join(gen_output()) + ' ' * (x.space_left + 1 if width else 0)
|
||||
space_left = width or 0
|
||||
|
||||
return ' '.join(gen_output()) + ' ' * (space_left + 1 if width else 0)
|
||||
|
||||
def amt_disp(self,show_total_amt):
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -57,47 +57,46 @@ def DeserializeTX(proto,txhex):
|
|||
return proto.coin_amt(bytes2int(bytes_le) * proto.coin_amt.satoshi)
|
||||
|
||||
def bshift(n,skip=False,sub_null=False):
|
||||
ret = tx[var.idx:var.idx+n]
|
||||
var.idx += n
|
||||
nonlocal idx, raw_tx
|
||||
ret = tx[idx:idx+n]
|
||||
idx += n
|
||||
if sub_null:
|
||||
var.raw_tx += b'\x00'
|
||||
raw_tx += b'\x00'
|
||||
elif not skip:
|
||||
var.raw_tx += ret
|
||||
raw_tx += ret
|
||||
return ret
|
||||
|
||||
# https://bitcoin.org/en/developer-reference#compactsize-unsigned-integers
|
||||
# For example, the number 515 is encoded as 0xfd0302.
|
||||
def readVInt(skip=False):
|
||||
s = tx[var.idx]
|
||||
var.idx += 1
|
||||
nonlocal idx, raw_tx
|
||||
s = tx[idx]
|
||||
idx += 1
|
||||
if not skip:
|
||||
var.raw_tx.append(s)
|
||||
raw_tx.append(s)
|
||||
|
||||
vbytes_len = 1 if s < 0xfd else 2 if s == 0xfd else 4 if s == 0xfe else 8
|
||||
|
||||
if vbytes_len == 1:
|
||||
return s
|
||||
else:
|
||||
vbytes = tx[var.idx:var.idx+vbytes_len]
|
||||
var.idx += vbytes_len
|
||||
vbytes = tx[idx:idx+vbytes_len]
|
||||
idx += vbytes_len
|
||||
if not skip:
|
||||
var.raw_tx += vbytes
|
||||
raw_tx += vbytes
|
||||
return int(vbytes[::-1].hex(),16)
|
||||
|
||||
def make_txid(tx_bytes):
|
||||
from hashlib import sha256
|
||||
return sha256(sha256(tx_bytes).digest()).digest()[::-1].hex()
|
||||
|
||||
class vardata:
|
||||
idx = 0
|
||||
raw_tx = bytearray()
|
||||
|
||||
var = vardata()
|
||||
|
||||
tx = bytes.fromhex(txhex)
|
||||
raw_tx = bytearray()
|
||||
idx = 0
|
||||
|
||||
d = { 'version': bytes2int(bshift(4)) }
|
||||
|
||||
has_witness = tx[var.idx] == 0
|
||||
has_witness = tx[idx] == 0
|
||||
if has_witness:
|
||||
u = bshift(2,skip=True).hex()
|
||||
if u != '0001':
|
||||
|
|
@ -127,11 +126,11 @@ def DeserializeTX(proto,txhex):
|
|||
# A non-witness program (defined hereinafter) txin MUST be associated with an empty
|
||||
# witness field, represented by a 0x00.
|
||||
|
||||
d['txid'] = make_txid(tx[:4] + tx[6:var.idx] + tx[-4:])
|
||||
d['witness_size'] = len(tx) - var.idx + 2 - 4 # add len(marker+flag), subtract len(locktime)
|
||||
d['txid'] = make_txid(tx[:4] + tx[6:idx] + tx[-4:])
|
||||
d['witness_size'] = len(tx) - idx + 2 - 4 # add len(marker+flag), subtract len(locktime)
|
||||
|
||||
for txin in d['txins']:
|
||||
if tx[var.idx] == 0:
|
||||
if tx[idx] == 0:
|
||||
bshift(1,skip=True)
|
||||
continue
|
||||
txin['witness'] = [
|
||||
|
|
@ -140,11 +139,11 @@ def DeserializeTX(proto,txhex):
|
|||
d['txid'] = make_txid(tx)
|
||||
d['witness_size'] = 0
|
||||
|
||||
if len(tx) - var.idx != 4:
|
||||
die( 'TxHexParseError', 'TX hex has invalid length: {} extra bytes'.format(len(tx)-var.idx-4) )
|
||||
if len(tx) - idx != 4:
|
||||
die( 'TxHexParseError', 'TX hex has invalid length: {} extra bytes'.format(len(tx)-idx-4) )
|
||||
|
||||
d['locktime'] = bytes2int(bshift(4))
|
||||
d['unsigned_hex'] = var.raw_tx.hex()
|
||||
d['unsigned_hex'] = raw_tx.hex()
|
||||
|
||||
return namedtuple('deserialized_tx',list(d.keys()))(**d)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue