This patch eliminates the global configuration variables `opt` and `g`, making
all functions and class instances locally configurable. Configuration data is
passed to functions and constructors via the `cfg` parameter and made available
to methods in `self.cfg`.
Local configuration free from dependence on the command line will enable the
creation of multiple, independently configured instances of MMGen’s data
objects within a single process.
Potential applications include testing (tracking wallets configured to interact
with spawned processes, for example) and the use of MMGen as a library for
other projects.
This patch completes most of the work required to enable the API. The full
implementation will appear in a forthcoming commit.
- 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