implemented function xkey_to_public_key (BIP0032/BIP0044) & renamed functions

This commit is contained in:
Alexey Karyabkin 2018-06-19 18:55:16 +04:00
parent 083fac3e51
commit 936f1e6fb4

View File

@ -104,7 +104,7 @@ def create_xmaster_key(seed, testnet=False):
intermediary = hmac_sha512(key, seed)
mkey = intermediary[:32]
chain_code = intermediary[32:]
if is_validate_private_key(mkey) and is_validate_private_key(chain_code):
if is_valid_private_key(mkey) and is_valid_private_key(chain_code):
return dict(version=version,
key=mkey,
depth=0,
@ -168,7 +168,7 @@ def derive_xkey(seed, *path_level, bip44=True, testnet=True, wif=True):
def xprivate_to_xpublic_key(xprv, encode_b58=True):
if is_validate_private_key(xprv):
if is_valid_private_key(xprv):
xprivkey = deserialize_xkey(xprv)
xpubkey = create_xpublic_key(xprivkey)
if encode_b58:
@ -181,7 +181,7 @@ def xprivate_to_xpublic_key(xprv, encode_b58=True):
# получение из расширенного приватного ключа обычный приватный ключ
def xkey_to_private_key(xkey, wif=True, hex=False):
if is_validate_private_key(xkey):
if is_valid_private_key(xkey):
xprivkey = deserialize_xkey(xkey)
privkey = xprivkey['key']
if xprivkey['version'] in TESTNET_PRIVATE_WALLET_VERSION:
@ -198,6 +198,25 @@ def xkey_to_private_key(xkey, wif=True, hex=False):
"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#serialization-format")
# получение из расширенного приватного/публичного ключа обычный публичный ключ
def xkey_to_public_key(xkey, hex=False):
if is_valid_private_key(xkey):
xkey = xprivate_to_xpublic_key(xkey)
if is_valid_public_key(xkey):
xpubkey = deserialize_xkey(xkey)
pubkey = xpubkey['key']
if xpubkey['version'] in TESTNET_PUBLIC_WALLET_VERSION:
testnet = True
else:
testnet = False
if hex:
return hexlify(pubkey).decode()
return pubkey
else:
raise TypeError("Private or public key must be serialized according to BIP-0032 - " \
"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#serialization-format")
# Создание дочернего приватного ключа
def create_child_privkey(key, child_idx):
if key['is_private']:
@ -208,7 +227,7 @@ def create_child_privkey(key, child_idx):
if expanded_privkey:
child_chain_code = expanded_privkey[32:]
child_privkey = add_private_keys(expanded_privkey[:32], key['key'])
if is_validate_private_key(child_privkey):
if is_valid_private_key(child_privkey):
finger_print = hash160(private_to_public_key(key['key']))[:4]
return dict(version=key['version'],
key=child_privkey,
@ -281,7 +300,7 @@ def add_public_keys(ext_value, key):
return None
def is_validate_private_key(key):
def is_valid_private_key(key):
if isinstance(key, bytes):
key_int = int.from_bytes(key, byteorder="big")
if key_int > 0 and key_int < MAX_INT_PRIVATE_KEY and len(key) == 32: