mmgen-wallet/mmgen/test.py
philemon 3b0257358b
Support for Segwit (P2SH-P2WPKH) addresses:
- Generate Segwit addresses by invoking 'mmgen-addrgen' with the
  '--type segwit' option
- Import Segwit addresses into the tracking wallet as usual
- Segwit and legacy MMGen addresses are distinguished by 'S' and 'L'
  identifiers in the tracking wallet and command line

Transaction example:

  mmgen-txcreate F00BAA12:L:21,1.23 F00BAA12:S:1

(spend 1.23 BTC to legacy address 21 of your default wallet (with Seed ID
F00BAA12) and send the change to Segwit address 1)

Segwit and legacy addresses for a given seed are generated from different
sub-seeds so are cryptographically unrelated to each other.

Since MMGen's legacy P2PKH addresses are uncompressed, use of the new Segwit
addresses significantly reduces transaction size.

Until Segwit activation on mainnet, users can try out the new functionality on
testnet or in regtest mode.
2017-07-27 22:55:52 +03:00

109 lines
2.8 KiB
Python
Executable file

#!/usr/bin/env python
#
# mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
test.py: Shared routines for the test suites
"""
import os
from binascii import hexlify
from mmgen.common import *
def cleandir(d):
from shutil import rmtree
try: files = os.listdir(d)
except: return
msg(green("Cleaning directory '%s'" % d))
for f in files:
try:
os.unlink(os.path.join(d,f))
except:
rmtree(os.path.join(d,f))
def getrandnum(n): return int(hexlify(os.urandom(n)),16)
def getrandhex(n): return hexlify(os.urandom(n))
def getrandstr(num_chars,no_space=False):
n,m = 95,32
if no_space: n,m = 94,33
return ''.join([chr(ord(i)%n+m) for i in list(os.urandom(num_chars))])
def mk_tmpdir(d):
try: os.mkdir(d,0755)
except OSError as e:
if e.errno != 17: raise
else:
qmsg("Created directory '%s'" % d)
def mk_tmpdir_path(path,cfg):
try:
name = os.path.split(cfg['tmpdir'])[-1]
src = os.path.join(path,name)
try:
os.unlink(cfg['tmpdir'])
except OSError as e:
if e.errno != 2: raise
finally:
os.mkdir(src)
os.symlink(src,cfg['tmpdir'])
except OSError as e:
if e.errno != 17: raise
else: msg("Created directory '%s'" % cfg['tmpdir'])
def get_tmpfile_fn(cfg,fn):
return os.path.join(cfg['tmpdir'],fn)
def write_to_tmpfile(cfg,fn,data,binary=False):
write_data_to_file(
os.path.join(cfg['tmpdir'],fn),
data,
silent=True,
binary=binary
)
def read_from_file(fn,binary=False):
from mmgen.util import get_data_from_file
return get_data_from_file(fn,silent=True,binary=binary)
def read_from_tmpfile(cfg,fn,binary=False):
return read_from_file(os.path.join(cfg['tmpdir'],fn),binary=binary)
def ok():
if opt.profile: return
if opt.verbose or opt.exact_output:
sys.stderr.write(green('OK\n'))
else: msg(' OK')
def ok_or_die(val,chk_func,s,skip_ok=False):
try: ret = chk_func(val)
except: ret = False
if ret:
if not skip_ok: ok()
else:
msg(red("Returned value '%s' is not a %s" % (val,s)))
sys.exit(3)
def cmp_or_die(s,t,skip_ok=False):
if s == t:
if not skip_ok: ok()
else:
sys.stderr.write(red(
'ERROR: recoded data:\n%s\ndiffers from original data:\n%s\n' %
(repr(t),repr(s))))
sys.exit(3)