Browse Source

Documentation updates

MMGen 7 years ago
parent
commit
ac64ad8b2f

+ 292 - 0
doc/wiki/using-mmgen/Altcoin-and-Forkcoin-Support.md

@@ -0,0 +1,292 @@
+## Table of Contents
+
+#### [Full support for Ethereum (ETH), Ethereum Classic (ETC) and ERC20 Tokens](#a_eth)
+* [Install and run Parity Ethereum](#a_par)
+* [Install the Pyethereum library](#a_pe)
+* [Transacting and other basic operations](#a_tx)
+* [Creating and deploying ERC20 tokens](#a_dt)
+
+#### [Full support for Bcash (BCH) and Litecoin](#a_bch)
+
+#### [Enhanced key/address generation support for Monero (XMR) and Zcash (ZEC)](#a_es)
+
+#### [Key/address generation support for 144 Bitcoin-derived altcoins](#a_kg)
+
+### <a name='a_eth'>Full support for Ethereum (ETH), Ethereum Classic (ETC) and ERC20 Tokens</a>
+
+Ethereum, Ethereum Classic and ERC20 tokens are fully supported by MMGen, on the
+same level as Bitcoin.  In addition, ERC20 token creation and deployment are
+supported via the `create-token.py` script.
+
+#### <a name='a_par'>Install and run Parity Ethereum</a>
+
+MMGen uses Parity to communicate with the Ethereum blockchain.  For information
+on installing Parity on your system, visit the Parity Ethereum [homepage][h] or
+[Git repository][g].  [MMGenLive][l] users can install Parity automatically from
+signed binaries using the [`mmlive-daemon-upgrade`][U] script.  Parity is not
+used for transaction signing, so you needn't install it on your offline machine.
+
+Parity must be invoked with the `--jsonrpc-apis=all` option so that MMGen can
+communicate with it.  If you're running the daemon and MMGen on different
+machines you'll also need the following:
+
+	--jsonrpc-hosts=all --jsonrpc-interface=<IP of Parity's host>
+
+To transact Ethereum Classic, use `--chain=classic --jsonrpc-port=8555`
+
+To run the daemon offline, use `--mode=offline`, otherwise `--mode=active`.
+
+You may require other options as well.  Consult `parity --help` for the full
+list.
+
+#### <a name='a_pe'>Install the Pyethereum library</a>
+
+Signing of ETH and ETC transactions is handled by the [pyethereum][y] library.
+Unfortunately, Python 2 is not reliably supported by recent versions of
+pyethereum and some of its dependencies, so older versions must be installed.
+This can be done easily with the [pip][P] Python package installer.
+
+First install the following dependencies:
+
+	$ pip install rlp==0.6.0 # the version is important here!
+	$ pip install future pysha3 PyYAML py_ecc
+
+Now install the library itself.  You could try doing this the usual way:
+
+	$ pip install ethereum==2.1.2 # the version is important here!
+
+However, pyethereum pulls in a whole bunch of silly dependencies, some of which
+may fail to install, and we need only a subset of the library anyway, so it's
+better to do the following instead:
+
+	$ pip download ethereum==2.1.2
+
+This will download the package archive and dependencies.  When pip starts
+downloading the dependency archives, just bail out with Ctrl-C, since you don't
+need them.
+
+Now unpack the ethereum-2.1.2.tar.gz archive and remove unneeded deps from
+'requirements.txt', making the file look exactly like this:
+
+	pysha3>=1.0.1
+	PyYAML
+	scrypt
+	py_ecc
+	rlp>=0.4.7
+	future
+
+Now install:
+
+	$ sudo python ./setup.py install
+
+#### <a name='a_tx'>Transacting and other basic operations</a>
+
+Basic operations with ETH, ETC and ERC20 tokens work as described in the
+[Getting Started][bo] guide, with some differences.  Please note the following:
+
+* Don't forget to invoke all commands with either `--coin=eth` or `--coin=etc`.
+* Use the `--token` switch with all token operations.  When importing addresses
+  into your token tracking wallet you must use the token's address as the
+  argument.  After this, the token symbol, e.g. `--token=eos`, is sufficient.
+* Addresses and other hexadecimal values are given without the leading `0x`.
+* Fees are expressed in Gas price, e.g. `12G` for 12 Gwei or `1000M` for 1000
+  Mwei.  This works both at the command line and interactive prompt.
+
+##### Transacting example:
+
+*Note: All addresses and filenames in the examples to follow are bogus.  You
+must replace them with real ones.*
+
+Generate some ETH addresses with your default wallet:
+
+	$ mmgen-addrgen --coin=eth 1-5
+
+Create an EOS token tracking wallet and import the addresses into it:
+
+	$ mmgen-addrimport --coin=eth --token=86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0 ABCDABCD-ETH[1-5].addrs
+
+*Unlike the case with BTC and derivatives, ETH and ETC tracking wallets are
+created and managed by MMGen itself and located under the MMGen data directory.
+Token tracking wallets are located inside their underlying coin's
+`tracking-wallet.json` file.  Address (account) balances are retrieved directly
+from the blockchain.  Tracking wallet views are separate for each token.*
+
+Now send 10+ EOS from an exchange or another wallet to address `ABCDABCD:E:1`.
+Then create a TX sending 10 EOS to third-party address `aabbccdd...`, with
+change to `ABCDABCD:E:2`:
+
+	$ mmgen-txcreate --coin=eth --token=eos aabbccddaabbccddaabbccddaabbccddaabbccdd,10 ABCDABCD:E:2
+
+On your offline machine, sign the TX:
+
+	$ mmgen-txsign --coin=eth --token=eos ABC123-EOS[10,50000].rawtx
+
+*You can also set up and use [autosigning][X] on the offline machine, of
+course.*
+
+On your online machine, send the TX:
+
+	$ mmgen-txsend --coin=eth --token=eos ABC123-EOS[10,50000].sigtx
+
+View your EOS tracking wallet:
+
+	$ mmgen-tool --coin=eth --token=eos twview
+
+To transact ETH instead of EOS, omit the `--token` arguments.
+
+#### <a name='a_dt'>Creating and deploying ERC20 tokens</a>
+
+Install the Solidity compiler (`solc`) on your system:
+
+	$ sudo apt-get install solc
+
+##### Token creation/deployment example:
+
+*Note: All addresses and filenames in the examples to follow are bogus.  You
+must replace them with real ones.*
+
+Create a token 'MFT' with default parameters, owned by `ddeeff...` (`ABCDABCD:E:1`):
+
+	# Do this in the MMGen repository root:
+	$ scripts/create-token.py --symbol=MFT --name='My First Token' ddeeffddeeffddeeffddeeffddeeffddeeffddee
+
+Deploy the token on the ETH blockchain:
+
+	$ mmgen-txdo --coin=eth --tx-gas=200000 --contract-data=SafeMath.bin
+	$ mmgen-txdo --coin=eth --tx-gas=250000 --contract-data=Owned.bin
+	$ mmgen-txdo --coin=eth --tx-gas=1100000 --contract-data=Token.bin
+	...
+	Token address: abcd1234abcd1234abcd1234abcd1234abcd1234
+
+*These Gas amounts seem to work for these three contracts, but feel free to
+experiment.  Make sure you understand the difference between Gas amount and Gas
+price!*
+
+Create an MFT token tracking wallet and import your ETH addresses into it:
+
+	$ mmgen-addrimport --coin=eth --token=abcd1234abcd1234abcd1234abcd1234abcd1234 ABCDABCD-ETH[1-5].addrs
+
+View your MFT tracking wallet:
+
+	$ mmgen-tool --coin=eth --token=mft twview
+
+Other token parameters can also be customized.  Type `scripts/create-token.py --help`
+for details.
+
+### <a name='a_bch'>Full support for Bcash (BCH) and Litecoin</a>
+
+Bcash and Litecoin are fully supported by MMGen, on the same level as Bitcoin.
+
+To use MMGen with Bcash or Litecoin, first make sure the respective Bitcoin ABC
+and Litecoin daemons are properly installed ([source][si])([binaries][bi]),
+[running][p8] and synced.
+
+MMGen requires that the bitcoin-abc daemon be listening on non-standard
+[RPC port 8442][p8].  If your daemon version is >= 0.16.2, you must use the
+`--usecashaddr=0` option.
+
+Then just add the `--coin=bch` or `--coin=ltc` option to all your MMGen
+commands.  It's that simple!
+
+### <a name='a_es'>Enhanced key/address generation support for Monero (XMR) and Zcash (ZEC)</a>
+
+MMGen's enhanced key/address generation support for Zcash and Monero includes
+**Zcash z-addresses** and automated Monero wallet creation.
+
+Generate ten Zcash z-address key/address pairs from your default wallet:
+
+	$ mmgen-keygen --coin=zec --type=zcash_z 1-10
+
+The addresses' view keys are included in the file as well.
+
+NOTE: Since your key/address file will probably be used on an online computer,
+you should encrypt it with a good password when prompted to do so. The file can
+decrypted as required using the `mmgen-tool decrypt` command.  If you choose a
+non-standard Scrypt hash preset, take care to remember it.
+
+To generate Zcash t-addresses, just omit the `--type` argument:
+
+	$ mmgen-keygen --coin=zec 1-10
+
+Generate ten Monero address pairs from your default wallet:
+
+	$ mmgen-keygen --coin=xmr 1-10
+
+In addition to spend and view keys, Monero key/address files also include a
+wallet password for each address (the password is the double SHA256 of the spend
+key, truncated to 16 bytes).  This allows you to generate a wallet from each
+key in the key/address file by running the following command:
+
+	$ monero-wallet-cli --generate-from-spend-key MyMoneroWallet
+
+and pasting in the key and password data when prompted.  Monerod must be
+running and `monero-wallet-cli` be located in your executable path.
+
+To save your time and labor, the `mmgen-tool` utility includes a command that
+completely automates this process:
+
+	$ mmgen-tool keyaddrlist2monerowallets *XMR*.akeys.mmenc
+
+This will generate a uniquely-named Monero wallet for each key/address pair in
+the key/address file and encrypt it with its respective password.  No user
+interaction is required.  By default, wallets are synced to the current block
+height, as they're assumed to be empty, but this behavior can be overridden:
+
+	$ mmgen-tool keyaddrlist2monerowallets *XMR*.akeys.mmenc blockheight=123456
+
+To keep your wallets in sync as the Monero blockchain grows, `mmgen-tool`
+includes another utility:
+
+	$ mmgen-tool syncmonerowallets *XMR*.akeys.mmenc
+
+This command also requires no user interaction, a very handy feature when you
+have a large batch of wallets requiring long sync times.
+
+### <a name='a_kg'>Key/address generation support for 144 Bitcoin-derived altcoins</a>
+
+To generate key/address pairs for these coins, just specify the coin's symbol
+with the `--coin` argument:
+
+	# For DASH:
+	$ mmgen-keygen --coin=dash 1-10
+	# For Emercoin:
+	$ mmgen-keygen --coin=emc 1-10
+
+For compressed public keys, add the `--type=compressed` option:
+
+	$ mmgen-keygen --coin=dash --type=compressed 1-10
+
+If it's just the addresses you want, then use `mmgen-addrgen` instead:
+
+	$ mmgen-addrgen --coin=dash 1-10
+
+Regarding encryption of key/address files, see the note for Zcash above.
+
+Here's a complete list of supported altcoins as of this writing:
+
+	2give,42,611,ac,acoin,alf,anc,apex,arco,arg,aur,bcf,blk,bmc,bqc,bsty,btcd,
+	btq,bucks,cann,cash,cat,cbx,ccn,cdn,chc,clam,con,cpc,crps,csh,dash,dcr,dfc,
+	dgb,dgc,doge,doged,dope,dvc,efl,emc,emd,enrg,esp,fai,fc2,fibre,fjc,flo,flt,
+	fst,ftc,gcr,good,grc,gun,ham,html5,hyp,icash,infx,inpay,ipc,jbs,judge,lana,
+	lat,ldoge,lmc,ltc,mars,mcar,mec,mint,mobi,mona,moon,mrs,mue,mxt,myr,myriad,
+	mzc,neos,neva,nka,nlg,nmc,nto,nvc,ok,omc,omni,onion,onx,part,pink,pivx,pkb,
+	pnd,pot,ppc,ptc,pxc,qrk,rain,rbt,rby,rdd,ric,sdc,sib,smly,song,spr,start,
+	sys,taj,tit,tpc,trc,ttc,tx,uno,via,vpn,vtc,wash,wdc,wisc,wkc,wsx,xcn,xgb,
+	xmg,xpm,xpoke,xred,xst,xvc,zet,zlq,zoom,zrc,bch,etc,eth,ltc,xmr,zec
+
+Note that support for these coins is EXPERIMENTAL.  Many of them have received
+only minimal testing, or no testing at all.  At startup you'll be informed of
+the level of your selected coin's support reliability as deemed by the MMGen
+Project.
+
+[h]: https://www.parity.io/ethereum
+[g]: https://github.com/paritytech/parity-ethereum/releases
+[l]: https://github.com/mmgen/MMGenLive
+[y]: https://github.com/ethereum/pyethereum
+[P]: https://pypi.org/project/pip
+[U]: https://github.com/mmgen/MMGenLive/blob/master/home.mmgen/bin/mmlive-daemon-upgrade
+[X]: autosign-[MMGen-command-help]
+[bo]: Getting-Started-with-MMGen#a_bo
+[si]: Install-Bitcoind-from-Source-on-Debian-or-Ubuntu-Linux
+[bi]: Install-Bitcoind#a_d
+[p8]: Install-Bitcoind#a_r

+ 30 - 148
doc/wiki/using-mmgen/Getting-Started-with-MMGen.md

@@ -1,36 +1,31 @@
 ## Table of Contents
 ## Table of Contents
 
 
-#### <a href='#a_i'>Preliminaries</a>
-* <a href='#a_bb'>Before you begin</a>
-* <a href='#a_iv'>Invocation</a>
-* <a href='#a_cf'>Configuration file</a>
-* <a href='#a_ts'>Bob and Alice regtest mode</a>
-
-#### <a href='#a_bo'>Basic Operations</a>
-* <a href='#a_gw'>Generate an MMGen wallet</a>
-* <a href='#a_ga'>Generate addresses</a>
-* <a href='#a_ia'>Import addresses</a>
-* <a href='#a_ct'>Create a transaction</a>
-* <a href='#a_sg'>Sign a transaction</a>
-* <a href='#a_st'>Send a transaction</a>
-
-#### <a href='#a_af'>Additional Features</a>
-* <a href='#a_ms'>Using the mnemonic, seed and hexseed formats</a>
-* <a href='#a_ai'>Mnemonics, seeds and hexseeds: additional information</a>
-* <a href='#a_ic'>Incognito wallets</a>
-	* <a href='#a_hi'>Hidden incognito wallets</a>
-
-#### <a href='#a_at'>Advanced Topics</a>
-* <a href='#a_hw'>Hot wallets and key-address files</a>
-* <a href='#a_fee'>Transaction Fees</a>
-* <a href='#a_rbf'>BIP 125 replace-by-fee (RBF) transactions</a>
-	* <a href='#a_rbf_onl'>With an online (hot) wallet</a>
-	* <a href='#a_rbf_onf'>With an offline (cold storage) wallet</a>
-
-#### <a href='#a_alt'>Forkcoin and Altcoin support</a>
-* <a href='#a_bch'>Full support for Bcash (BCH) and Litecoin</a>
-* <a href='#a_es'>Enhanced key/address generation support for Zcash (ZEC) and Monero (XMR)</a>
-* <a href='#a_kg'>Key/address generation support for ETH, ETC and 144 Bitcoin-derived altcoins</a>
+#### [Preliminaries](#a_i)
+* [Before you begin](#a_bb)
+* [Invocation](#a_iv)
+* [Configuration file](#a_cf)
+* [Bob and Alice regtest mode](#a_ts)
+
+#### [Basic Operations](#a_bo)
+* [Generate an MMGen wallet](#a_gw)
+* [Generate addresses](#a_ga)
+* [Import addresses](#a_ia)
+* [Create a transaction](#a_ct)
+* [Sign a transaction](#a_sg)
+* [Send a transaction](#a_st)
+
+#### [Additional Features](#a_af)
+* [Using the mnemonic, seed and hexseed formats](#a_ms)
+* [Mnemonics, seeds and hexseeds: additional information](#a_ai)
+* [Incognito wallets](#a_ic)
+	* [Hidden incognito wallets](#a_hi)
+
+#### [Advanced Topics](#a_at)
+* [Hot wallets and key-address files](#a_hw)
+* [Transaction Fees](#a_fee)
+* [BIP 125 replace-by-fee (RBF) transactions](#a_rbf)
+	* [With an online (hot) wallet](#a_rbf_onl)
+	* [With an offline (cold storage) wallet](#a_rbf_onf)
 
 
 ### <a name='a_i'>Preliminaries</a>
 ### <a name='a_i'>Preliminaries</a>
 
 
@@ -147,8 +142,8 @@ Since the wallet is a small, humanly readable ASCII file, it can easily be
 printed out on paper.
 printed out on paper.
 
 
 Another highly recommended way to back up your wallet is to generate a mnemonic
 Another highly recommended way to back up your wallet is to generate a mnemonic
-or seed file <a href='#a_ms'>as described below </a> and memorize it.  If you
-have an average or better memory, you'll find memorizing your mnemonic to be
+or seed file [as described below](#a_ms) and memorize it.  If you have an
+average or better memory, you'll find memorizing your mnemonic to be
 surprisingly easy. And the peace of mind that comes with knowing that your coins
 surprisingly easy. And the peace of mind that comes with knowing that your coins
 are recoverable **even if you lose all your physical backups** can't be
 are recoverable **even if you lose all your physical backups** can't be
 overestimated.
 overestimated.
@@ -868,120 +863,7 @@ them in turn until you get a confirmation:
 	$ mmgen-txsend 124FFF[0.1,150].sigtx  # ...if this doesn't confirm, then
 	$ mmgen-txsend 124FFF[0.1,150].sigtx  # ...if this doesn't confirm, then
 	$ mmgen-txsend 73DABB[0.1,200].sigtx
 	$ mmgen-txsend 73DABB[0.1,200].sigtx
 
 
-### <a name='a_alt'>Forkcoin and Altcoin support</a>
-
-#### <a name='a_bch'>Full support for Bcash (BCH) and Litecoin</a>
-
-Bcash and Litecoin are fully supported by MMGen, on the same level as Bitcoin.
-
-To use MMGen with Bcash or Litecoin, first make sure the respective Bitcoin ABC
-and Litecoin daemons are properly installed ([source][si])([binaries][bi]),
-[running][p8] and synced.
-
-MMGen requires that the bitcoin-abc daemon be listening on non-standard
-[RPC port 8442][p8].  If your daemon version is >= 0.16.2, you must use the
-`--usecashaddr=0` option.
-
-Then just add the `--coin=bch` or `--coin=ltc` option to all your MMGen
-commands.  It's that simple!
-
-#### <a name='a_es'>Enhanced key/address generation support for Zcash (ZEC) and Monero (XMR)</a>
-
-MMGen's enhanced key/address generation support for Zcash and Monero includes
-**Zcash z-addresses** and automated Monero wallet creation.
-
-Generate ten Zcash z-address key/address pairs from your default wallet:
-
-	$ mmgen-keygen --coin=zec --type=zcash_z 1-10
-
-The addresses' view keys are included in the file as well.
-
-NOTE: Since your key/address file will probably be used on an online computer,
-you should encrypt it with a good password when prompted to do so. The file can
-decrypted as required using the `mmgen-tool decrypt` command.  If you choose a
-non-standard Scrypt hash preset, take care to remember it.
-
-To generate Zcash t-addresses, just omit the `--type` argument:
-
-	$ mmgen-keygen --coin=zec 1-10
-
-Generate ten Monero address pairs from your default wallet:
-
-	$ mmgen-keygen --coin=xmr 1-10
-
-In addition to spend and view keys, Monero key/address files also include a
-wallet password for each address (the password is the double SHA256 of the spend
-key, truncated to 16 bytes).  This allows you to generate a wallet from each
-key in the key/address file by running the following command:
-
-	$ monero-wallet-cli --generate-from-spend-key MyMoneroWallet
-
-and pasting in the key and password data when prompted.  Monerod must be
-running and `monero-wallet-cli` be located in your executable path.
-
-To save your time and labor, the `mmgen-tool` utility includes a command that
-completely automates this process:
-
-	$ mmgen-tool keyaddrlist2monerowallets *XMR*.akeys.mmenc
-
-This will generate a uniquely-named Monero wallet for each key/address pair in
-the key/address file and encrypt it with its respective password.  No user
-interaction is required.  By default, wallets are synced to the current block
-height, as they're assumed to be empty, but this behavior can be overridden:
-
-	$ mmgen-tool keyaddrlist2monerowallets *XMR*.akeys.mmenc blockheight=123456
-
-To keep your wallets in sync as the Monero blockchain grows, `mmgen-tool`
-includes another utility:
-
-	$ mmgen-tool syncmonerowallets *XMR*.akeys.mmenc
-
-This command also requires no user interaction, a very handy feature when you
-have a large batch of wallets requiring long sync times.
-
-#### <a name='a_kg'>Key/address generation support for ETH, ETC and 144 Bitcoin-derived altcoins</a>
-
-To generate key/address pairs for these coins, just specify the coin's symbol
-with the `--coin` argument:
-
-	# For DASH:
-	$ mmgen-keygen --coin=dash 1-10
-	# For Emercoin:
-	$ mmgen-keygen --coin=emc 1-10
-
-For compressed public keys, add the `--type=compressed` option:
-
-	$ mmgen-keygen --coin=dash --type=compressed 1-10
-
-If it's just the addresses you want, then use `mmgen-addrgen` instead:
-
-	$ mmgen-addrgen --coin=dash 1-10
-
-Regarding encryption of key/address files, see the note for Zcash above.
-
-Here's a complete list of supported altcoins as of this writing:
-
-	2give,42,611,ac,acoin,alf,anc,apex,arco,arg,aur,bcf,blk,bmc,bqc,bsty,btcd,
-	btq,bucks,cann,cash,cat,cbx,ccn,cdn,chc,clam,con,cpc,crps,csh,dash,dcr,dfc,
-	dgb,dgc,doge,doged,dope,dvc,efl,emc,emd,enrg,esp,fai,fc2,fibre,fjc,flo,flt,
-	fst,ftc,gcr,good,grc,gun,ham,html5,hyp,icash,infx,inpay,ipc,jbs,judge,lana,
-	lat,ldoge,lmc,ltc,mars,mcar,mec,mint,mobi,mona,moon,mrs,mue,mxt,myr,myriad,
-	mzc,neos,neva,nka,nlg,nmc,nto,nvc,ok,omc,omni,onion,onx,part,pink,pivx,pkb,
-	pnd,pot,ppc,ptc,pxc,qrk,rain,rbt,rby,rdd,ric,sdc,sib,smly,song,spr,start,
-	sys,taj,tit,tpc,trc,ttc,tx,uno,via,vpn,vtc,wash,wdc,wisc,wkc,wsx,xcn,xgb,
-	xmg,xpm,xpoke,xred,xst,xvc,zet,zlq,zoom,zrc,bch,etc,eth,ltc,xmr,zec
-
-Note that support for these coins is EXPERIMENTAL.  Many of them have received
-only minimal testing, or no testing at all.  At startup you'll be informed of
-the level of your selected coin's support reliability as deemed by the MMGen
-Project.
-
-[01]: https://github.com/mmgen/mmgen/wiki/Tracking-and-spending-ordinary-Bitcoin-addresses
+[01]: Tracking-and-spending-ordinary-Bitcoin-addresses
 [02]: https://tpfaucet.appspot.com
 [02]: https://tpfaucet.appspot.com
 [03]: Recovering-Your-Keys-Without-the-MMGen-Software
 [03]: Recovering-Your-Keys-Without-the-MMGen-Software
-[04]: https://bitcoin.org/en/developer-examples#testnet
-[05]: https://bitcoin.org/en/developer-examples#regtest-mode
-[06]: https://github.com/mmgen/mmgen/wiki/MMGen-Quick-Start-with-Regtest-Mode
-[si]: Install-Bitcoind-from-Source-on-Debian-or-Ubuntu-Linux
-[bi]: Install-Bitcoind#a_d
-[p8]: Install-Bitcoind#a_r
+[06]: MMGen-Quick-Start-with-Regtest-Mode

+ 14 - 12
doc/wiki/using-mmgen/Recovering-Your-Keys-Without-the-MMGen-Software.md

@@ -1,15 +1,14 @@
 ## Table of Contents
 ## Table of Contents
-
-* <a href='#a_i'>Introduction</a>
-* <a href='#a_rs'>Obtaining the binary seed</a>
-	* <a href='#a_ss'>Convert the seed to binary (legacy uncompressed addresses)</a>
-	* <a href='#a_cs'>Scramble the seed and save to binary (non-legacy and altcoin addresses and passwords)</a>
-* <a href='#a_gk'>Generating the keys</a>
-	* <a href='#a_cr'>Checking the result (optional, address example)</a>
-* <a href='#a_hpw'>Converting the hex value to a password (password example)</a>
-* <a href='#a_hw'>Hex to WIF by hand (address example)</a>
-	* <a href='#a_bcu'>Base-conversion utility</a>
-* <a href='#a_mh'>Converting an MMGen mnemonic to hexadecimal format</a>
+* [Introduction](#a_i)
+* [Obtaining the binary seed](#a_rs)
+	* [Convert the seed to binary (legacy uncompressed addresses)](#a_ss)
+	* [Scramble the seed and save to binary (non-legacy and altcoin addresses and passwords)](#a_cs)
+* [Generating the keys](#a_gk)
+	* [Checking the result (optional, address example)](#a_cr)
+* [Converting the hex value to a password (password example)](#a_hpw)
+* [Hex to WIF by hand (address example)](#a_hw)
+	* [Base-conversion utility](#a_bcu)
+* [Converting an MMGen mnemonic to hexadecimal format](#a_mh)
 
 
 #### <a name='a_i'>Introduction</a>
 #### <a name='a_i'>Introduction</a>
 
 
@@ -201,11 +200,14 @@ one:
 
 
 And so on and so forth, until we've generated all the keys we need: three, in our case.
 And so on and so forth, until we've generated all the keys we need: three, in our case.
 
 
+If we're generating keys for Ethereum and Monero, our work is done: the raw
+hexadecimal keys are all we need.  Otherwise, read on.
+
 #### <a name='a_hpw'>Converting the hex value to a password (password example)</a>
 #### <a name='a_hpw'>Converting the hex value to a password (password example)</a>
 
 
 If it's passwords we're generating, we must now convert our hex key to the
 If it's passwords we're generating, we must now convert our hex key to the
 desired password format, base58 in our case.  For this we can use the homemade
 desired password format, base58 in our case.  For this we can use the homemade
-`hex2b58.py` <a href='#a_bcu'>Base-conversion utility</a> described below:
+`hex2b58.py` [Base-conversion utility](#a_bcu) described below:
 
 
 	# bd60b8... is the double sha256 of our link1.bin from above
 	# bd60b8... is the double sha256 of our link1.bin from above
 	$ ./hex2b58.py bd60b8ba034bbb40498667ee600bc0cc0b99eb19164e8d412a48f16da4e00d6b
 	$ ./hex2b58.py bd60b8ba034bbb40498667ee600bc0cc0b99eb19164e8d412a48f16da4e00d6b