replace global variable 'subseeds' with SubSeedList.dfl_len
This commit is contained in:
parent
54e9799989
commit
523a8cc5c3
12 changed files with 51 additions and 22 deletions
|
|
@ -1 +1 @@
|
|||
13.1.dev004
|
||||
13.1.dev005
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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],
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)),
|
||||
)
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue