don't create all master public keys on wallet creation

This commit is contained in:
ThomasV 2013-10-01 13:40:22 +02:00
parent 27cc09e8e2
commit 1a8428647f

View file

@ -271,44 +271,47 @@ class Wallet:
self.storage.put('master_public_keys', self.master_public_keys, True) self.storage.put('master_public_keys', self.master_public_keys, True)
self.create_account('1','Main account') self.create_account('1','Main account')
def create_accounts(self): def create_accounts(self):
# create default account
self.create_master_keys('1', self.seed)
self.create_account('1','Main account')
def create_master_keys(self, account_type, seed):
master_k, master_c, master_K, master_cK = bip32_init(self.seed) master_k, master_c, master_K, master_cK = bip32_init(self.seed)
if account_type == '1':
# normal accounts k0, c0, K0, cK0 = bip32_private_derivation(master_k, master_c, "m/", "m/0'/")
k0, c0, K0, cK0 = bip32_private_derivation(master_k, master_c, "m/", "m/0'/") self.master_public_keys["m/0'/"] = (c0, K0, cK0)
# p2sh 2of2 self.master_private_keys["m/0'/"] = k0
k1, c1, K1, cK1 = bip32_private_derivation(master_k, master_c, "m/", "m/1'/") elif account_type == '2of2':
k2, c2, K2, cK2 = bip32_private_derivation(master_k, master_c, "m/", "m/2'/") k1, c1, K1, cK1 = bip32_private_derivation(master_k, master_c, "m/", "m/1'/")
# p2sh 2of3 k2, c2, K2, cK2 = bip32_private_derivation(master_k, master_c, "m/", "m/2'/")
k3, c3, K3, cK3 = bip32_private_derivation(master_k, master_c, "m/", "m/3'/") self.master_public_keys["m/1'/"] = (c1, K1, cK1)
k4, c4, K4, cK4 = bip32_private_derivation(master_k, master_c, "m/", "m/4'/") self.master_public_keys["m/2'/"] = (c2, K2, cK2)
k5, c5, K5, cK5 = bip32_private_derivation(master_k, master_c, "m/", "m/5'/") self.master_private_keys["m/1'/"] = k1
self.master_private_keys["m/2'/"] = k2
self.master_public_keys = { elif account_type == '2of3':
"m/0'/": (c0, K0, cK0), k3, c3, K3, cK3 = bip32_private_derivation(master_k, master_c, "m/", "m/3'/")
"m/1'/": (c1, K1, cK1), k4, c4, K4, cK4 = bip32_private_derivation(master_k, master_c, "m/", "m/4'/")
"m/2'/": (c2, K2, cK2), k5, c5, K5, cK5 = bip32_private_derivation(master_k, master_c, "m/", "m/5'/")
"m/3'/": (c3, K3, cK3), self.master_public_keys["m/3'/"] = (c3, K3, cK3)
"m/4'/": (c4, K4, cK4), self.master_public_keys["m/4'/"] = (c4, K4, cK4)
"m/5'/": (c5, K5, cK5) self.master_public_keys["m/5'/"] = (c5, K5, cK5)
} self.master_private_keys["m/3'/"] = k3
self.master_private_keys["m/4'/"] = k4
self.master_private_keys = { self.master_private_keys["m/5'/"] = k5
"m/0'/": k0,
"m/1'/": k1,
"m/2'/": k2,
"m/3'/": k3,
"m/4'/": k4,
"m/5'/": k5
}
self.storage.put('master_public_keys', self.master_public_keys, True) self.storage.put('master_public_keys', self.master_public_keys, True)
self.storage.put('master_private_keys', self.master_private_keys, True) self.storage.put('master_private_keys', self.master_private_keys, True)
# create default account def has_master_public_keys(self, account_type):
self.create_account('1','Main account') if account_type == '1':
return "m/0'/" in self.master_public_keys
elif account_type == '2of2':
return set(["m/1'/", "m/2'/"]) <= set(self.master_public_keys.keys())
elif account_type == '2of3':
return set(["m/3'/", "m/4'/", "m/5'/"]) <= set(self.master_public_keys.keys())
def find_root_by_master_key(self, c, K): def find_root_by_master_key(self, c, K):
for key, v in self.master_public_keys.items(): for key, v in self.master_public_keys.items():
@ -764,6 +767,8 @@ class Wallet:
def create_pending_accounts(self): def create_pending_accounts(self):
for account_type in ['1','2of2','2of3']: for account_type in ['1','2of2','2of3']:
if not self.has_master_public_keys(account_type):
continue
a = self.new_account_address(account_type) a = self.new_account_address(account_type)
if self.address_is_old(a): if self.address_is_old(a):
print_error( "creating account", a ) print_error( "creating account", a )