diff --git a/pybtc/hdwallet.py b/pybtc/hdwallet.py index b7d199e..4d48360 100644 --- a/pybtc/hdwallet.py +++ b/pybtc/hdwallet.py @@ -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: