def __init__( self, host: str, port: int, public_key: Optional[str] = None, multihash_id: Optional[str] = None, ): """ Initialize a multiaddress. :param host: ip host of the address :param port: port number of the address :param public_key: hex encoded public key. Must conform to Bitcoin EC encoding standard for Secp256k1 :param multihash_id: a multihash of the public key """ self._host = host self._port = port if public_key is not None: try: VerifyingKey._from_compressed(_hex_to_bytes(public_key), curves.SECP256k1) except keys.MalformedPointError as e: # pragma: no cover raise ValueError("Malformed public key '{}': {}".format( public_key, str(e))) self._public_key = public_key self._peerid = self.compute_peerid(self._public_key) elif multihash_id is not None: try: multihash.decode(base58.b58decode(multihash_id)) except Exception as e: raise ValueError("Malformed multihash '{}': {}".format( multihash_id, str(e))) self._public_key = "" self._peerid = multihash_id else: raise ValueError( # pragma: no cover "MultiAddr requires either public_key or multihash_id to be provided." )