- create a compact JSON dump of the MMGen tracking wallet with `twexport`
- recreate a working tracking wallet with updated balances from the dump in
just a few minutes with `twimport`
- the import operation leverages the `scantxoutset` RPC call to selectively
rescan only required blocks, reducing block rescan time to typically just
a few seconds
- to recover historical transactions for viewing with `mmgen-tool txhist`,
a full blockchain rescan may be performed on the recreated wallet using
`mmgen-tool rescan_blockchain`
- supported coins: BTC, BCH, LTC
Display nicely formatted info about all transactions known to the tracking
wallet.
Interactive mode presents the user with an interface similar to `mmgen-tool
twview` or `mmgen-txcreate -i`, providing various sort, filter, column format
and printing options.
`--coin=ltc` and `--coin=bch` are also supported. Use of `--rpc-backend=aio`
speeds up operation significantly under Linux.
Usage examples:
# Non-interactive mode, tabular output:
$ mmgen-tool txhist
# Non-interactive mode, full output:
$ mmgen-tool txhist detail=1
# Show only transactions newer than 100000 blocks from chain tip:
$ mmgen-tool txhist sinceblock=-100000
# Interactive mode:
$ mmgen-tool txhist interactive=1
Testing/demo:
$ test/test.py -n -X bob_txhist1 regtest
$ test/test.py -Se regtest:bob_txhist1
$ test/test.py -Se regtest:bob_txhist2
$ test/test.py -Se regtest:bob_txhist3
$ test/test.py -Se regtest:bob_txhist4
$ test/test.py -Se regtest:bob_txhist_interactive
- all code has been relocated from `wallet.py` to individual modules under
`wallet`, with each wallet type having its own module
- the fully rewritten initialization code can be found in `__init__.py` and
`base.py`
- each command group now has its own module under the `tool` directory
- only modules required by a given command are loaded
- code used only by the command-line tool has been relocated to `main_tool.py`
- pubkey generation code has been rewritten and moved from addr.py to
keygen.py
- address generation code has been rewritten and moved from addr.py to
addrgen.py
- keygen/addrgen classes now present a consistent API across all pubkey and
address types
- key/address operations and related data objects now use bytes internally
instead of hex strings
- pubkey generator backends are now selected using the `--keygen-backend`
option
- for Monero pubkeys, the new `nacl` backend has replaced `ed25519ll_djbec`
as the default
- a minimal unit test has been added
Examples:
# Generate a random Monero keypair using the unoptimized 'ed25519' backend:
$ mmgen-tool --coin=xmr --keygen-backend=3 randpair
# Generate an LTC Bech32 address list from the default wallet using the
# 'python-ecdsa' backend:
$ mmgen-addrgen --coin=ltc --type=bech32 --keygen-backend=2 1-10
Testing:
# Run the minimal unit test:
$ test/unit_tests_py gen
# Compare BTC Segwit addresses from default 'libsecp256k1' backend to
# 'pycoin' library, with edge cases and 10,000 random rounds:
$ test/gentest.py --type=segwit 1:pycoin 10000
# Test all configured Monero backends against 'moneropy', with edge cases
# and 10 random rounds:
$ test/gentest.py --coin=xmr all:moneropy 10
# Test the 'nacl' and 'ed25519ll_djbec' backends against each other, with
# edge cases and 1000 random rounds:
$ test/gentest.py --coin=xmr 1:2 1000
# Test the speed of the Monero 'nacl' backend using 10,000 rounds:
$ test/gentest.py --coin=xmr 1 10000
# Same for Zcash:
$ test/gentest.py --coin=zec --type=zcash_z 1 10000
Follow-up to commit 08fc25d86
Testing:
$ export MMGEN_TEST_SUITE_DETERMINISTIC=1
$ script -c 'test/test.py -ne regtest' -O run1
$ script -c 'test/test.py -ne regtest' -O run2
$ scripts/gendiff.py run1 run2 > run.diff
Erratum:
The phrase “and the non-deterministic behavior of Bitcoin Core’s regtest
implementation” in the notes to commit 08fc25d86 is incorrect and should
be disregarded.
Affected coins: BTC,LTC,BCH
Fixes a regression introduced by commit `ca8b4dc31` on Aug 5.
During this period, use of the `mmgen-regtest` script would have overwritten
the user bitcoin/litecoin.conf and regtest dir. Other files in the daemon
datadir were unaffected.