modified: Getting-Started-with-MMGen.md

new file:   Tracking-and-spending-ordinary-Bitcoin-addresses.md
The MMGen Project 2016-08-01 15:21:06 +03:00
commit eed5b0f6bc
13 changed files with 352 additions and 333 deletions

@ -10,39 +10,56 @@
#### <a href=#10>Additional Features</a>
* <a href=#11>Using the mnemonic and seed features</a>
* <a href=#12>Mnemonics and seeds additional information</a>
* <a href=#12>Mnemonics and seeds: additional information</a>
* <a href=#13>Incognito wallets</a>
* <a href=#13a>Hidden incognito wallets</a>
IMPORTANT NOTE: The following primer presupposes you have MMGen installed
on two computers, one offline and one online. However, if you have an online
computer and a few Bitcoin addresses with small balances, it's perfectly
possible to practice the operations decribed below on a single machine.
The following primer presupposes you have MMGen installed on two computers, one
offline and one online. However, if you have an online computer and a few
Bitcoin addresses with small balances, it’s perfectly possible to perform the
operations described below on a single online machine.
If you're just looking to get your feet wet, wallet generation, wallet format
conversions, address and key generation, and address import may all be practiced
on an online or offline computer with no blockchain and no Bitcoin balance.
For those who just want to experiment with MMGen: all wallet generation, wallet
format conversion, address and key generation, and address import operations can
be performed on either an online or offline computer with an empty blockchain
and no Bitcoin balance.
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.
### <a name=01>Basic Operations</a>
#### <a name=02>Generate a wallet (offline computer):</a>
On your offline computer, generate a wallet with a random seed:
On your offline computer, generate a wallet:
$ mmgen-walletgen
...
MMGen wallet written to file '89ABCDEF-76543210[256,3].mmdat'
"89ABCDEF" is the Seed ID; "76543210" is the Key ID. These are randomly
generated, so your IDs will of course be different than the fictitious ones used
here.
‘89ABCDEF’ is the Seed ID; ‘76543210’ is the Key ID. These are randomly
generated, so your IDs will of course be different than these.
The Seed ID never changes and will be used to identify all keys/addresses
generated by this seed. The Key ID changes when the wallet's password or hash
preset are changed.
The Seed ID never changes and is used to identify all keys/addresses generated
by this wallet. You should make a note of it. The Key ID changes whenever the
wallet’s password or hash preset are changed and is less important.
"256" is the seed length; "3" is the scrypt hash preset. These values are
configurable: type 'mmgen-walletgen --help' for details.
‘256’ is the seed length; ‘3’ is the scrypt hash preset. These values are
configurable: type `mmgen-walletgen --help` for details.
Before moving any funds into your MMGen wallet, you should back it up in several
places and preferably on several media such as paper, flash memory or a CD-ROM.
You’re advised to use a passphrase with your wallet. Otherwise, anyone who
gains physical access to one of your backups can easily steal your coins. Don’t
forget your passphrase. If you do, the coins in your MMGen wallet are gone
forever.
Since the wallet is a small, humanly readable ASCII file, it can easily be
printed out on paper. It can also be exported to more compact forms, the seed
file and mnemonic (discussed below). These formats are short enough to be
written out by hand or memorized.
#### <a name=03>Generate addresses (offline computer):</a>
@ -66,265 +83,202 @@ Now generate ten addresses with your just-created wallet:
10 1H7vVTk4ejUbQXw45I6g5qvPBSe9bsjDqh
}
Note that the address range, "1-10", is reflected in the resulting filename.
MMGen addresses are identified by their Seed ID and index number, separated by a
colon. In this example, "89ABCDEF:1" is the MMGen equivalent of Bitcoin address
16bNmyYISiptuvJG3X7MPwiiS4HYvD7ksE, "89ABCDEF:2" the equivalent of
1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc, and so forth.
Note that the address range ‘1-10’ specified on the command line is included in
the resulting filename. MMGen addresses consist of the Seed ID followed by ‘:’
and an index. In this example, ‘89ABCDEF:1’ represents the Bitcoin address
‘16bNmy...’, ‘89ABCDEF:2’ represents ‘1AmkUx...’ and so forth.
Let's say you've decided to transfer some BTC into the first four addresses
above. Your first step, then, will be to import these addresses into the
tracking wallet on your online machine so their balances will be visible.
For convenient identification, you've chosen to provide the addresses with the
labels "Donations", "Storage 1", "Storage 2" and "Storage 3".
To begin moving your Bitcoin holdings into your MMGen wallet, just spend into
any of these addresses. If you run out of addresses, generate more. To
generate a hundred addresses, for example, you’d specify an address range of ‘1-100’.
Make a copy of the file:
Let’s say you’ve decided to spend some BTC into the first four addresses above.
Before doing so, you must import these addresses into the tracking wallet on
your online machine so their balances will be visible. For convenience
of reference, provide the addresses with labels. We’ll use the labels
‘Donations’, ‘Storage 1’, ‘Storage 2’ and ‘Storage 3’.
Make a copy of the address file
$ cp '89ABCDEF[1-10].addrs' my.addrs
and edit the copy using your favorite text editor to look like this:
and edit it using the text editor of your choice,
$ nano my.addrs
adding labels to the addresses you’ve chosen to spend to:
$ cat my.addrs
# My first MMGen addresses
89ABCDEF {
1 16bNmyYISiptuvJG3X7MPwiiS4HYvD7ksE Donations
2 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc Storage 1
3 1HgYCsfqYzIg7LVVfDTp7gYJocJEiDAy6N Storage 2
4 14Tu3z1tiexXDonNsFIkvzqutE5E3pTK8s Storage 3
5 1PeI55vtp2bX2uKDkAAR2c6ekHNYe4Hcq7
6 1FEqfEsSILwXPfMvVvVuUovzTaaST62Mnf
7 1LTTzuhMqPLwQ4IGCwwugny6ZMtUQJSJ1
8 1F9495H8EJLb54wirgZkVgI47SP7M2RQWv
9 1JbrCyt7BdxRE9GX1N7GiEct8UnIjPmpYd
10 1H7vVTk4ejUbQXw45I6g5qvPBSe9bsjDqh
}
Note the comment beginning with a '#' symbol. Comments may be placed at the
ends of lines as well. Note also that rows in the list may be arranged in any
order: addresses need not be consecutive.
Any line beginning with ‘#’ is a comment. Comments may be placed at the ends
of lines as well.
Copy this file onto a USB stick and transfer it to your online computer.
Save the file, copy it onto a USB stick and transfer it to your online computer.
#### <a name=04>Import addresses (online computer):</a>
On your online computer, go to your bitcoind data directory and move any
existing 'wallet.dat' file out of harm's way. Start bitcoind and let it
generate a new 'wallet.dat', which you'll use as your **tracking wallet**.
Import your four addresses into the new tracking wallet with the command:
existing 'wallet.dat' file out of harms way. Start bitcoind and let it
generate a new 'wallet.dat', which you’ll use as your tracking wallet.
Import your ten addresses into the new tracking wallet with the command:
$ mmgen-addrimport my.addrs
$ mmgen-addrimport --batch my.addrs
These addresses will now be tracked by bitcoind. Any BTC transferred to them
will show up in your listing of address balances. Balances can be viewed with
the 'mmgen-tool' utility:
These addresses will now be tracked: any BTC transferred to them will show up in
your listing of address balances. Balances can be viewed using `mmgen-tool
listaddresses` (the `showempty` option requests the inclusion of addresses with
empty balances, and `showbtcaddrs` causes Bitcoin addresses to be displayed
also).
$ mmgen-tool listaddresses showempty=1 showbtcaddrs=1
MMGenID ADDRESS COMMENT BALANCE
89ABCDEF:1 16bNmyYISiptuvJG3X7MPwiiS4HYvD7ksE Donations 0
89ABCDEF:2 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc Storage 1 0
89ABCDEF:3 1HgYCsfqYzIg7LVVfDTp7gYJocJEiDAy6N Storage 2 0
89ABCDEF:4 14Tu3z1tiexXDonNsFIkvzqutE5E3pTK8s Storage 3 0
89ABCDEF:5 1PeI55vtp2bX2uKDkAAR2c6ekHNYe4Hcq7 0
...
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!
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:
$ mmgen-tool listaddresses
No addresses with balances!
The 'showempty' option shows all tracked addresses, even ones with no balances,
so the four imported addresses should now show up on the listing:
$ mmgen-tool listaddresses showempty=1
ADDRESS COMMENT BALANCE
89ABCDEF:1 Donations 0
89ABCDEF:2 Storage 1 0
89ABCDEF:3 Storage 2 0
89ABCDEF:4 Storage 3 0
If you have any existing addresses with balances, you'll want to track them too.
Make a plain list of these addresses, one address per line, and import the list
into the tracking wallet using 'mmgen-addrimport -l'.
$ mmgen-addrimport --rescan -l my_existing_addrs_with_balances
NOTE: The '--rescan' option forces a rescan of the entire block chain, which is
required for all addresses with existing balances. Since the rescanning process
is very slow, you'll save yourself a great deal of time by always importing
new addresses BEFORE spending into them.
Continue in this fashion until you've imported all addresses with balances into
your tracking wallet.
MMGenID COMMENT BALANCE
89ABCDEF:1 Donations 0.1
89ABCDEF:2 Storage 1 0.2
89ABCDEF:3 Storage 2 0.3
89ABCDEF:4 Storage 3 0.4
TOTAL: 1 BTC
#### <a name=05>Create a transaction (online computer):</a>
Now that your existing addresses are imported, you're ready to create a test
transaction using the 'mmgen-txcreate' command. Note that transactions are
harmless until they're signed and broadcast to the network, so feel free to
experiment with different transactions using different combinations of inputs
and outputs.
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
broadcast to the network, so feel free to experiment and create transactions
with different combinations of inputs and outputs.
First of all, you'll want to examine your balances. Note that 'mmgen-tool
listaddresses' shows only MMGen address balances; to view **all** balances,
including your non-MMGen ones, use the 'mmgen-txcreate' command:
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
issue the following command:
$ mmgen-txcreate -i
$ mmgen-txcreate 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,0.1 89ABCDEF:5
A list of all unspent outputs will appear, along with a menu allowing you to
sort the outputs by four criteria: transaction ID, address, amount and
transaction age. Your overall balance in BTC appears at the top of the screen.
The list may optionally be viewed in a pager or printed to file. For a wallet
with ten unspent outputs, the display might look something like this:
Note that 'mmgen-txcreate' accepts either MMGen IDs or Bitcoin addresses as
arguments.
UNSPENT OUTPUTS (sort order: reverse amount) Total BTC: 39.72
Num TX id Vout Address Amount (BTC) Age(days)
1) 04f97185... 2 1F93Znz8PI5Pnvv8ZAJsb74EzKpmRMLFbk 10 320
2) dd900544... 1 194Fceqx86jqIWumphUmfVyFMjAAbMLcSE 9.9287435 7
3) 7ec81a8f... 0 1FhIkRabPSZhhUsA6qvukmfK4T4PZLbC4M 7.26 17
4) 64094b55... 0 16JSUJdGMbxUBEQatAR5sGE89tbSIsLHqg 3.15 140
5) fd687c65... 1 1QKAtU66aUntCBx9m6TfEIf3gQuCNWCVDY 3.15 140
6) 9a8f20e2... 1 1FMNDFz1yUywjJSprjvYY9t1yxkE8GGIwT 3.15 140
7) 03a7c51a... 3 1svxnSdKVIcMs6qWYA7qLzA29orXbzXUm 1.6382466 54
8) 9955f06c... 2 18nWPLQGUzI7X1Rcm4zmVV6Z3xhokdYx9G 1.2 27
9) 8a4ab4f5... 0 13S9HNu7PQn1aJ4qILfhqRSakXwvSTnbwJ 0.23033 3
10) 5bfe5621... 1 1FV1Lhs6Dnc9gMxjJTo6h4nTeIjJbQ1PgV 0.01 42
To send 0.1 BTC to each of your addresses 89ABCDEF:6 and 89ABCDEF:7 and return the
change to 89ABCDEF:8, you’d do this:
$ mmgen-txcreate 89ABCDEF:6,0.1 89ABCDEF:7,0.1 89ABCDEF:8
As you can see, each send address is followed by a comma and the amount. The
address with no amount is the change address. All addresses belonging to your
seed in the above examples are already imported and tracked, so you’re OK. If
you wanted to send to 89ABCDEF:11 instead, you'd have to import it first.
Let’s go with the first of our two examples above.
Upon invocation, the 'mmgen-txcreate' command shows you a list of your
unspent outputs along with a menu allowing you to sort the outputs by four
criteria: transaction ID, address, amount and transaction age. Your overall
balance in BTC appears at the top of the screen. In our example, the display
will look something like this:
UNSPENT OUTPUTS (sort order: Age) Total BTC: 1
Num TX id Vout Address Amt(BTC) Age(d)
1) e9742b16... 5 1L3kxmi.. 89ABCDEF:1 Donations 0.1 1
2) fa84d709... 6 1N4dSGj.. 89ABCDEF:2 Storage 1 0.2 1
3) 8dde8ef5... 6 1M1fVDc.. 89ABCDEF:3 Storage 1 0.3 1
4) c76874c7... 0 1E8MFoC.. 89ABCDEF:4 Storage 3 0.4 1
Sort options: [t]xid, [a]mount, a[d]dress, [A]ge, [r]everse, [M]mgen addr
View options: [g]roup, show [m]mgen addr
(Type 'q' to quit sorting, 'p' to print to file, 'v' to view in pager):
Display options: show [D]ays, [g]roup, show [m]mgen addr, r[e]draw screen
'q'=quit view, 'p'=print to file, 'v'=pager view, 'w'=wide view, 'l'=add label:
Now let's actually create a transaction. Let's say you've decided to gradually
begin moving your 39.72 BTC balance into your shiny new MMGen wallet with Seed
ID 89ABCDEF.
Before moving any funds into your MMGen wallet, you should back it up in several
places and possibly on several media too: paper, flash memory or CD-ROM, for
example. You're advised to use a passphrase on your wallet. Otherwise, anyone
who gains physical access to one of your backups can easily steal your coins.
Recall that there's no limit to the number of addresses you can generate with
your seed. You've wisely determined that having many addresses with relatively
small balances is a Good Idea. So you've decided to begin by breaking up your
address with the largest balance, 10 BTC, address 1F93Znz..., into three roughly
equal parts and send them to the addresses labeled "Storage 1", "Storage 2" and
"Storage 3" (89ABCDEF:2, 89ABCDEF:3 and 89ABCDEF:4).
To refresh your memory, here are the three destination addresses in question:
$ cat my.addrs | grep -v Donations
# My first MMGen addresses
89ABCDEF {
2 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc Storage 1
3 1HgYCsfqYzIg7LVVfDTp7gYJocJEiDAy6N Storage 2
4 14Tu3z1tiexXDonNsFIkvzqutE5E3pTK8s Storage 3
}
The following command does just this, sending 6.6 BTC of the transaction's 10
BTC input to the first two addresses and the remainder to the third address,
for which no amount has been specified:
$ mmgen-txcreate 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,3.3 1HgYCsfqYzIg7LVVfDTp7gYJocJEiDAy6N,3.3 14Tu3z1tiexXDonNsFIkvzqutE5E3pTK8s
The address with no amount is the **change address**; MMGen will calculate
the amount sent to it automatically by subtracting the sum of the outputs
plus transaction fee, if any, from the inputs. In our example, 3.39995 BTC (10
BTC - (3.3 + 3.3 BTC) - .00005 BTC default transaction fee) will go to this
address.
Note that the above transaction can be expressed much more concisely by
replacing the Bitcoin addresses with their MMGen equivalents:
$ mmgen-txcreate 89ABCDEF:2,3.3 89ABCDEF:3,3.3 89ABCDEF:4
For this to work, the addresses must be imported into your tracking wallet,
which they should be in any case.
After hitting ENTER you'll be presented with the same UNSPENT OUTPUTS display as
with the '-i' option above. In our example, note that the output with 10 BTC
which you wish to spend, 1F93Znz..., is listed as number '1'. Remember this.
After quitting the menu with 'q' you'll see the following prompt:
After quitting the menu with 'q', you’ll see the following prompt:
Enter a range or space-separated list of outputs to spend:
Type your remembered '1' here and hit ENTER. After several more prompts and
confirmations, your transaction will be saved:
Here you must choose outputs of sufficient value to cover the send amount of 0.1
BTC, plus the transaction fee. By the way, MMGen calculates fees automatically
using bitcoind’s 'estimatefee' RPC call, which makes things very convenient. If
you want to increase the fee a bit for speedier confirmation, use the
`--tx-fee-adj` option. Type `mmgen-txcreate --help` for details.
Transaction written to file 'FEDCBA[6.6].rawtx'
Output #2 is worth 0.2 BTC, which is sufficient, so let’s choose it. After
several more prompts and confirmations, your transaction will be saved:
Note that the transaction has a unique ID, and the non-change spend amount of
6.6 BTC is included in the filename.
Transaction written to file 'FEDCBA[0.1].rawtx'
#### <a name=06>Create a keylist file (online computer):</a>
Note that the transaction filename consists of a unique ID plus the spend
amount.
To sign your transaction, you'll need the Bitcoin private key corresponding to
its input address, '1F93Znz....'
If the key in question is in a bitcoind wallet ('wallet.dat'), you'll want to
extract the key (along with all the other keys in the wallet) to a keylist
file. This is done using the 'bitcoin-cli dumpwallet' command with bitcoind
running.
$ bitcoin-cli dumpwallet my_secret.keys
This will write the keylist file 'my_secret.keys' (or whatever filename you've
chosen) to your home directory (or maybe to your Bitcoin data directory, results
may vary). If you want it written to another location, provide an absolute
path.
Note that the keylist file lists your private keys in *unencrypted* form, even
if your 'wallet.dat' was encrypted. Therefore, it should be backed up to a safe
location—to a USB stick, say, or to your offline computer. After you've backed
it up, securely delete all copies of it on your online computer.
You'll use this keylist file to sign all transactions that spend from addresses
in your bitcoind wallet.
If the key/address pair in question came from another source, you may create
your own file 'my_secret.keys' (or whatever) in a plain text editor and just
list the key in this file. In the case of multiple keys, just list them all,
one key per line. In our example, the file will have one line containing a
single private key corresponding to the address '1F93Znz....'
As you can see, MMGen gives you complete control over your transaction inputs
and change addresses. This feature will be appreciated by privacy-conscious users.
#### <a name=06>Sign a transaction (offline computer):</a>
Now transfer the the raw transaction file and just-created keylist file to your
offline computer and run:
Now transfer the the raw transaction file to your offline computer and sign it
using your wallet:
$ mmgen-txsign -k my_secret.keys FEDCBA[6.6].rawtx
$ mmgen-txsign FEDCBA[0.1].rawtx 89ABCDEF-76543210[256,3].mmdat
...
Signed transaction written to file 'FEDCBA[6.6].sigtx'
Signed transaction written to file 'FEDCBA[0.1].sigtx'
The signed transaction is written to a new file whose name differs from the raw
transaction file only by its '.sig' extension.
NOTE: once you've migrated your funds to MMGen, the keylist file will no longer be
needed. Instead, you'll sign transactions by listing an MMGen seed source
(wallet, mnemonic or seed file) on the command line after the transaction, and
the required keys will be generated on the fly, as in the following example:
$ mmgen-txsign ABCDE[1].rawtx my_mmgen_wallet.mmdat
NOTE: transactions may contain a mixture of MMGen and non-MMGen inputs, as well
as inputs with more than one MMGen Seed ID. Just list a seed source for each
MMGen input on the command line after the transaction, as in this example:
$ mmgen-txsign -k my_secret.keys my_tx.raw a.mmdat b.mmwords c.mmseed
Note that the signed transaction file bears the extension '.sigtx'.
#### <a name=07>Send a transaction (online computer):</a>
Now you're ready for the final step: broadcasting the transaction to the
network. Copy the just-created signed transaction file to your online computer,
start bitcoind and issue the command:
Now you’re ready for the final step: broadcasting the transaction to the
network. Copy the signed transaction file to your online computer, start
bitcoind if necessary, and issue the command:
$ mmgen-txsend FEDCBA[6.6].sigtx
$ mmgen-txsend FEDCBA[0.1].sigtx
Like all MMGen commands, 'mmgen-txsend' is interactive, so you'll be prompted
Like all MMGen commands, 'mmgen-txsend' is interactive, so you’ll be prompted
before the transaction is actually sent.
Once the transaction is broadcast to the network, you can view your three new
MMGen addresses and their balances:
Once the transaction is broadcast to the network and confirmed, your address
listing should look something like this:
$ mmgen-tool listaddresses minconf=0
ADDRESS COMMENT BALANCE
89ABCDEF:2 Storage 1 3.3
89ABCDEF:3 Storage 2 3.3
89ABCDEF:4 Storage 3 3.39995
$ mmgen-tool listaddresses minconf=1
MMGenID COMMENT BALANCE
89ABCDEF:1 Donations 0.1
89ABCDEF:3 Storage 2 0.3
89ABCDEF:4 Storage 3 0.4
89ABCDEF:5 Storage 1 0.0999
TOTAL: 0.8999 BTC
Your total MMGen balance will also now be visible:
Since you’ve sent 0.1 BTC to a third party, your balance has declined by 0.1 BTC
plus the tx fee of 0.0001 BTC. To verify that your transaction’s received its
second, third and so on confirmations, increase `minconf` accordingly.
$ mmgen-tool getbalance minconf=0
Wallet Unconfirmed <0 confirms >=0 confirms
89ABCDEF: 0 BTC 0 BTC 9.99995 BTC
TOTAL: 0 BTC 0 BTC 9.99995 BTC
Congratulations! You’ve now mastered the basics of MMGen!
To verify that your transaction's received its first, second, third, and so on,
confirmation, increase the 'minconf' value to 1, 2, 3 and so forth.
Congratulations! You've performed your first MMGen transaction and placed your
first funds under MMGen control.
Some of MMGen’s more advanced features are discussed below. Others are
documented in the help screens of the individual MMGen commands: display these
by invoking the desired command with the `-h` or `--help` switch.
### <a name=10>Additional Features</a>
@ -342,17 +296,17 @@ Continuing our example above, generate a mnemonic from the wallet:
dirty measure thorn
Note: a 128- or 192-bit seed will generate a shorter mnemonic of 12 or 18
words. You may generate a wallet with these seed lengths using the '-l'
words. You may generate a wallet with these seed lengths using the `-l`
option to 'mmgen-walletgen'.
Though some consider 128 bits of entropy to provide adequate security for the
foreseeable future, it's advisable to stick to the default 256-bit seed length
if you're not planning to use the mnemonic feature.
foreseeable future, its advisable to stick to the default 256-bit seed length
if youre not planning to use the mnemonic feature.
NOTE: MMGen mnemonics are generated from the Electrum wordlist, but using
ordinary base conversion instead of Electrum's more complicated algorithm.
ordinary base conversion instead of Electrums more complicated algorithm.
The mnemonic file may be used any place you'd use a MMGen wallet with the same
The mnemonic file may be used any place youd use a MMGen wallet with the same
Seed ID. You can generate ten addresses with it just as you did with the
wallet, for example:
@ -385,7 +339,7 @@ And they can also be used to regenerate a wallet:
...
MMGen wallet written to file '89ABCDEF-23456701[256,3].mmdat'
Here's a sample seed file for a 256-bit wallet:
Heres a sample seed file for a 256-bit wallet:
$ cat 8B7392ED.mmseed
f4c84b C5ZT wWpT Jsoi wRVw 2dm9 Aftd WLb8 FggQ eC8h Szjd da9L
@ -407,7 +361,7 @@ Or you can do the same thing with 'mmgen-tool':
$ mmgen-tool str2id6 'XnyC NfPH piuW dQ2d nM47 VU'
0fe02f
#### <a name=12>Mnemonics and seeds — additional information:</a>
#### <a name=12>Mnemonics and seeds: additional information</a>
MMGen commands that take mnemonic and seed data may receive the data from a
prompt instead of a file. Just omit the file name and specify the input format:
@ -416,16 +370,16 @@ prompt instead of a file. Just omit the file name and specify the input format:
...
Enter mnemonic data: <type or paste your mnemonic here>
With the '-S' option, MMGen commands may be requested to print wallet data to
With the `-S` option, MMGen commands may be requested to print wallet data to
screen instead of a file. To safeguard against over-the-shoulder, Van Eck
phreaking and other side-channel attacks, you'll be prompted before this
phreaking and other side-channel attacks, youll be prompted before this
sensitive data is actually displayed. MMGen never prints unencrypted private
data to screen by default.
The output of any MMGen command may be written to a directory of your choice
using the '-d' option. For example, on a Linux system you can use
'-d /dev/shm' to write keys and seeds to volatile memory instead of disk,
ensuring that no trace of this sensitive data remains once your computer's been
using the `-d` option. For example, on a Linux system you can use
`-d /dev/shm` to write keys and seeds to volatile memory instead of disk,
ensuring that no trace of this sensitive data remains once your computers been
powered down.
#### <a name=13><a name=incog>Incognito wallets</a>
@ -434,7 +388,7 @@ An incognito format wallet is indistinguishable from random data, allowing you
to hide your wallet at an offset within a random-data-filled file or partition.
Barring any inside knowledge, a potential attacker has no way of knowing where
the wallet is hidden, or whether the file or partition contains anything of
interest at all for that matter.
interest at all, for that matter.
An incognito wallet with a reasonably secure password could even be hidden on
unencrypted cloud storage. Hiding your wallet at some offset in a 1 GB file
@ -443,7 +397,7 @@ again that any potential attacker even knows or suspects you have an MMGen
wallet hidden there.
If you plan to store your incognito wallet in an insecure location such as cloud
storage, you're advised to use a strong scrypt (hash) preset and a strong
storage, youre advised to use a strong scrypt (hash) preset and a strong
password. These can be changed using the 'mmgen-passchg' utility:
$ mmgen-passchg -p 5 89ABCDEF-01234567[256,3].mmdat
@ -457,8 +411,8 @@ password. These can be changed using the 'mmgen-passchg' utility:
MMGen wallet written to file '89ABCDEF-87654321[256,5].mmdat'
The scrypt preset is the numeral in the wallet filename following the seed
length. As you can see, it's now changed to '5'. Now export your new toughened
wallet to incognito format, using the '-k' option to leave the passphrase
length. As you can see, its now changed to '5'. Now export your new toughened
wallet to incognito format, using the `-k` option to leave the passphrase
unchanged:
$ mmgen-walletconv -k -o incog 89ABCDEF-87654321[256,5].mmdat
@ -470,7 +424,7 @@ unchanged:
Incognito data written to file '89ABCDEF-87654321-ECA86420[256,5].mmincog'
Incog wallets have a special identifier, the Incog ID, which can be used to
locate the wallet data if you've forgotten where you hid it (see the example
locate the wallet data if youve forgotten where you hid it (see the example
below). Naturally, an attacker could use this ID to find the data too, so it
should be kept secret.
@ -486,13 +440,13 @@ Incog wallets can also be output to hexadecimal format:
3706 c5ce 56e0 7590 e677 6c6e 750a d057
b43a 21f9 82c7 6bd1 fe96 bad9 2d54 c4c0
Note that the Incog ID is different here: it's generated from an init vector,
Note that the Incog ID is different here: its generated from an init vector,
which is a different random number each time, making the incog data as a whole
different as well. This allows you to store your incog data in multiple
public locations without having repeated "random" wallet data give you away.
public locations without having repeated ‘random’ wallet data give you away.
Indistinguishable from any random hex dump, this data is ideally suited for a
paper wallet that could potentially fall into the wrong hands.
This data is ideally suited for a paper wallet that could potentially fall into
the wrong hands.
Your incognito wallet (whether hex or binary) can be used just like any other
MMGen wallet, mnemonic or seed file to generate addresses and sign transactions:
@ -508,9 +462,9 @@ MMGen wallet, mnemonic or seed file to generate addresses and sign transactions:
##### <a name=13a><a name=incog>Hidden incognito wallets</a>
With the '-o hincog' option, incognito wallet data can be created and hidden at
With the `-o hincog` option, incognito wallet data can be created and hidden at
a specified offset in a file or partition in a single convenient operation, with
the random file being created automatically if required. Here's how you'd
the random file being created automatically if necessary. Here’s how you’d
create a 1GB file 'random.dat' and hide a wallet in it at offset 123456789:
$ mmgen-walletconv -k -o hincog -J random.dat,123456789 89ABCDEF-87654321[256,5].mmdat
@ -522,22 +476,22 @@ create a 1GB file 'random.dat' and hide a wallet in it 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
situation you will choose a less obvious offset than '123456789' though, won't
situation you will choose a less obvious offset than '123456789' though, wont
you?).
Now let's say at some point in the future you download this file to recover
your wallet and realize you've forgotten the offset where the data is hidden.
If you've saved your Incog ID, you're in luck:
Now lets say at some point in the future you download this file to recover
your wallet and realize youve forgotten the offset where the data is hidden.
If you’ve saved your Incog ID, you’re in luck:
$ mmgen-tool find_incog_data random.dat ED1F2ACB
...
Incog data for ID ED1F2ACB found at offset 123456789
The search process can be slow, so patience is required. In addition, on
large files 'false positives' are a distinct possibility, in which case you'll
need to use the 'keep_searching=1' parameter to keep going until you find the
large files ‘false positives’ are a distinct possibility, in which case you’ll
need to use the `keep_searching=1` parameter to keep going until you find the
real offset.
Hidden incog wallets are nearly as convenient to use as ordinary ones.
@ -550,3 +504,5 @@ Transaction signing uses the same syntax:
$ mmgen-txsign -H random.dat,123456789 ABCDEF[0.1].rawtx
...
Signed transaction written to file 'ABCDEF[0.1].sigtx'
[1]: https://github.com/mmgen/mmgen/wiki/Tracking-and-spending-ordinary-Bitcoin-addresses

@ -0,0 +1,58 @@
## Tracking and spending ordinary Bitcoin (non-MMGen) addresses
While not recommended, it is possible to use MMGen to track and spend ordinary
Bitcoin addresses too, i.e. addresses whose keys you control but which haven't
been spent to your MMGen wallet.
#### Import the Bitcoin addresses for tracking (online computer):
Make a plain list of the addresses, one address per line, and import the list
into the tracking wallet:
$ mmgen-addrimport --rescan --batch -l my_existing_addrs
NOTE: The '--rescan' option forces a rescan of the entire block chain, which is
required for all addresses with existing balances. Though the '--batch' option
helps speed things up greatly, the rescanning process is still very slow. This
is why you should always import new addresses into the tracking wallet
*before* spending into them, whenever possible.
#### Create a keylist file for signing transactions (online computer):
To sign transactions that spend from the Bitcoin addresses you've imported, you
need their corresponding private keys.
If the key or keys in question are in a bitcoind wallet ('wallet.dat'), you can
extract them to a keylist file using the 'bitcoin-cli dumpwallet' command:
$ bitcoin-cli dumpwallet my_secret.keys
This will write the keylist file 'my_secret.keys' to your home directory (or
maybe to your Bitcoin data directory, results may vary). If you want it written
to another location, provide an absolute path.
Note that the keylist file lists your private keys in *unencrypted* form.
Therefore, it should be backed up to a safe location—to a USB stick, say, or
your offline computer. After backing up, securely delete all copies of the list
on your online computer using a utility such as 'wipe'.
If the address(es) in question came from another source, you may create your own
'my_secret.keys' (or whatever) file in a plain text editor and list the
corresponding keys in this file in WIF format, one key per line.
#### Sign a transaction using the keylist (offline computer):
After creating a transaction that spends from one of your ordinary Bitcoin
addresses, transfer the raw transaction file to your offline computer and sign
it with the keylist file:
$ mmgen-txsign -k my_secret.keys F9DCBA[6.6].rawtx
...
Signed transaction written to file 'F9DCBA[6.6].sigtx'
If your transaction also contains MMGen inputs, you'll need to provide a wallet
for them too, listing it at the end of the command line, like this:
$ mmgen-txsign -k my_secret.keys F9DCBA[6.6].rawtx 89ABCDEF-76543210[256,3].mmdat
That's it! Your signed transaction is ready to broadcast.

@ -40,14 +40,14 @@
seed, the same seed length and hash preset parameters must always be used.
FMT CODES:
Format Valid codes
------ -----------
Brainwallet mmbrain,brainwallet,brain,bw,b
IncogWallet mmincog,incog,icg,i
IncogWalletHex mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden incog_hidden,hincog,ih,hi
Mnemonic mmwords,words,mnemonic,mnem,mn,m
SeedFile mmseed,seed,s
Wallet wallet,w
Format FileExt Valid codes
------ ------- -----------
Brainwallet .mmbrain mmbrain,brainwallet,brain,bw,b
IncogWallet .mmincog mmincog,incog,icg,i
IncogWalletHex .mmincox mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden None incog_hidden,hincog,ih,hi
Mnemonic .mmwords mmwords,words,mnemonic,mnem,mn,m
SeedFile .mmseed mmseed,seed,s
Wallet .mmdat wallet,w
MMGEN v0.8.3 February 2016 MMGEN-ADDRGEN(1)
MMGEN v0.8.5 July 2016 MMGEN-ADDRGEN(1)

@ -14,4 +14,4 @@
This command can also be used to update the comment fields of addresses already
in the tracking wallet.
MMGEN v0.8.3 February 2016 MMGEN-ADDRIMPORT(1)
MMGEN v0.8.5 July 2016 MMGEN-ADDRIMPORT(1)

@ -41,14 +41,14 @@
seed, the same seed length and hash preset parameters must always be used.
FMT CODES:
Format Valid codes
------ -----------
Brainwallet mmbrain,brainwallet,brain,bw,b
IncogWallet mmincog,incog,icg,i
IncogWalletHex mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden incog_hidden,hincog,ih,hi
Mnemonic mmwords,words,mnemonic,mnem,mn,m
SeedFile mmseed,seed,s
Wallet wallet,w
Format FileExt Valid codes
------ ------- -----------
Brainwallet .mmbrain mmbrain,brainwallet,brain,bw,b
IncogWallet .mmincog mmincog,incog,icg,i
IncogWalletHex .mmincox mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden None incog_hidden,hincog,ih,hi
Mnemonic .mmwords mmwords,words,mnemonic,mnem,mn,m
SeedFile .mmseed mmseed,seed,s
Wallet .mmdat wallet,w
MMGEN v0.8.3 February 2016 MMGEN-KEYGEN(1)
MMGEN v0.8.5 July 2016 MMGEN-KEYGEN(1)

@ -30,14 +30,14 @@
data from a multi-line file with free spacing and indentation.
FMT CODES:
Format Valid codes
------ -----------
Brainwallet mmbrain,brainwallet,brain,bw,b
IncogWallet mmincog,incog,icg,i
IncogWalletHex mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden incog_hidden,hincog,ih,hi
Mnemonic mmwords,words,mnemonic,mnem,mn,m
SeedFile mmseed,seed,s
Wallet wallet,w
Format FileExt Valid codes
------ ------- -----------
Brainwallet .mmbrain mmbrain,brainwallet,brain,bw,b
IncogWallet .mmincog mmincog,incog,icg,i
IncogWalletHex .mmincox mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden None incog_hidden,hincog,ih,hi
Mnemonic .mmwords mmwords,words,mnemonic,mnem,mn,m
SeedFile .mmseed mmseed,seed,s
Wallet .mmdat wallet,w
MMGEN v0.8.3 February 2016 MMGEN-PASSCHG(1)
MMGEN v0.8.5 July 2016 MMGEN-PASSCHG(1)

@ -23,10 +23,11 @@
wif2hex - convert a private key from WIF to hex format
Wallet/TX operations (bitcoind must be running):
getbalance - like 'bitcoind getbalance' but shows confirmed/unconfirmed,
getbalance - like 'bitcoin-cli getbalance' but shows confirmed/unconfirmed,
spendable/unspendable balances for individual MMGen wallets
listaddresses - list MMGen addresses and their balances
txview - show raw/signed MMGen transaction in human-readable form
twview - view tracking wallet
General utilities:
hexdump - encode data into formatted hexadecimal form (file or stdin)
@ -76,7 +77,6 @@
IMPORTANT NOTE: Though MMGen mnemonics use the Electrum wordlist, they're
computed using a different algorithm and are NOT Electrum-compatible!
Type 'mmgen-tool usage <command> for usage information on a particular
command
Type 'mmgen-tool help <command> for help on a particular command
MMGEN v0.8.3 February 2016 MMGEN-TOOL(1)
MMGEN v0.8.5 July 2016 MMGEN-TOOL(1)

@ -2,25 +2,33 @@
USAGE: mmgen-txcreate [opts] <addr,amt> ... [change addr] [addr file] ...
OPTIONS:
-h, --help Print this help message
-a, --tx-fee-adj f Adjust transaction fee by factor 'f' (see below)
-c, --comment-file f Source the transaction's comment from file 'f'
-C, --tx-confs c Desired number of confirmations (default: 3)
-d, --outdir d Specify an alternate directory 'd' for output
-e, --echo-passphrase Print passphrase to screen when typing it
-f, --tx-fee f Transaction fee (default: 0.00005 BTC)
-f, --tx-fee f Transaction fee (default: 0.0003 BTC (but see below))
-i, --info Display unspent outputs and exit
-q, --quiet Suppress warnings; overwrite files without
prompting
-q, --quiet Suppress warnings; overwrite files without prompting
-v, --verbose Produce more verbose output
Transaction inputs are chosen from a list of the user's unpent outputs
via an interactive menu.
Ages of transactions are approximate based on an average block creation
If the transaction fee is not specified by the user, it will be calculated
using bitcoind's "estimatefee" function for the default (or user-specified)
number of confirmations. If "estimatefee" fails, the global default fee of
0.0003 BTC will be used.
Dynamic fees will be multiplied by the value of '--tx-fee-adj', if specified.
Ages of transactions are approximate based on an average block discovery
interval of 9 minutes.
Addresses on the command line can be Bitcoin addresses or MMGen addresses
of the form <seed ID>:<number>.
All addresses on the command line can be either Bitcoin addresses or MMGen
addresses of the form <seed ID>:<index>.
To send all inputs (minus TX fee) to a single output, specify one address
with no amount on the command line.
To send the value of all inputs (minus TX fee) to a single output, specify
one address with no amount on the command line.
MMGEN v0.8.3 February 2016 MMGEN-TXCREATE(1)
MMGEN v0.8.5 July 2016 MMGEN-TXCREATE(1)

@ -5,4 +5,4 @@
-d, --outdir d Specify an alternate directory 'd' for output
-q, --quiet Suppress warnings; overwrite files without prompting
MMGEN v0.8.3 February 2016 MMGEN-TXSEND(1)
MMGEN v0.8.5 July 2016 MMGEN-TXSEND(1)

@ -3,9 +3,7 @@
OPTIONS:
-h, --help Print this help message.
-b, --brain-params l,p Use seed length 'l' and hash preset 'p' for brain-
wallet input. Required only if these parameters dif-
fer from those of an incognito wallet also being used
as a seed source.
wallet input.
-d, --outdir d Specify an alternate directory 'd' for output.
-D, --tx-id Display transaction ID and exit.
-e, --echo-passphrase Print passphrase to screen when typing it.
@ -34,7 +32,6 @@
-I, --info Display information about the transaction and exit.
-t, --terse-info Like '--info', but produce more concise output.
-v, --verbose Produce more verbose output
-w, --use-wallet-dat Get keys from a running bitcoind
Transactions with either MMGen or non-MMGen input addresses may be signed.
For non-MMGen inputs, the bitcoind wallet.dat is used as the key source.
@ -62,14 +59,14 @@
brainwallet: '.mmbrain'
FMT CODES:
Format Valid codes
------ -----------
Brainwallet mmbrain,brainwallet,brain,bw,b
IncogWallet mmincog,incog,icg,i
IncogWalletHex mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden incog_hidden,hincog,ih,hi
Mnemonic mmwords,words,mnemonic,mnem,mn,m
SeedFile mmseed,seed,s
Wallet wallet,w
Format FileExt Valid codes
------ ------- -----------
Brainwallet .mmbrain mmbrain,brainwallet,brain,bw,b
IncogWallet .mmincog mmincog,incog,icg,i
IncogWalletHex .mmincox mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden None incog_hidden,hincog,ih,hi
Mnemonic .mmwords mmwords,words,mnemonic,mnem,mn,m
SeedFile .mmseed mmseed,seed,s
Wallet .mmdat wallet,w
MMGEN v0.8.3 February 2016 MMGEN-TXSIGN(1)
MMGEN v0.8.5 July 2016 MMGEN-TXSIGN(1)

@ -30,14 +30,14 @@
seed, the same seed length and hash preset parameters must always be used.
FMT CODES:
Format Valid codes
------ -----------
Brainwallet mmbrain,brainwallet,brain,bw,b
IncogWallet mmincog,incog,icg,i
IncogWalletHex mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden incog_hidden,hincog,ih,hi
Mnemonic mmwords,words,mnemonic,mnem,mn,m
SeedFile mmseed,seed,s
Wallet wallet,w
Format FileExt Valid codes
------ ------- -----------
Brainwallet .mmbrain mmbrain,brainwallet,brain,bw,b
IncogWallet .mmincog mmincog,incog,icg,i
IncogWalletHex .mmincox mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden None incog_hidden,hincog,ih,hi
Mnemonic .mmwords mmwords,words,mnemonic,mnem,mn,m
SeedFile .mmseed mmseed,seed,s
Wallet .mmdat wallet,w
MMGEN v0.8.3 February 2016 MMGEN-WALLETCHK(1)
MMGEN v0.8.5 July 2016 MMGEN-WALLETCHK(1)

@ -41,14 +41,14 @@
seed, the same seed length and hash preset parameters must always be used.
FMT CODES:
Format Valid codes
------ -----------
Brainwallet mmbrain,brainwallet,brain,bw,b
IncogWallet mmincog,incog,icg,i
IncogWalletHex mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden incog_hidden,hincog,ih,hi
Mnemonic mmwords,words,mnemonic,mnem,mn,m
SeedFile mmseed,seed,s
Wallet wallet,w
Format FileExt Valid codes
------ ------- -----------
Brainwallet .mmbrain mmbrain,brainwallet,brain,bw,b
IncogWallet .mmincog mmincog,incog,icg,i
IncogWalletHex .mmincox mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden None incog_hidden,hincog,ih,hi
Mnemonic .mmwords mmwords,words,mnemonic,mnem,mn,m
SeedFile .mmseed mmseed,seed,s
Wallet .mmdat wallet,w
MMGEN v0.8.3 February 2016 MMGEN-WALLETCONV(1)
MMGEN v0.8.5 July 2016 MMGEN-WALLETCONV(1)

@ -34,14 +34,14 @@
seed, the same seed length and hash preset parameters must always be used.
FMT CODES:
Format Valid codes
------ -----------
Brainwallet mmbrain,brainwallet,brain,bw,b
IncogWallet mmincog,incog,icg,i
IncogWalletHex mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden incog_hidden,hincog,ih,hi
Mnemonic mmwords,words,mnemonic,mnem,mn,m
SeedFile mmseed,seed,s
Wallet wallet,w
Format FileExt Valid codes
------ ------- -----------
Brainwallet .mmbrain mmbrain,brainwallet,brain,bw,b
IncogWallet .mmincog mmincog,incog,icg,i
IncogWalletHex .mmincox mmincox,incox,incog_hex,xincog,ix,xi
IncogWalletHidden None incog_hidden,hincog,ih,hi
Mnemonic .mmwords mmwords,words,mnemonic,mnem,mn,m
SeedFile .mmseed mmseed,seed,s
Wallet .mmdat wallet,w
MMGEN v0.8.3 February 2016 MMGEN-WALLETGEN(1)
MMGEN v0.8.5 July 2016 MMGEN-WALLETGEN(1)