Browse Source

Version 0.8.8
Documentation updated
[mswin]: colons removed from filenames in test/ref
[mswin]: commas allowed in hidden incog filename parameter

philemon 8 years ago
parent
commit
e5a7b51b4f

+ 1 - 1
doc/wiki/install-linux/Install-MMGen-on-Debian-or-Ubuntu-Linux.md

@@ -2,7 +2,7 @@
 
 
 Install required Debian/Ubuntu packages:
 Install required Debian/Ubuntu packages:
 
 
-		$ sudo apt-get install python-pip python-dev python-pexpect python-ecdsa python-scrypt libssl-dev git autoconf libtool
+		$ sudo apt-get install python-pip python-dev python-pexpect python-ecdsa python-scrypt libssl-dev git autoconf libtool wipe
 
 
 Install the Python Cryptography Toolkit:
 Install the Python Cryptography Toolkit:
 
 

+ 46 - 20
doc/wiki/using-mmgen/Getting-Started-with-MMGen.md

@@ -24,20 +24,42 @@ format conversion, address and key generation, and address import operations can
 be performed on either an online or offline computer with an empty blockchain
 be performed on either an online or offline computer with an empty blockchain
 and no Bitcoin balance.
 and no Bitcoin balance.
 
 
+*NOTE: Beginning with v0.8.7a, MMGen supports testnet, allowing you to perform
+the entire set of MMGen operations without risking real funds (free testnet
+coins may be obtained at [https://tpfaucet.appspot.com/][2]). To use this
+feature, start bitcoind with the -testnet option and sync the testnet blockchain
+(about 9GB at this time of writing).  To make MMGen use testnet instead of
+mainnet, supply the `--testnet=1` option as the first argument to all MMGen
+commands you run.  To save typing, the option may also be set in the MMGen
+configuration file.*
+
 Note that all the filenames, seed IDs, Bitcoin addresses and so forth used in
 Note that all the filenames, seed IDs, Bitcoin addresses and so forth used in
-this primer are fake.  Substitute real ones in their place as you go.  The up
-arrow (for repeating commands) and tab key (or Ctrl-I) (for completing commands
-and filenames) will speed up your work at the command line greatly.
+this primer are fake and for purposes of illustration only.  The up arrow (for
+repeating commands) and tab key (or Ctrl-I) (for completing commands and
+filenames) will speed up your work at the command line greatly.
 
 
 ### <a name=01>Basic Operations</a>
 ### <a name=01>Basic Operations</a>
 
 
 #### <a name=02>Generate a wallet (offline computer):</a>
 #### <a name=02>Generate a wallet (offline computer):</a>
 
 
+*NOTE: Beginning with v0.8.8, MMGen supports a “default wallet” feature.  After
+creating your wallet, MMGen will prompt you to make it your default.  If you
+answer 'y', the wallet will be stored in your MMGen data directory and used for
+all future commands that require a wallet or other seed source.*
+
+*If you don't want your MMGen wallet stored in your MMGen data directory, then
+you may not to want to use this feature.  Otherwise, it's recommended, as it
+saves you from having to type your wallet on the command line.*
+
+*The following examples suppose that you've chosen to use a default wallet.
+Bear in mind that if you hadn't, the wallet would need to be specified as an
+argument to all commands where it's relevant.*
+
 On your offline computer, generate a wallet:
 On your offline computer, generate a wallet:
 
 
 		$ mmgen-walletgen
 		$ mmgen-walletgen
 		...
 		...
-		MMGen wallet written to file '89ABCDEF-76543210[256,3].mmdat'
+		MMGen wallet written to file '/home/username/.mmgen/89ABCDEF-76543210[256,3].mmdat'
 
 
 ‘89ABCDEF’ is the Seed ID; ‘76543210’ is the Key ID. These are randomly
 ‘89ABCDEF’ is the Seed ID; ‘76543210’ is the Key ID. These are randomly
 generated, so your IDs will of course be different than these.
 generated, so your IDs will of course be different than these.
@@ -65,7 +87,7 @@ written out by hand or memorized.
 
 
 Now generate ten addresses with your just-created wallet:
 Now generate ten addresses with your just-created wallet:
 
 
-		$ mmgen-addrgen 89ABCDEF-76543210[256,3].mmdat 1-10
+		$ mmgen-addrgen 1-10
 		...
 		...
 		Addresses written to file '89ABCDEF[1-10].addrs'
 		Addresses written to file '89ABCDEF[1-10].addrs'
 
 
@@ -152,15 +174,16 @@ also).
 		...
 		...
 		TOTAL: 0 BTC
 		TOTAL: 0 BTC
 
 
-Note that it’s also possible to [track ordinary Bitcoin addresses with your
-tracking wallet][1].  This is not recommended, however, as you must save their
-corresponding keys in a key list in order to spend them.  Avoiding the use of
-keys is precisely the reason MMGen was created!
+*While not covered in this introduction, note that it’s also possible to [import
+ordinary Bitcoin addresses into your tracking wallet][1].  This allows you to
+move funds from another wallet directly to MMGen without having to go through
+the network.  To use it, you must save the keys corresponding to the addresses
+where the funds are stored in a separate file for use during signing.*
 
 
 Now that your addresses are being tracked, you may go ahead and send some BTC to
 Now that your addresses are being tracked, you may go ahead and send some BTC to
-them.  If you send 0.1, 0.2, 0.3 and 0.4 BTC respectively, for example, your
-address listing will look something like this after the transactions have been
-confirmed:
+them over the Bitcoin network.  If you send 0.1, 0.2, 0.3 and 0.4 BTC
+respectively, for example, your address listing will look something like this
+after the transactions have been confirmed:
 
 
 		$ mmgen-tool listaddresses
 		$ mmgen-tool listaddresses
 		MMGenID     COMMENT    BALANCE
 		MMGenID     COMMENT    BALANCE
@@ -175,7 +198,9 @@ confirmed:
 Now that you have some BTC under MMGen’s control, you’re ready to create a
 Now that you have some BTC under MMGen’s control, you’re ready to create a
 transaction.  Note that transactions are harmless until they’re signed and
 transaction.  Note that transactions are harmless until they’re signed and
 broadcast to the network, so feel free to experiment and create transactions
 broadcast to the network, so feel free to experiment and create transactions
-with different combinations of inputs and outputs.
+with different combinations of inputs and outputs.  If you're using testnet,
+then even broadcast transactions are harmless, so it's highly recommended you
+do so if you want to practice sending transactions.
 
 
 To send 0.1 BTC to the a third-party address 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,
 To send 0.1 BTC to the a third-party address 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,
 for example, and send the change back to yourself at address 89ABCDEF:5, you’d
 for example, and send the change back to yourself at address 89ABCDEF:5, you’d
@@ -240,13 +265,13 @@ and change addresses.  This feature will be appreciated by privacy-conscious use
 #### <a name=06>Sign a transaction (offline computer):</a>
 #### <a name=06>Sign a transaction (offline computer):</a>
 
 
 Now transfer the the raw transaction file to your offline computer and sign it
 Now transfer the the raw transaction file to your offline computer and sign it
-using your wallet:
+using your default wallet:
 
 
-		$ mmgen-txsign FEDCBA[0.1].rawtx 89ABCDEF-76543210[256,3].mmdat
+		$ mmgen-txsign FEDCBA[0.1].rawtx
 		...
 		...
 		Signed transaction written to file 'FEDCBA[0.1].sigtx'
 		Signed transaction written to file 'FEDCBA[0.1].sigtx'
 
 
-Note that the signed transaction file bears the extension '.sigtx'.
+Note that the signed transaction file has a new extension, '.sigtx'.
 
 
 #### <a name=07>Send a transaction (online computer):</a>
 #### <a name=07>Send a transaction (online computer):</a>
 
 
@@ -284,9 +309,9 @@ by invoking the desired command with the `-h` or `--help` switch.
 
 
 #### <a name=11>Using the mnemonic and seed features:</a>
 #### <a name=11>Using the mnemonic and seed features:</a>
 
 
-Continuing our example above, generate a mnemonic from the wallet:
+Continuing our example above, generate a mnemonic from the default wallet:
 
 
-		$ mmgen-walletconv -o words '89ABCDEF-76543210[256,3].mmdat'
+		$ mmgen-walletconv -o words
 		...
 		...
 		Mnemonic data written to file '89ABCDEF.mmwords'
 		Mnemonic data written to file '89ABCDEF.mmwords'
 
 
@@ -329,7 +354,7 @@ Seed ID.
 Seed files bear the extension '.mmseed' and are generated and used exactly
 Seed files bear the extension '.mmseed' and are generated and used exactly
 the same way as mnemonic files:
 the same way as mnemonic files:
 
 
-		$ mmgen-walletconv -o seed '89ABCDEF-76543210[256,3].mmdat'
+		$ mmgen-walletconv -o seed
 		...
 		...
 		Seed data written to file '89ABCDEF.mmseed'
 		Seed data written to file '89ABCDEF.mmseed'
 
 
@@ -477,7 +502,7 @@ create a 1GB file 'random.dat' and hide a wallet in it at offset 123456789:
 		Data written to file 'random.dat' at offset 123456789
 		Data written to file 'random.dat' at offset 123456789
 
 
 Your ‘random’ file can now be uploaded to a cloud storage service, for example,
 Your ‘random’ file can now be uploaded to a cloud storage service, for example,
-or some other, preferably non-public, location on the Net (in a real-life
+or some other location on the Net, preferably non-public one (in a real-life
 situation you will choose a less obvious offset than '123456789' though, won’t
 situation you will choose a less obvious offset than '123456789' though, won’t
 you?).
 you?).
 
 
@@ -506,3 +531,4 @@ Transaction signing uses the same syntax:
 		Signed transaction written to file 'ABCDEF[0.1].sigtx'
 		Signed transaction written to file 'ABCDEF[0.1].sigtx'
 
 
 [1]: https://github.com/mmgen/mmgen/wiki/Tracking-and-spending-ordinary-Bitcoin-addresses
 [1]: https://github.com/mmgen/mmgen/wiki/Tracking-and-spending-ordinary-Bitcoin-addresses
+[2]: https://tpfaucet.appspot.com

+ 1 - 1
mmgen/globalvars.py

@@ -36,7 +36,7 @@ class g(object):
 		sys.exit(ev)
 		sys.exit(ev)
 	# Variables - these might be altered at runtime:
 	# Variables - these might be altered at runtime:
 
 
-	version      = '0.8.8rc1'
+	version      = '0.8.8'
 	release_date = 'November 2016'
 	release_date = 'November 2016'
 
 
 	proj_name = 'MMGen'
 	proj_name = 'MMGen'

+ 7 - 6
mmgen/opts.py

@@ -320,20 +320,21 @@ def check_opts(usr_opts):       # Returns false if any check fails
 					die(1,'Output to brainwallet format unsupported')
 					die(1,'Output to brainwallet format unsupported')
 		elif key in ('hidden_incog_input_params','hidden_incog_output_params'):
 		elif key in ('hidden_incog_input_params','hidden_incog_output_params'):
 			a = val.split(',')
 			a = val.split(',')
-			if len(a) != 2:
+			if len(a) < 2:
 				opt_display(key,val)
 				opt_display(key,val)
 				msg('Option requires two comma-separated arguments')
 				msg('Option requires two comma-separated arguments')
 				return False
 				return False
-			if not opt_is_int(a[1],desc): return False
+			fn,ofs = ','.join(a[:-1]),a[-1] # permit comma in filename
+			if not opt_is_int(ofs,desc): return False
 			if key == 'hidden_incog_input_params':
 			if key == 'hidden_incog_input_params':
-				check_infile(a[0],blkdev_ok=True)
+				check_infile(fn,blkdev_ok=True)
 				key2 = 'in_fmt'
 				key2 = 'in_fmt'
 			else:
 			else:
-				try: os.stat(a[0])
+				try: os.stat(fn)
 				except:
 				except:
-					b = os.path.dirname(a[0])
+					b = os.path.dirname(fn)
 					if b: check_outdir(b)
 					if b: check_outdir(b)
-				else: check_outfile(a[0],blkdev_ok=True)
+				else: check_outfile(fn,blkdev_ok=True)
 				key2 = 'out_fmt'
 				key2 = 'out_fmt'
 			if hasattr(opt,key2):
 			if hasattr(opt,key2):
 				val2 = getattr(opt,key2)
 				val2 = getattr(opt,key2)

+ 4 - 4
mmgen/seed.py

@@ -84,7 +84,8 @@ class SeedSource(MMGenObject):
 			if fn:
 			if fn:
 				f = Filename(fn)
 				f = Filename(fn)
 			else:
 			else:
-				fn = opt.hidden_incog_input_params.split(',')[0]
+				# permit comma in filename
+				fn = ','.join(opt.hidden_incog_input_params.split(',')[:-1])
 				f = Filename(fn,ftype=IncogWalletHidden)
 				f = Filename(fn,ftype=IncogWalletHidden)
 			if opt.in_fmt and not ignore_in_fmt:
 			if opt.in_fmt and not ignore_in_fmt:
 				die_on_opt_mismatch(opt.in_fmt,f.ftype)
 				die_on_opt_mismatch(opt.in_fmt,f.ftype)
@@ -924,9 +925,8 @@ harder to find, you're advised to choose a much larger file size than this.
 	}
 	}
 
 
 	def _get_hincog_params(self,wtype):
 	def _get_hincog_params(self,wtype):
-		p = getattr(opt,'hidden_incog_'+ wtype +'_params')
-		a,b = p.split(',')
-		return a,int(b)
+		a = getattr(opt,'hidden_incog_'+ wtype +'_params').split(',')
+		return ','.join(a[:-1]),int(a[-1]) # permit comma in filename
 
 
 	def _check_valid_offset(self,fn,action):
 	def _check_valid_offset(self,fn,action):
 		d = self.ssdata
 		d = self.ssdata

+ 0 - 0
test/ref/1378FC64-B55E9958-77256FC1[192:1].incog.offset123 → test/ref/1378FC64-B55E9958-77256FC1[192,1].incog.offset123


+ 0 - 0
test/ref/1378FC64-B55E9958-D85FF20C[192:1].incog-old.offset123 → test/ref/1378FC64-B55E9958-D85FF20C[192,1].incog-old.offset123


+ 0 - 0
test/ref/98831F3A-F59B07A0-559CEF19[256:1].incog.offset123 → test/ref/98831F3A-F59B07A0-559CEF19[256,1].incog.offset123


+ 0 - 0
test/ref/98831F3A-F59B07A0-848535F3[256:1].incog-old.offset123 → test/ref/98831F3A-F59B07A0-848535F3[256,1].incog-old.offset123


+ 0 - 0
test/ref/FE3C6545-161E495F-9860A85B[128:1].incog-old.offset123 → test/ref/FE3C6545-161E495F-9860A85B[128,1].incog-old.offset123


+ 0 - 0
test/ref/FE3C6545-161E495F-BEB7548E[128:1].incog-offset123 → test/ref/FE3C6545-161E495F-BEB7548E[128,1].incog-offset123


+ 9 - 10
test/test.py

@@ -273,8 +273,8 @@ cfgs = {
 		'ic_wallet':       'FE3C6545-E29303EA-5E229E30[128,1].mmincog',
 		'ic_wallet':       'FE3C6545-E29303EA-5E229E30[128,1].mmincog',
 		'ic_wallet_hex':   'FE3C6545-BC4BE3F2-32586837[128,1].mmincox',
 		'ic_wallet_hex':   'FE3C6545-BC4BE3F2-32586837[128,1].mmincox',
 
 
-		'hic_wallet':       'FE3C6545-161E495F-BEB7548E[128:1].incog-offset123',
-		'hic_wallet_old':   'FE3C6545-161E495F-9860A85B[128:1].incog-old.offset123',
+		'hic_wallet':       'FE3C6545-161E495F-BEB7548E[128,1].incog-offset123',
+		'hic_wallet_old':   'FE3C6545-161E495F-9860A85B[128,1].incog-old.offset123',
 
 
 		'tmpdir':        os.path.join('test','tmp6'),
 		'tmpdir':        os.path.join('test','tmp6'),
 		'kapasswd':      '',
 		'kapasswd':      '',
@@ -299,8 +299,8 @@ cfgs = {
 		'ic_wallet':       '1378FC64-2907DE97-F980D21F[192,1].mmincog',
 		'ic_wallet':       '1378FC64-2907DE97-F980D21F[192,1].mmincog',
 		'ic_wallet_hex':   '1378FC64-4DCB5174-872806A7[192,1].mmincox',
 		'ic_wallet_hex':   '1378FC64-4DCB5174-872806A7[192,1].mmincox',
 
 
-		'hic_wallet':       '1378FC64-B55E9958-77256FC1[192:1].incog.offset123',
-		'hic_wallet_old':   '1378FC64-B55E9958-D85FF20C[192:1].incog-old.offset123',
+		'hic_wallet':       '1378FC64-B55E9958-77256FC1[192,1].incog.offset123',
+		'hic_wallet_old':   '1378FC64-B55E9958-D85FF20C[192,1].incog-old.offset123',
 
 
 		'tmpdir':        os.path.join('test','tmp7'),
 		'tmpdir':        os.path.join('test','tmp7'),
 		'kapasswd':      '',
 		'kapasswd':      '',
@@ -332,8 +332,8 @@ cfgs = {
 		'ic_wallet':       '98831F3A-5482381C-18460FB1[256,1].mmincog',
 		'ic_wallet':       '98831F3A-5482381C-18460FB1[256,1].mmincog',
 		'ic_wallet_hex':   '98831F3A-1630A9F2-870376A9[256,1].mmincox',
 		'ic_wallet_hex':   '98831F3A-1630A9F2-870376A9[256,1].mmincox',
 
 
-		'hic_wallet':       '98831F3A-F59B07A0-559CEF19[256:1].incog.offset123',
-		'hic_wallet_old':   '98831F3A-F59B07A0-848535F3[256:1].incog-old.offset123',
+		'hic_wallet':       '98831F3A-F59B07A0-559CEF19[256,1].incog.offset123',
+		'hic_wallet_old':   '98831F3A-F59B07A0-848535F3[256,1].incog-old.offset123',
 
 
 		'tmpdir':        os.path.join('test','tmp8'),
 		'tmpdir':        os.path.join('test','tmp8'),
 		'kapasswd':      '',
 		'kapasswd':      '',
@@ -663,7 +663,7 @@ except: # Windows
 	m1 = green('MS Windows or missing pexpect module detected.  Skipping some tests and running in\n')
 	m1 = green('MS Windows or missing pexpect module detected.  Skipping some tests and running in\n')
 	m2 = green('interactive mode.  User prompts and control values will be ')
 	m2 = green('interactive mode.  User prompts and control values will be ')
 	m3 = grnbg('HIGHLIGHTED IN GREEN')
 	m3 = grnbg('HIGHLIGHTED IN GREEN')
-	m4 = green('.\nControl values should be checked against the output that precedes them.')
+	m4 = green('.\nControl values should be checked against the program output.')
 	m5 = green('\nContinue?')
 	m5 = green('\nContinue?')
 	ni = True
 	ni = True
 	if not keypress_confirm(m1+m2+m3+m4+m5,default_yes=True):
 	if not keypress_confirm(m1+m2+m3+m4+m5,default_yes=True):
@@ -751,8 +751,7 @@ def verify_checksum_or_exit(checksum,chk):
 class MMGenExpect(object):
 class MMGenExpect(object):
 
 
 	def __init__(self,name,mmgen_cmd_arg,cmd_args=[],extra_desc='',no_output=False):
 	def __init__(self,name,mmgen_cmd_arg,cmd_args=[],extra_desc='',no_output=False):
-		if not opt.system:
-			mmgen_cmd = os.path.join(os.curdir,mmgen_cmd_arg)
+		mmgen_cmd = (os.path.join(os.curdir,mmgen_cmd_arg),mmgen_cmd_arg)[bool(opt.system)]
 		desc = (cmd_data[name][1],name)[bool(opt.names)]
 		desc = (cmd_data[name][1],name)[bool(opt.names)]
 		if extra_desc: desc += ' ' + extra_desc
 		if extra_desc: desc += ' ' + extra_desc
 		for i in cmd_args:
 		for i in cmd_args:
@@ -2036,7 +2035,7 @@ start_time = int(time.time())
 def end_msg():
 def end_msg():
 	t = int(time.time()) - start_time
 	t = int(time.time()) - start_time
 	m1 = 'All requested tests finished OK, elapsed time: {:02d}:{:02d}\n'
 	m1 = 'All requested tests finished OK, elapsed time: {:02d}:{:02d}\n'
-	m2 = ('','Please re-check all {} control values against the output preceding them.\n'.format(grnbg('HIGHLIGHTED')))[ni]
+	m2 = ('','Please re-check all {} control values against the program output.\n'.format(grnbg('HIGHLIGHTED')))[ni]
 	sys.stderr.write(green(m1.format(t/60,t%60)))
 	sys.stderr.write(green(m1.format(t/60,t%60)))
 	sys.stderr.write(m2)
 	sys.stderr.write(m2)