electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 1a8428647f7064ff6ea9db3175c05274c9e8c6db
parent 27cc09e8e229e4e55ebf5ae010803bd4730da841
Author: ThomasV <thomasv@gitorious>
Date:   Tue,  1 Oct 2013 13:40:22 +0200

don't create all master public keys on wallet creation

Diffstat:
Mlib/wallet.py | 69+++++++++++++++++++++++++++++++++++++--------------------------------
1 file changed, 37 insertions(+), 32 deletions(-)

diff --git a/lib/wallet.py b/lib/wallet.py @@ -271,44 +271,47 @@ class Wallet: self.storage.put('master_public_keys', self.master_public_keys, True) 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) - - # normal accounts - k0, c0, K0, cK0 = bip32_private_derivation(master_k, master_c, "m/", "m/0'/") - # p2sh 2of2 - k1, c1, K1, cK1 = bip32_private_derivation(master_k, master_c, "m/", "m/1'/") - k2, c2, K2, cK2 = bip32_private_derivation(master_k, master_c, "m/", "m/2'/") - # p2sh 2of3 - k3, c3, K3, cK3 = bip32_private_derivation(master_k, master_c, "m/", "m/3'/") - k4, c4, K4, cK4 = bip32_private_derivation(master_k, master_c, "m/", "m/4'/") - k5, c5, K5, cK5 = bip32_private_derivation(master_k, master_c, "m/", "m/5'/") + if account_type == '1': + k0, c0, K0, cK0 = bip32_private_derivation(master_k, master_c, "m/", "m/0'/") + self.master_public_keys["m/0'/"] = (c0, K0, cK0) + self.master_private_keys["m/0'/"] = k0 + elif account_type == '2of2': + k1, c1, K1, cK1 = bip32_private_derivation(master_k, master_c, "m/", "m/1'/") + k2, c2, K2, cK2 = bip32_private_derivation(master_k, master_c, "m/", "m/2'/") + self.master_public_keys["m/1'/"] = (c1, K1, cK1) + self.master_public_keys["m/2'/"] = (c2, K2, cK2) + self.master_private_keys["m/1'/"] = k1 + self.master_private_keys["m/2'/"] = k2 + elif account_type == '2of3': + k3, c3, K3, cK3 = bip32_private_derivation(master_k, master_c, "m/", "m/3'/") + k4, c4, K4, cK4 = bip32_private_derivation(master_k, master_c, "m/", "m/4'/") + k5, c5, K5, cK5 = bip32_private_derivation(master_k, master_c, "m/", "m/5'/") + self.master_public_keys["m/3'/"] = (c3, K3, cK3) + self.master_public_keys["m/4'/"] = (c4, K4, cK4) + 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["m/5'/"] = k5 - self.master_public_keys = { - "m/0'/": (c0, K0, cK0), - "m/1'/": (c1, K1, cK1), - "m/2'/": (c2, K2, cK2), - "m/3'/": (c3, K3, cK3), - "m/4'/": (c4, K4, cK4), - "m/5'/": (c5, K5, cK5) - } - - self.master_private_keys = { - "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_private_keys', self.master_private_keys, True) - # create default account - self.create_account('1','Main account') - + def has_master_public_keys(self, account_type): + 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): for key, v in self.master_public_keys.items(): @@ -764,6 +767,8 @@ class Wallet: def create_pending_accounts(self): for account_type in ['1','2of2','2of3']: + if not self.has_master_public_keys(account_type): + continue a = self.new_account_address(account_type) if self.address_is_old(a): print_error( "creating account", a )