Browse Source

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

The MMGen Project 2 years ago
parent
commit
2935f24731
2 changed files with 35 additions and 33 deletions
  1. 13 10
      mmgen/proto/btc/tw/txhistory.py
  2. 22 23
      mmgen/proto/btc/tx/base.py

+ 13 - 10
mmgen/proto/btc/tw/txhistory.py

@@ -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
+
+		space_left = width or 0
 
-		return ' '.join(gen_output()) + ' ' * (x.space_left + 1 if width else 0)
+		return ' '.join(gen_output()) + ' ' * (space_left + 1 if width else 0)
 
 	def amt_disp(self,show_total_amt):
 		return (

+ 22 - 23
mmgen/proto/btc/tx/base.py

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