@staticmethod
def from_bytes(b):
    ' Generates either a HDPrivateKey or HDPublicKey from the underlying\n        bytes.\n\n        The serialization must conform to the description in:\n        https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#serialization-format\n\n        Args:\n            b (bytes): A byte stream conforming to the above.\n\n        Returns:\n            HDPrivateKey or HDPublicKey:\n                Either an HD private or\n                public key object, depending on what was serialized.\n        '
    if (len(b) < 78):
        raise ValueError('b must be at least 78 bytes long.')
    version = int.from_bytes(b[:4], 'big')
    depth = b[4]
    parent_fingerprint = b[5:9]
    index = int.from_bytes(b[9:13], 'big')
    chain_code = b[13:45]
    key_bytes = b[45:78]
    rv = None
    if ((version == HDPrivateKey.MAINNET_VERSION) or (version == HDPrivateKey.TESTNET_VERSION)):
        if (key_bytes[0] != 0):
            raise ValueError('First byte of private key must be 0x00!')
        private_key = int.from_bytes(key_bytes[1:], 'big')
        rv = HDPrivateKey(key=private_key, chain_code=chain_code, index=index, depth=depth, parent_fingerprint=parent_fingerprint)
    elif ((version == HDPublicKey.MAINNET_VERSION) or (version == HDPublicKey.TESTNET_VERSION)):
        if ((key_bytes[0] != 2) and (key_bytes[0] != 3)):
            raise ValueError('First byte of public key must be 0x02 or 0x03!')
        public_key = PublicKey.from_bytes(key_bytes)
        rv = HDPublicKey(x=public_key.point.x, y=public_key.point.y, chain_code=chain_code, index=index, depth=depth, parent_fingerprint=parent_fingerprint)
    else:
        raise ValueError('incorrect encoding.')
    return rv
Generates either a HDPrivateKey or HDPublicKey from the underlying
bytes.

The serialization must conform to the description in:
https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#serialization-format

Args:
    b (bytes): A byte stream conforming to the above.

Returns:
    HDPrivateKey or HDPublicKey:
        Either an HD private or
        public key object, depending on what was serialized.
@staticmethod
def from_bytes(b):
    ' Generates either a HDPrivateKey or HDPublicKey from the underlying\n        bytes.\n\n        The serialization must conform to the description in:\n        https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#serialization-format\n\n        Args:\n            b (bytes): A byte stream conforming to the above.\n\n        Returns:\n            HDPrivateKey or HDPublicKey:\n                Either an HD private or\n                public key object, depending on what was serialized.\n        '
    if (len(b) < 78):
        raise ValueError('b must be at least 78 bytes long.')
    version = int.from_bytes(b[:4], 'big')
    depth = b[4]
    parent_fingerprint = b[5:9]
    index = int.from_bytes(b[9:13], 'big')
    chain_code = b[13:45]
    key_bytes = b[45:78]
    rv = None
    if ((version == HDPrivateKey.MAINNET_VERSION) or (version == HDPrivateKey.TESTNET_VERSION)):
        if (key_bytes[0] != 0):
            raise ValueError('First byte of private key must be 0x00!')
        private_key = int.from_bytes(key_bytes[1:], 'big')
        rv = HDPrivateKey(key=private_key, chain_code=chain_code, index=index, depth=depth, parent_fingerprint=parent_fingerprint)
    elif ((version == HDPublicKey.MAINNET_VERSION) or (version == HDPublicKey.TESTNET_VERSION)):
        if ((key_bytes[0] != 2) and (key_bytes[0] != 3)):
            raise ValueError('First byte of public key must be 0x02 or 0x03!')
        public_key = PublicKey.from_bytes(key_bytes)
        rv = HDPublicKey(x=public_key.point.x, y=public_key.point.y, chain_code=chain_code, index=index, depth=depth, parent_fingerprint=parent_fingerprint)
    else:
        raise ValueError('incorrect encoding.')
    return rv