From 279e8872efe9634403e4f9584a47f2c7897169f3 Mon Sep 17 00:00:00 2001 From: MMGen Date: Mon, 25 Dec 2017 09:48:59 +0300 Subject: [PATCH] Improve coin selection logic, allow coin disabling --- mmgen/altcoin.py | 39 +++++++++++++++++++++------------------ mmgen/main.py | 4 +++- mmgen/protocol.py | 31 ++++++++++++++++++++----------- scripts/test-release.sh | 3 ++- test/gentest.py | 11 +++++++---- 5 files changed, 53 insertions(+), 35 deletions(-) diff --git a/mmgen/altcoin.py b/mmgen/altcoin.py index 70663ae5..50344f3e 100755 --- a/mmgen/altcoin.py +++ b/mmgen/altcoin.py @@ -38,10 +38,12 @@ class CoinInfo(object): coin_constants = {} coin_constants['mainnet'] = ( # NAME SYM WIF P2PKH P2SH SEGWIT TRUST -# trust levels: 0=untested 1=low 2=med 3=high - ('Bitcoin', 'BTC', 0x80, (0x00,'1'), (0x05,'3'), True, 3), - ('BitcoinSegwit2X', 'B2X', 0x80, (0x00,'1'), (0x05,'3'), True, 2), - ('Bcash', 'BCH', 0x80, (0x00,'1'), (0x05,'3'), False, 3), +# trust levels: 0=untested 1=low 2=med 3=high -1=disable +# Fork coins must be disabled here to prevent generation from incorrect sub-seed + ('Bitcoin', 'BTC', 0x80, (0x00,'1'), (0x05,'3'), True, -1), + ('BitcoinSegwit2X', 'B2X', 0x80, (0x00,'1'), (0x05,'3'), True, -1), + ('BitcoinGold', 'BCG', 0x80, (0x00,'1'), (0x05,'3'), True, -1), + ('Bcash', 'BCH', 0x80, (0x00,'1'), (0x05,'3'), False,-1), ('2GiveCoin', '2GIVE', 0xa7, (0x27,('G','H')), None, False, 0), ('42Coin', '42', 0x88, (0x08,'4'), None, False, 1), ('ACoin', 'ACOIN', 0xe6, (0x17,'A'), None, False, 0), @@ -432,20 +434,21 @@ class CoinInfo(object): from mmgen.util import pmsg,pdie # pmsg(sym) # pdie(tt) - if sym in tt: - src = tt[sym] - if src != trust: - msg("Updating trust for coin '{}': {} -> {}".format(sym,trust,src)) - line[6] = src - else: - if trust != 0: - msg("Downgrading trust for coin '{}': {} -> {}".format(sym,trust,0)) - line[6] = 0 + if trust != -1: + if sym in tt: + src = tt[sym] + if src != trust: + msg("Updating trust for coin '{}': {} -> {}".format(sym,trust,src)) + line[6] = src + else: + if trust != 0: + msg("Downgrading trust for coin '{}': {} -> {}".format(sym,trust,0)) + line[6] = 0 - if sym in cls.cross_checks: - if int(line[6]) == 0 and len(cls.cross_checks[sym]) > 1: - msg("Upgrading trust for coin '{}': {} -> {}".format(sym,line[6],1)) - line[6] = 1 + if sym in cls.cross_checks: + if int(line[6]) == 0 and len(cls.cross_checks[sym]) > 1: + msg("Upgrading trust for coin '{}': {} -> {}".format(sym,line[6],1)) + line[6] = 1 print(fs.format(*line)) msg('Processed {} entries'.format(len(data))) @@ -504,7 +507,7 @@ class CoinInfo(object): 'zcash_mini': ('ZEC',), 'keyconv': ( # all supported by vanitygen-plus 'keyconv' util # broken: PIVX - '42','AC','AIB','ANC','ARS','ATMOS','AUR','BLK','BQC','BTC','TEST','BTCD','CCC','CCN','CDN', + '42','AC','AIB','ANC','ARS','ATMOS','AUR','BLK','BQC','BTC','TEST','BTCD','CCC','CCN','CDN', 'CLAM','CNC','CNOTE','CON','CRW','DEEPONION','DGB','DGC','DMD','DOGED','DOGE','DOPE', 'DVC','EFL','EMC','EXCL','FAIR','FLOZ','FTC','GAME','GAP','GCR','GRC','GRS','GUN','HAM','HODL', 'IXC','JBS','LBRY','LEAF','LTC','MMC','MONA','MUE','MYRIAD','MZC','NEOS','NLG','NMC','NVC', diff --git a/mmgen/main.py b/mmgen/main.py index 3ba414eb..281bff0e 100755 --- a/mmgen/main.py +++ b/mmgen/main.py @@ -55,5 +55,7 @@ def launch(what): if os.getenv('MMGEN_TRACEBACK'): raise else: - sys.stderr.write('{!r}\n'.format(e[0])) + try: m = u'{}\n'.format(e[0]) + except: m = u'{!r}\n'.format(e[0]) + sys.stderr.write(m) sys.exit(2) diff --git a/mmgen/protocol.py b/mmgen/protocol.py index 83ba6684..120cb318 100755 --- a/mmgen/protocol.py +++ b/mmgen/protocol.py @@ -326,22 +326,29 @@ class ZcashTestnetProtocol(ZcashProtocol): class CoinProtocol(MMGenObject): coins = { - 'btc': (BitcoinProtocol,BitcoinTestnetProtocol), - 'bch': (BitcoinCashProtocol,BitcoinCashTestnetProtocol), - 'ltc': (LitecoinProtocol,LitecoinTestnetProtocol), - 'eth': (EthereumProtocol,EthereumTestnetProtocol), - 'etc': (EthereumClassicProtocol,EthereumClassicTestnetProtocol), - 'zec': (ZcashProtocol,ZcashTestnetProtocol), + # mainnet testnet trustlevel (None == skip) + 'btc': (BitcoinProtocol,BitcoinTestnetProtocol,None), + 'bch': (BitcoinCashProtocol,BitcoinCashTestnetProtocol,None), + 'ltc': (LitecoinProtocol,LitecoinTestnetProtocol,None), + 'eth': (EthereumProtocol,EthereumTestnetProtocol,2), + 'etc': (EthereumClassicProtocol,EthereumClassicTestnetProtocol,2), + 'zec': (ZcashProtocol,ZcashTestnetProtocol,2), } def __new__(cls,coin,testnet): coin = coin.lower() assert type(testnet) == bool - from mmgen.altcoin import CoinInfo as ci - all_coins = sorted(set([e[1].lower() for e in ci.coin_constants['mainnet']] + cls.coins.keys())) m = "'{}': not a valid coin. Valid choices are {}" - assert coin in cls.coins,m.format(coin,','.join(all_coins)) + assert coin in cls.coins,m.format(coin,','.join(cls.get_valid_coins())) return cls.coins[coin][testnet] + @classmethod + def get_valid_coins(cls,upcase=False): + from mmgen.altcoin import CoinInfo as ci + ret = sorted(set( + [e[1] for e in ci.coin_constants['mainnet'] if e[6] != -1] + + cls.coins.keys())) + return [getattr(e,('lower','upper')[upcase])() for e in ret] + @classmethod def get_base_coin_from_name(cls,name): for proto,foo in cls.coins.values(): @@ -352,9 +359,11 @@ class CoinProtocol(MMGenObject): def init_genonly_altcoins(usr_coin,trust_level=None): from mmgen.altcoin import CoinInfo as ci if trust_level is None: - if not usr_coin or usr_coin.lower() in CoinProtocol.coins: return None + if not usr_coin: return None # BTC + if usr_coin.lower() in CoinProtocol.coins: + return CoinProtocol.coins[usr_coin.lower()][2] usr_coin = usr_coin.upper() - mn_coins = [e[1] for e in ci.coin_constants['mainnet']] + mn_coins = [e[1] for e in ci.coin_constants['mainnet'] if e[6] != -1] if usr_coin not in mn_coins: return None trust_level = ci.coin_constants['mainnet'][mn_coins.index(usr_coin)][6] data = {} diff --git a/scripts/test-release.sh b/scripts/test-release.sh index 9b70f806..7708aa6a 100755 --- a/scripts/test-release.sh +++ b/scripts/test-release.sh @@ -129,7 +129,8 @@ t_alts=( "test/gentest.py --all 2:pycoin $ROUNDS_LOW" "test/gentest.py --all 2:pyethereum $ROUNDS_LOW" - "test/gentest.py --all 2:keyconv $ROUNDS_LOW") + "test/gentest.py --all 2:keyconv $ROUNDS_LOW" + "test/gentest.py --all 2:zcash_mini $ROUNDS_LOW") f_alts='Gen-only altcoin tests completed' diff --git a/test/gentest.py b/test/gentest.py index bb503b46..752187ed 100755 --- a/test/gentest.py +++ b/test/gentest.py @@ -107,7 +107,7 @@ def pycoin_sec2addr(sec): # pycoin/networks/all.py pycoin/networks/legacy_networks.py def init_external_prog(): - global b,b_desc,ext_lib,ext_sec2addr,sp,eth,pcku,PREFIX_TRANSFORMS + global b,b_desc,ext_lib,ext_sec2addr,sp,eth,pcku,PREFIX_TRANSFORMS,addr_type def test_support(k): if b == k: return True if b != 'ext' and b != k: return False @@ -116,8 +116,11 @@ def init_external_prog(): return False if b == 'zcash_mini' or addr_type.name == 'zcash_z': import subprocess as sp + from mmgen.protocol import init_coin ext_sec2addr = zcash_mini_sec2addr ext_lib = 'zcash_mini' + init_coin('zec') + addr_type = MMGenAddrType('Z') elif test_support('pyethereum'): try: import ethereum.utils as eth @@ -277,11 +280,11 @@ ag = AddrGenerator(addr_type) if a and b: if opt.all: - from mmgen.protocol import init_coin,init_genonly_altcoins + from mmgen.protocol import init_coin,init_genonly_altcoins,CoinProtocol init_genonly_altcoins('btc',trust_level=0) - mmgen_supported = [e[1] for e in ci.coin_constants['mainnet']] + mmgen_supported = CoinProtocol.get_valid_coins(upcase=True) for coin in ci.external_tests[('mainnet','testnet')[g.testnet]][ext_lib]: - if coin not in mmgen_supported and ext_lib != 'pyethereum': continue + if coin not in mmgen_supported: continue init_coin(coin) tmp_addr_type = addr_type if addr_type in g.proto.mmtypes else MMGenAddrType(g.proto.dfl_mmtype) kg_a = KeyGenerator(tmp_addr_type,a)