tw.txhistory,tx.base: use nonlocal in nested funcs

This commit is contained in:
The MMGen Project 2023-01-29 16:04:47 +00:00
commit 2935f24731
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
2 changed files with 35 additions and 33 deletions

View file

@ -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 (

View file

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