def from_bytes(cidbytes): """ Creates a CID object from a encoded form :param bytes cidbytes: can be - base58-encoded multihash - multihash - multibase-encoded multihash :return: a CID object :rtype: :py:class:`cid.CIDv0` or :py:class:`cid.CIDv1` """ if multibase.is_encoded(cidbytes): # if the bytestream is multibase encoded cid = multibase.decode(cidbytes) data = cid[1:] version = int(cid[0]) codec = multicodec.get_codec(data) multihash = multicodec.remove_prefix(data) return make_cid(version, codec, multihash) elif cidbytes[0] in (0, 1): # if the bytestream is a CID version = cidbytes[0] data = cidbytes[1:] codec = multicodec.get_codec(data) multihash = multicodec.remove_prefix(data) return make_cid(version, codec, multihash) else: # otherwise its just base58-encoded multihash return make_cid(0, CIDv0.CODEC, base58.b58decode(cidbytes))
def from_bytes(cidbytes): """ Creates a CID object from a encoded form :param bytes cidbytes: can be - base58-encoded multihash - multihash - multibase-encoded multihash :return: a CID object :rtype: :py:class:`cid.CIDv0` or :py:class:`cid.CIDv1` :raises: `ValueError` if the base58-encoded string is not a valid string :raises: `ValueError` if the length of the argument is zero :raises: `ValueError` if the length of decoded CID is invalid """ if len(cidbytes) < 2: raise ValueError('argument length can not be zero') # first byte for identity multibase and CIDv0 is 0x00 # putting in assumption that multibase for CIDv0 can not be identity # refer: https://github.com/ipld/cid/issues/13#issuecomment-326490275 if cidbytes[0] != 0 and multibase.is_encoded(cidbytes): # if the bytestream is multibase encoded cid = multibase.decode(cidbytes) if len(cid) < 2: raise ValueError('cid length is invalid') data = cid[1:] version = int(cid[0]) codec = multicodec.get_codec(data) multihash = multicodec.remove_prefix(data) elif cidbytes[0] in (0, 1): # if the bytestream is a CID version = cidbytes[0] data = cidbytes[1:] codec = multicodec.get_codec(data) multihash = multicodec.remove_prefix(data) else: # otherwise its just base58-encoded multihash try: version = 0 codec = CIDv0.CODEC multihash = base58.b58decode(cidbytes) except ValueError: raise ValueError( 'multihash is not a valid base58 encoded multihash') try: mh.decode(multihash) except ValueError: raise return make_cid(version, codec, multihash)
def from_bytes(cidbytes): """ Creates a CID object from a encoded form :param bytes cidbytes: can be - base58-encoded multihash - multihash - multibase-encoded multihash :return: a CID object :rtype: :py:class:`cid.CIDv0` or :py:class:`cid.CIDv1` :raises: `ValueError` if the base58-encoded string is not a valid string """ if multibase.is_encoded(cidbytes): # if the bytestream is multibase encoded cid = multibase.decode(cidbytes) data = cid[1:] version = int(cid[0]) codec = multicodec.get_codec(data) multihash = multicodec.remove_prefix(data) elif cidbytes[0] in (b'0', b'1'): # if the bytestream is a CID version = cidbytes[0] data = cidbytes[1:] codec = multicodec.get_codec(data) multihash = multicodec.remove_prefix(data) else: # otherwise its just base58-encoded multihash try: version = 0 codec = CIDv0.CODEC multihash = base58.b58decode(cidbytes) except ValueError: raise ValueError( 'multihash is not a valid base58 encoded multihash') try: mh.decode(multihash) except ValueError: raise return make_cid(version, codec, multihash)
def test_is_encoded_incorrect_encoding(encoded_data): assert not is_encoded(encoded_data)
def test_is_encoded(_, data, encoded_data): assert is_encoded(encoded_data) assert not is_encoded(data)