Browse Source

simplify get_private_key, use base58

283
thomasv 12 years ago
parent
commit
76439beec5
  1. 6
      electrum
  2. 4
      lib/gui_qt.py
  3. 36
      lib/wallet.py

6
electrum

@ -561,7 +561,7 @@ if __name__ == '__main__':
else: b=''
m_addr = "%34s"%addr
if options.show_keys:
m_addr += ':' + str(wallet.get_private_key_base58(addr, password))
m_addr += ':' + str(wallet.get_private_key(addr, password))
print_msg(flags, m_addr, b, label)
if cmd == 'history':
@ -703,7 +703,7 @@ if __name__ == '__main__':
elif cmd == 'dumpprivkey':
addr = args[1]
sec = wallet.get_private_key_base58(addr, password)
sec = wallet.get_private_key(addr, password)
print_msg( sec )
@ -770,7 +770,7 @@ if __name__ == '__main__':
if not private_keys:
for txin in tx.inputs:
addr = txin['address']
private_keys[addr] = wallet.get_private_key_base58(addr, password)
private_keys[addr] = wallet.get_private_key(addr, password)
else:
pk = {}
for sec in private_keys:

4
lib/gui_qt.py

@ -1456,7 +1456,7 @@ class ElectrumWindow(QMainWindow):
password = None
try:
pk = self.wallet.get_private_key_base58(address, password)
pk = self.wallet.get_private_key(address, password)
except BaseException, e:
self.show_message(str(e))
return
@ -1748,7 +1748,7 @@ class ElectrumWindow(QMainWindow):
for addr in self.wallet.all_addresses():
m_addr = "%34s"%addr
transaction.writerow([m_addr, str(self.wallet.get_private_key_base58(addr, password))])
transaction.writerow([m_addr, str(self.wallet.get_private_key(addr, password))])
self.show_message(_("Private keys exported."))

36
lib/wallet.py

@ -174,23 +174,14 @@ class Wallet:
def get_sequence(self,n,for_change):
return string_to_number( Hash( "%d:%d:"%(n,for_change) + self.master_public_key.decode('hex') ) )
def get_private_key_base58(self, address, password):
secexp, compressed = self.get_private_key(address, password)
if secexp is None: return None
pk = number_to_string( secexp, generator_secp256k1.order() )
return SecretToASecret( pk, compressed )
def get_private_key(self, address, password):
""" Privatekey(type,n) = Master_private_key + H(n|S|type) """
order = generator_secp256k1.order()
# decode seed in any case, in order to make test the password
seed = self.decode_seed(password)
if address in self.imported_keys.keys():
sec = self.pw_decode( self.imported_keys[address], password )
if not sec: return None, None
pkey = regenerate_key(sec)
compressed = is_compressed(sec)
secexp = pkey.secret
return self.pw_decode( self.imported_keys[address], password )
else:
if address in self.addresses:
n = self.addresses.index(address)
@ -201,23 +192,16 @@ class Wallet:
else:
raise BaseException("unknown address", address)
seed = self.pw_decode( self.seed, password)
if not seed: return None
order = generator_secp256k1.order()
secexp = self.stretch_key(seed)
secexp = ( secexp + self.get_sequence(n,for_change) ) % order
pk = number_to_string( secexp, generator_secp256k1.order() )
compressed = False
pkey = EC_KEY(secexp)
public_key = GetPubKey(pkey.pubkey, compressed)
addr = public_key_to_bc_address(public_key)
if addr != address:
print_error('Invalid password with correct decoding')
raise BaseException('Invalid password')
return SecretToASecret( pk, compressed )
return secexp, compressed
def sign_message(self, address, message, password):
sec = self.get_private_key_base58(address, password)
sec = self.get_private_key(address, password)
key = regenerate_key(sec)
compressed = is_compressed(sec)
return key.sign_message(message, compressed, address)
@ -762,7 +746,7 @@ class Wallet:
private_keys = {}
for txin in tx.inputs:
addr = txin['address']
sec = self.get_private_key_base58(addr, password)
sec = self.get_private_key(addr, password)
private_keys[addr] = sec
tx.sign(private_keys)
return str(tx)

Loading…
Cancel
Save