Browse Source

Implement _b58tonum() as generator func; utf8 label test, bugfixes

MMGen 7 years ago
parent
commit
00079ae156
3 changed files with 24 additions and 24 deletions
  1. 8 10
      mmgen/protocol.py
  2. 1 1
      mmgen/tx.py
  3. 15 13
      test/test.py

+ 8 - 10
mmgen/protocol.py

@@ -42,16 +42,14 @@ def hash256(hexnum): # take hex, return hex - OP_HASH256
 _b58a='123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
 
 def _numtob58(num):
-	ret = []
-	while num:
-		ret.append(_b58a[num % 58])
-		num /= 58
-	return ''.join(ret)[::-1]
-
-def _b58tonum(b58num):
-	if [i for i in b58num if not i in _b58a]:
-		raise ValueError,'_b58tonum(): invalid b58 value'
-	return sum(_b58a.index(n) * (58**i) for i,n in enumerate(list(b58num[::-1])))
+	def b58enc(n):
+		while n:
+			yield _b58a[n % 58]
+			n /= 58
+	return ''.join(b58enc(num))[::-1]
+
+def _b58tonum(b58str):
+	return sum(_b58a.index(ch) * 58**n for n,ch in enumerate(b58str[::-1]))
 
 def _b58chk_encode(hexstr):
 	return _numtob58(int(hexstr+hash256(hexstr)[:8],16))

+ 1 - 1
mmgen/tx.py

@@ -722,7 +722,7 @@ class MMGenTX(MMGenObject):
 				assert type(ti['witness']) == list and len(ti['witness']) == 2, 'malformed witness'
 				assert len(ti['witness'][1]) == 66, 'incorrect witness pubkey length'
 				assert mmti.mmid, fs.format('witness-type','non-MMGen')
-				assert mmti.mmid.mmtype in ('S','B'), fs.format('witness-type',mmti.mmid.mmtype)
+				assert mmti.mmid.mmtype == ('S','B')[ti['scriptSig']==''],fs.format('witness-type',mmti.mmid.mmtype)
 			else: # non-witness
 				if mmti.mmid:
 					assert mmti.mmid.mmtype not in ('S','B'), fs.format('signature in',mmti.mmid.mmtype)

+ 15 - 13
test/test.py

@@ -738,6 +738,7 @@ cmd_group['regtest'] = (
 	('regtest_fund_bob',           "funding Bob's wallet"),
 	('regtest_fund_alice',         "funding Alice's wallet"),
 	('regtest_bob_bal1',           "Bob's balance"),
+	('regtest_bob_add_label',      "adding a 40-character UTF-8 encoded label"),
 	('regtest_bob_split1',         "splitting Bob's funds"),
 	('regtest_generate',           'mining a block'),
 	('regtest_bob_bal2',           "Bob's balance"),
@@ -2480,7 +2481,8 @@ class MMGenTestSuite(object):
 							pw='abc',
 							no_send=False,
 							do_label=False,
-							bad_locktime=False):
+							bad_locktime=False,
+							full_tx_view=False):
 		os.environ['MMGEN_BOGUS_SEND'] = ''
 		t = MMGenExpect(name,'mmgen-txdo',
 			['-d',cfg['tmpdir'],'-B','--'+user] +
@@ -2495,14 +2497,10 @@ class MMGenTestSuite(object):
 			t.expect('Enter transaction fee: ','{}\n'.format(tx_fee))
 		t.expect('OK? (Y/n): ','y') # fee OK?
 		t.expect('OK? (Y/n): ','y') # change OK?
-		if do_label:
-			t.expect('Add a comment to transaction? (y/N): ','y')
-			t.expect('Comment: ',ref_tx_label.encode('utf8')+'\n')
-			t.expect('View decoded transaction\? .*?: ','n',regex=True)
-		else:
-			t.expect('Add a comment to transaction? (y/N): ','\n')
-			t.expect('View decoded transaction\? .*?: ','t',regex=True)
-			t.expect('to continue: ','\n')
+		t.expect('Add a comment to transaction? (y/N): ',('\n','y')[do_label])
+		if do_label: t.expect('Comment: ',ref_tx_label.encode('utf8')+'\n')
+		t.expect('View decoded transaction\? .*?: ',('t','v')[full_tx_view],regex=True)
+		if not do_label: t.expect('to continue: ','\n')
 		t.passphrase('MMGen wallet',pw)
 		t.written_to_file('Signed transaction')
 		if no_send:
@@ -2517,7 +2515,7 @@ class MMGenTestSuite(object):
 	def regtest_bob_split1(self,name):
 		sid = self.regtest_user_sid('bob')
 		outputs_cl = [sid+':C:1,100', sid+':L:2,200',sid+':'+rtBobOp3]
-		return self.regtest_user_txdo(name,'bob',rtFee[0],outputs_cl,'1',do_label=True)
+		return self.regtest_user_txdo(name,'bob',rtFee[0],outputs_cl,'1',do_label=True,full_tx_view=True)
 
 	def get_addr_from_regtest_addrlist(self,user,sid,mmtype,idx,addr_range='1-5'):
 		id_str = { 'L':'', 'S':'-S', 'C':'-C' }[mmtype]
@@ -2663,6 +2661,13 @@ class MMGenTestSuite(object):
 		t.expect('Removed label.*in tracking wallet',regex=True)
 		t.ok()
 
+	utf8_label     =  u'Edited label (40 characters, UTF8) α-β-γ'
+	utf8_label_pat = ur'Edited label \(40 characters, UTF8\) ..-..-..'
+
+	def regtest_bob_add_label(self,name):
+		sid = self.regtest_user_sid('bob')
+		return self.regtest_user_add_label(name,'bob',sid+':C:1',self.utf8_label)
+
 	def regtest_alice_add_label1(self,name):
 		sid = self.regtest_user_sid('alice')
 		return self.regtest_user_add_label(name,'alice',sid+':C:1','Original Label')
@@ -2726,9 +2731,6 @@ class MMGenTestSuite(object):
 		sid = self.regtest_user_sid('alice')
 		return self.regtest_user_chk_label(name,'alice',sid+':C:1','Replacement Label')
 
-	utf8_label     =  u'Edited label (40 characters, UTF8) α-β-γ'
-	utf8_label_pat = ur'Edited label \(40 characters, UTF8\) ..-..-..'
-
 	def regtest_alice_edit_label1(self,name):
 		return self.regtest_user_edit_label(name,'alice','1',self.utf8_label)