From 797d5cfe034d7f65843a181bb6873529f9821842 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Thu, 4 Jun 2020 12:40:17 +0000 Subject: [PATCH] tool.py: remove global vars at,kg,ag --- mmgen/tool.py | 68 ++++++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/mmgen/tool.py b/mmgen/tool.py index 0d65da6a..721d7937 100755 --- a/mmgen/tool.py +++ b/mmgen/tool.py @@ -20,6 +20,7 @@ tool.py: Routines for the 'mmgen-tool' utility """ +from collections import namedtuple from .protocol import hash160 from .common import * from .crypto import * @@ -277,13 +278,21 @@ class MMGenToolCmds(metaclass=MMGenToolCmdMeta): self.proto.tokensym = g.token.upper() def init_generators(self,arg=None): - global at,kg,ag + gd = namedtuple('generator_data',['at','kg','ag']) + at = MMGenAddrType( proto = self.proto, id_str = self.mmtype ) - if arg != 'at': - kg = KeyGenerator(self.proto,at) - ag = AddrGenerator(self.proto,at) + + if arg == 'addrtype_only': + return gd(at,None,None) + else: + return gd( + at, + KeyGenerator(self.proto,at), + AddrGenerator(self.proto,at), + ) + class MMGenToolCmdMisc(MMGenToolCmds): "miscellaneous commands" @@ -417,22 +426,22 @@ class MMGenToolCmdCoin(MMGenToolCmds): """ def randwif(self): "generate a random private key in WIF format" - self.init_generators('at') + gd = self.init_generators('addrtype_only') return PrivKey( self.proto, get_random(32), - pubkey_type = at.pubkey_type, - compressed = at.compressed ).wif + pubkey_type = gd.at.pubkey_type, + compressed = gd.at.compressed ).wif def randpair(self): "generate a random private key/address pair" - self.init_generators() + gd = self.init_generators() privhex = PrivKey( self.proto, get_random(32), - pubkey_type = at.pubkey_type, - compressed = at.compressed ) - addr = ag.to_addr(kg.to_pubhex(privhex)) + pubkey_type = gd.at.pubkey_type, + compressed = gd.at.compressed ) + addr = gd.ag.to_addr(gd.kg.to_pubhex(privhex)) return (privhex.wif,addr) def wif2hex(self,wifkey:'sstr'): @@ -443,52 +452,52 @@ class MMGenToolCmdCoin(MMGenToolCmds): def hex2wif(self,privhex:'sstr'): "convert a private key from hex to WIF format" - self.init_generators('at') + gd = self.init_generators('addrtype_only') return PrivKey( self.proto, bytes.fromhex(privhex), - pubkey_type = at.pubkey_type, - compressed = at.compressed ).wif + pubkey_type = gd.at.pubkey_type, + compressed = gd.at.compressed ).wif def wif2addr(self,wifkey:'sstr'): "generate a coin address from a key in WIF format" - self.init_generators() + gd = self.init_generators() privhex = PrivKey( self.proto, wif = wifkey ) - addr = ag.to_addr(kg.to_pubhex(privhex)) + addr = gd.ag.to_addr(gd.kg.to_pubhex(privhex)) return addr def wif2redeem_script(self,wifkey:'sstr'): # new "convert a WIF private key to a Segwit P2SH-P2WPKH redeem script" assert self.mmtype == 'segwit','This command is meaningful only for --type=segwit' - self.init_generators() + gd = self.init_generators() privhex = PrivKey( self.proto, wif = wifkey ) - return ag.to_segwit_redeem_script(kg.to_pubhex(privhex)) + return gd.ag.to_segwit_redeem_script(gd.kg.to_pubhex(privhex)) def wif2segwit_pair(self,wifkey:'sstr'): "generate both a Segwit P2SH-P2WPKH redeem script and address from WIF" assert self.mmtype == 'segwit','This command is meaningful only for --type=segwit' - self.init_generators() - pubhex = kg.to_pubhex(PrivKey( + gd = self.init_generators() + pubhex = gd.kg.to_pubhex(PrivKey( self.proto, wif = wifkey )) - addr = ag.to_addr(pubhex) - rs = ag.to_segwit_redeem_script(pubhex) + addr = gd.ag.to_addr(pubhex) + rs = gd.ag.to_segwit_redeem_script(pubhex) return (rs,addr) def privhex2addr(self,privhex:'sstr',output_pubhex=False): "generate coin address from raw private key data in hexadecimal format" - self.init_generators() + gd = self.init_generators() pk = PrivKey( self.proto, bytes.fromhex(privhex), - compressed = at.compressed, - pubkey_type = at.pubkey_type ) - ph = kg.to_pubhex(pk) - return ph if output_pubhex else ag.to_addr(ph) + compressed = gd.at.compressed, + pubkey_type = gd.at.pubkey_type ) + ph = gd.kg.to_pubhex(pk) + return ph if output_pubhex else gd.ag.to_addr(ph) def privhex2pubhex(self,privhex:'sstr'): # new "generate a hex public key from a hex private key" @@ -518,8 +527,8 @@ class MMGenToolCmdCoin(MMGenToolCmds): if self.mmtype == 'bech32': return self.proto.pubhash2bech32addr(pubhashhex) else: - self.init_generators('at') - return self.proto.pubhash2addr(pubhashhex,at.addr_fmt=='p2sh') + gd = self.init_generators('addrtype_only') + return self.proto.pubhash2addr(pubhashhex,gd.at.addr_fmt=='p2sh') def addr2pubhash(self,addr:'sstr'): "convert coin address to public key hash" @@ -1156,7 +1165,6 @@ class MMGenToolCmdMonero(MMGenToolCmds): bals = {} # locked,unlocked - from collections import namedtuple wo = namedtuple('mwo',['name','desc','action','func','accept_defaults']) op = { # reusing name! 'create': wo('create', 'Creat', 'Generat', create, False),