replace global variable 'subseeds' with SubSeedList.dfl_len

This commit is contained in:
The MMGen Project 2022-01-19 11:43:53 +00:00
commit 523a8cc5c3
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
12 changed files with 51 additions and 22 deletions

View file

@ -1 +1 @@
13.1.dev004
13.1.dev005

View file

@ -158,7 +158,7 @@ class GlobalContext(Lockable):
'minconf','usr_randchars','debug','quiet','tx_confs','tx_fee_adj' )
# user opt sets global var:
opt_sets_global = ( 'subseeds','cached_balances' )
opt_sets_global = ( 'cached_balances', )
# 'long' opts - opt sets global var
common_opts = (
@ -249,6 +249,7 @@ class GlobalContext(Lockable):
auto_typeset_opts = {
'seed_len': int,
'subseeds': int,
}
min_screen_width = 80
@ -262,7 +263,6 @@ class GlobalContext(Lockable):
min_urandchars = 10
scramble_hash_rounds = 10
subseeds = 100
salt_len = 16
aesctr_iv_len = 16

View file

@ -39,6 +39,10 @@ def help_notes_func(proto,po,k):
class help_notes:
def dfl_subseeds():
from .subseed import SubSeedList
return str(SubSeedList.dfl_len)
def dfl_seed_len():
from .seed import Seed
return str(Seed.dfl_len)

View file

@ -100,7 +100,7 @@ FMT CODES:
coin_id=help_notes('coin_id'),
fu=help_notes('rel_fee_desc'),
fl=help_notes('fee_spec_letters'),
ss=g.subseeds,
ss=help_notes('dfl_subseeds'),
ss_max=SubSeedIdxRange.max_idx,
fe_all=fmt_list(g.autoset_opts['fee_estimate_mode'].choices,fmt='no_spc'),
fe_dfl=g.autoset_opts['fee_estimate_mode'].choices[0],

View file

@ -86,7 +86,7 @@ FMT CODES:
kgs=help_notes('keygen_backends'),
coin_id=help_notes('coin_id'),
dsl=help_notes('dfl_seed_len'),
ss=g.subseeds,
ss=help_notes('dfl_subseeds'),
ss_max=SubSeedIdxRange.max_idx,
cu=proto.coin),
'notes': lambda help_notes,s: s.format(

View file

@ -509,6 +509,12 @@ def check_usr_opts(usr_opts): # Raises an exception if any check fails
chk_hidden_incog_output_params = chk_hidden_incog_input_params
def chk_subseeds(key,val,desc):
from .subseed import SubSeedIdxRange
opt_is_int(val,desc)
opt_compares(int(val),'>=',SubSeedIdxRange.min_idx,desc)
opt_compares(int(val),'<=',SubSeedIdxRange.max_idx,desc)
def chk_seed_len(key,val,desc):
from .seed import Seed
opt_is_int(val,desc)

View file

@ -56,7 +56,7 @@ class SeedBase(MMGenObject):
data = ImmutableAttr(bytes,typeconv=False)
sid = ImmutableAttr(SeedID,typeconv=False)
def __init__(self,seed_bin=None):
def __init__(self,seed_bin=None,nSubseeds=None):
if not seed_bin:
from .opts import opt
from .crypto import get_random
@ -68,6 +68,7 @@ class SeedBase(MMGenObject):
self.data = seed_bin
self.sid = SeedID(seed=self)
self.nSubseeds = nSubseeds # will override opt.subseeds
@property
def bitlen(self):
@ -91,7 +92,10 @@ class Seed(SeedBase):
def subseeds(self):
if not hasattr(self,'_subseeds'):
from .subseed import SubSeedList
self._subseeds = SubSeedList(self)
from .opts import opt
self._subseeds = SubSeedList(
self,
length = self.nSubseeds or getattr(opt,'subseeds',None) )
return self._subseeds
def subseed(self,*args,**kwargs):

View file

@ -20,6 +20,8 @@
seedsplit.py: Seed split classes and methods for the MMGen suite
"""
from .globalvars import g
from .color import yellow
from .exception import RangeError
from .obj import MMGenPWIDString,MMGenIdx
from .subseed import *
@ -69,6 +71,7 @@ class SeedShareList(SubSeedList):
self.parent_seed = parent_seed
self.id_str = id_str or 'default'
self.count = count
self.len = 2 # placeholder, always overridden
def make_master_share():
for nonce in range(SeedShare.max_nonce+1):

View file

@ -20,7 +20,6 @@
subseed.py: Subseed classes and methods for the MMGen suite
"""
from .common import *
from .color import green
from .util import msg_r,msg,qmsg
from .exception import SubSeedNonceRangeExceeded
@ -81,11 +80,13 @@ class SubSeedList(MMGenObject):
have_short = True
nonce_start = 0
debug_last_share_sid_len = 3
dfl_len = 100
def __init__(self,parent_seed):
def __init__(self,parent_seed,length=None):
self.member_type = SubSeed
self.parent_seed = parent_seed
self.data = { 'long': IndexedDict(), 'short': IndexedDict() }
self.len = length or self.dfl_len
def __len__(self):
return len(self.data['long'])
@ -135,7 +136,7 @@ class SubSeedList(MMGenObject):
))
if last_idx == None:
last_idx = g.subseeds
last_idx = self.len
subseed = get_existing_subseed_by_seed_id(sid)
if subseed:
@ -170,7 +171,7 @@ class SubSeedList(MMGenObject):
def _generate(self,last_idx=None,last_sid=None):
if last_idx == None:
last_idx = g.subseeds
last_idx = self.len
first_idx = len(self) + 1
@ -184,6 +185,7 @@ class SubSeedList(MMGenObject):
for nonce in range(self.nonce_start,self.member_type.max_nonce+1): # handle SeedID collisions
sid = make_chksum_8(self.member_type.make_subseed_bin(self,idx,nonce,length))
if sid in self.data['long'] or sid in self.data['short'] or sid == self.parent_seed.sid:
from .globalvars import g
if g.debug_subseed: # should get ≈450 collisions for first 1,000,000 subseeds
self._collision_debug_msg(sid,idx,nonce)
else:

View file

@ -24,6 +24,7 @@ from .protocol import hash160
from .common import *
from .crypto import get_random
from .key import PrivKey
from .subseed import SubSeedList
from .seedsplit import MasterShareIdx
from .addr import *
from .addrlist import AddrList,KeyAddrList
@ -851,7 +852,7 @@ class MMGenToolCmdWallet(MMGenToolCmds):
from .wallet import Wallet
return Wallet(sf).seed.subseed(subseed_idx).sid
def get_subseed_by_seed_id(self,seed_id:str,wallet='',last_idx=g.subseeds):
def get_subseed_by_seed_id(self,seed_id:str,wallet='',last_idx=SubSeedList.dfl_len):
"get the Subseed Index of a single subseed by Seed ID for default or specified wallet"
opt.quiet = True
sf = get_seed_file([wallet] if wallet else [],1)

View file

@ -67,7 +67,7 @@ tests = {
('3',(3,3)),
((3,5),(3,5)),
('1-2',(1,2)),
(str(g.subseeds),(g.subseeds,g.subseeds)),
(str(SubSeedList.dfl_len),(SubSeedList.dfl_len,SubSeedList.dfl_len)),
(str(SubSeedIdxRange.max_idx),(SubSeedIdxRange.max_idx,SubSeedIdxRange.max_idx)),
)
},

View file

@ -9,7 +9,9 @@ class unit_test(object):
def run_test(self,name,ut):
from mmgen.seed import Seed
from mmgen.subseed import SubSeedIdxRange
from mmgen.subseed import SubSeedList,SubSeedIdxRange
nSubseeds = SubSeedList.dfl_len
def basic_ops():
msg_r('Testing basic ops...')
@ -55,9 +57,9 @@ class unit_test(object):
assert seed.pfmt() == seed2.pfmt()
s = seed.subseeds.format(1,g.subseeds)
s = seed.subseeds.format(1,nSubseeds)
s_lines = s.strip().split('\n')
assert len(s_lines) == g.subseeds + 4, s
assert len(s_lines) == nSubseeds + 4, s
a = seed.subseed('2L').sid
b = [e for e in s_lines if ' 2L:' in e][0].strip().split()[1]
@ -70,11 +72,11 @@ class unit_test(object):
b = [e for e in s_lines if ' 5S:' in e][0].strip().split()[3]
assert a == b, b
s = seed.subseeds.format(g.subseeds+1,g.subseeds+2)
s = seed.subseeds.format(nSubseeds+1,nSubseeds+2)
s_lines = s.strip().split('\n')
assert len(s_lines) == 6, s
ss_idx = str(g.subseeds+2) + 'S'
ss_idx = str(nSubseeds+2) + 'S'
a = seed.subseed(ss_idx).sid
b = [e for e in s_lines if f' {ss_idx}:' in e][0].strip().split()[3]
assert a == b, b
@ -91,17 +93,24 @@ class unit_test(object):
msg_r('Testing defaults and limits...')
seed_bin = bytes.fromhex('deadbeef' * 8)
seed = Seed(seed_bin,nSubseeds=11)
seed.subseeds._generate()
ss = seed.subseeds
assert len(ss.data['long']) == len(ss.data['short']), len(ss.data['short'])
assert len(ss) == 11, len(ss)
seed = Seed(seed_bin)
seed.subseeds._generate()
ss = seed.subseeds
assert len(ss.data['long']) == len(ss.data['short']), len(ss.data['short'])
assert len(ss) == g.subseeds, len(ss)
assert len(ss) == nSubseeds, len(ss)
seed = Seed(seed_bin)
seed.subseed_by_seed_id('EEEEEEEE')
ss = seed.subseeds
assert len(ss.data['long']) == len(ss.data['short']), len(ss.data['short'])
assert len(ss) == g.subseeds, len(ss)
assert len(ss) == nSubseeds, len(ss)
seed = Seed(seed_bin)
subseed = seed.subseed_by_seed_id('803B165C')
@ -135,8 +144,8 @@ class unit_test(object):
r = SubSeedIdxRange('3-3')
assert r.items == [3], r.items
r = SubSeedIdxRange(f'{g.subseeds-1}-{g.subseeds}')
assert r.items == [g.subseeds-1,g.subseeds], r.items
r = SubSeedIdxRange(f'{nSubseeds-1}-{nSubseeds}')
assert r.items == [nSubseeds-1,nSubseeds], r.items
for n,e in enumerate(SubSeedIdxRange('1-5').iterate(),1):
assert n == e, e