From bf87e204411e8378eeb7f2bc52d42ae461d3198e Mon Sep 17 00:00:00 2001 From: ShreyanJain9 Date: Mon, 26 Feb 2024 17:11:07 -0800 Subject: [PATCH 1/2] working Multicodec + CID!! --- config/config.exs | 3 +- lib/hexpds/k256.ex | 2 +- lib/hexpds/multicodec.ex | 77 +++++- multicodec.csv | 541 ++++++++++++++++++++++++++++++++++++++ test/hexpds_cid_test.exs | 257 ++++++++++++++++++ test/hexpds_k256_test.exs | 5 + 6 files changed, 880 insertions(+), 5 deletions(-) create mode 100644 multicodec.csv create mode 100644 test/hexpds_cid_test.exs diff --git a/config/config.exs b/config/config.exs index c478a93..2df0ab1 100644 --- a/config/config.exs +++ b/config/config.exs @@ -7,4 +7,5 @@ config :hexpds, plc_server: "plc.bsky-sandbox.dev", appview_server: "api.bsky-sandbox.dev", relay_server: "bgs.bsky-sandbox.dev", - pds_host: "pds.shreyanjain.net" # ignore pls for now + pds_host: "abyss.computer", # ignore pls for now + multicodec_csv_path: "multicodec.csv" diff --git a/lib/hexpds/k256.ex b/lib/hexpds/k256.ex index 9e3477e..6a839c9 100644 --- a/lib/hexpds/k256.ex +++ b/lib/hexpds/k256.ex @@ -150,7 +150,7 @@ defmodule Hexpds.K256 do (pubkey |> compress() |> Base.decode16!(case: :lower) - |> Hexpds.Multicodec.encode(:"secp256k1-pub") + |> Hexpds.Multicodec.encode!(:"secp256k1-pub") |> Multibase.encode!(:base58_btc)) end end diff --git a/lib/hexpds/multicodec.ex b/lib/hexpds/multicodec.ex index 971515c..1260282 100644 --- a/lib/hexpds/multicodec.ex +++ b/lib/hexpds/multicodec.ex @@ -1,6 +1,77 @@ defmodule Hexpds.Multicodec do - @spec encode(binary(), :"secp256k1-pub") :: binary() - def encode(pubkey, :"secp256k1-pub") do - <<0xE7, 0x01, pubkey::binary>> + use GenServer + + def start_link(multicodec_csv \\ Application.get_env(:hexpds, :multicodec_csv_path)) do + GenServer.start_link(__MODULE__, multicodec_csv, name: __MODULE__) + end + + @impl GenServer + def init(csv_path) do + {:ok, csv} = File.read(csv_path) + {:ok, read_csv(csv)} + end + + @impl GenServer + def handle_call(:multicodec_map, _from, state) do + {:reply, state, state} + end + + def read_csv(csv) do + csv + |> String.split("\n", trim: true) + |> Stream.map(&String.replace(&1, " ", "")) + |> Stream.map(&String.split(&1, ",", trim: true)) + |> Enum.reduce(%{}, fn [name, _tag, "0x" <> code, _status], acc -> + Map.put(acc, String.to_atom(name), Integer.parse(code, 16) |> elem(0)) + end) + end + + def multicodec_map() do + GenServer.call(__MODULE__, :multicodec_map) + end + + def bytes_to_codec() do + for {codec, bytes} <- multicodec_map(), into: %{} do + {bytes, codec} + end + end + + def encode!(bytes, "" <> codec) do + <> + end + + def encode!(bytes, codec) do + encode!(bytes, to_string(codec)) + end + + @spec encode(binary(), String.t() | atom()) :: + {:error, any()} | {:ok, binary()} + def encode(b, c) do + try do + {:ok, encode!(b, c)} + catch + _, e -> {:error, e} + end + end + + def codec_decode("" <> encoded) do + try do + with {prefix, rest} <- Varint.LEB128.decode(<>), + codec <- bytes_to_codec()[prefix], + do: {:ok, {rest, to_string(codec)}} + catch + _, e -> {:error, e} + end + end + + @spec codec?(binary()) :: boolean() + def codec?("" <> codec) do + Map.has_key?(multicodec_map(), String.to_atom(codec)) + end + + def codecs do + multicodec_map() + |> Map.keys() + |> Enum.map(&to_string/1) end end diff --git a/multicodec.csv b/multicodec.csv new file mode 100644 index 0000000..e1e1f5c --- /dev/null +++ b/multicodec.csv @@ -0,0 +1,541 @@ +name, tag, 0x00 code, status +identity, multihash, 0x00, permanent +cidv1, cid, 0x01, permanent +cidv2, cid, 0x02, draft +cidv3, cid, 0x03, draft +ip4, multiaddr, 0x04, permanent +tcp, multiaddr, 0x06, permanent +sha1, multihash, 0x11, permanent +sha2-256, multihash, 0x12, permanent +sha2-512, multihash, 0x13, permanent +sha3-512, multihash, 0x14, permanent +sha3-384, multihash, 0x15, permanent +sha3-256, multihash, 0x16, permanent +sha3-224, multihash, 0x17, permanent +shake-128, multihash, 0x18, draft +shake-256, multihash, 0x19, draft +keccak-224, multihash, 0x1a, draft +keccak-256, multihash, 0x1b, draft +keccak-384, multihash, 0x1c, draft +keccak-512, multihash, 0x1d, draft +blake3, multihash, 0x1e, draft +sha2-384, multihash, 0x20, permanent +dccp, multiaddr, 0x21, draft +murmur3-x64-64, hash, 0x22, permanent +murmur3-32, hash, 0x23, draft +ip6, multiaddr, 0x29, permanent +ip6zone, multiaddr, 0x2a, draft +ipcidr, multiaddr, 0x2b, draft +path, namespace, 0x2f, permanent +multicodec, multiformat, 0x30, draft +multihash, multiformat, 0x31, draft +multiaddr, multiformat, 0x32, draft +multibase, multiformat, 0x33, draft +varsig, multiformat, 0x34, draft +dns, multiaddr, 0x35, permanent +dns4, multiaddr, 0x36, permanent +dns6, multiaddr, 0x37, permanent +dnsaddr, multiaddr, 0x38, permanent +protobuf, serialization, 0x50, draft +cbor, ipld, 0x51, permanent +raw, ipld, 0x55, permanent +dbl-sha2-256, multihash, 0x56, draft +rlp, serialization, 0x60, draft +bencode, serialization, 0x63, draft +dag-pb, ipld, 0x70, permanent +dag-cbor, ipld, 0x71, permanent +libp2p-key, ipld, 0x72, permanent +git-raw, ipld, 0x78, permanent +torrent-info, ipld, 0x7b, draft +torrent-file, ipld, 0x7c, draft +leofcoin-block, ipld, 0x81, draft +leofcoin-tx, ipld, 0x82, draft +leofcoin-pr, ipld, 0x83, draft +sctp, multiaddr, 0x84, draft +dag-jose, ipld, 0x85, draft +dag-cose, ipld, 0x86, draft +lbry, namespace, 0x8c, draft +eth-block, ipld, 0x90, permanent +eth-block-list, ipld, 0x91, permanent +eth-tx-trie, ipld, 0x92, permanent +eth-tx, ipld, 0x93, permanent +eth-tx-receipt-trie, ipld, 0x94, permanent +eth-tx-receipt, ipld, 0x95, permanent +eth-state-trie, ipld, 0x96, permanent +eth-account-snapshot, ipld, 0x97, permanent +eth-storage-trie, ipld, 0x98, permanent +eth-receipt-log-trie, ipld, 0x99, draft +eth-receipt-log, ipld, 0x9a, draft +aes-128, key, 0xa0, draft +aes-192, key, 0xa1, draft +aes-256, key, 0xa2, draft +chacha-128, key, 0xa3, draft +chacha-256, key, 0xa4, draft +bitcoin-block, ipld, 0xb0, permanent +bitcoin-tx, ipld, 0xb1, permanent +bitcoin-witness-commitment, ipld, 0xb2, permanent +zcash-block, ipld, 0xc0, permanent +zcash-tx, ipld, 0xc1, permanent +caip-50, multiformat, 0xca, draft +streamid, namespace, 0xce, draft +stellar-block, ipld, 0xd0, draft +stellar-tx, ipld, 0xd1, draft +md4, multihash, 0xd4, draft +md5, multihash, 0xd5, draft +decred-block, ipld, 0xe0, draft +decred-tx, ipld, 0xe1, draft +ipld, namespace, 0xe2, draft +ipfs, namespace, 0xe3, draft +swarm, namespace, 0xe4, draft +ipns, namespace, 0xe5, draft +zeronet, namespace, 0xe6, draft +secp256k1-pub, key, 0xe7, draft +dnslink, namespace, 0xe8, permanent +bls12_381-g1-pub, key, 0xea, draft +bls12_381-g2-pub, key, 0xeb, draft +x25519-pub, key, 0xec, draft +ed25519-pub, key, 0xed, draft +bls12_381-g1g2-pub, key, 0xee, draft +sr25519-pub, key, 0xef, draft +dash-block, ipld, 0xf0, draft +dash-tx, ipld, 0xf1, draft +swarm-manifest, ipld, 0xfa, draft +swarm-feed, ipld, 0xfb, draft +beeson, ipld, 0xfc, draft +udp, multiaddr, 0x0111, draft +p2p-webrtc-star, multiaddr, 0x0113, deprecated +p2p-webrtc-direct, multiaddr, 0x0114, deprecated +p2p-stardust, multiaddr, 0x0115, deprecated +webrtc-direct, multiaddr, 0x0118, draft +webrtc, multiaddr, 0x0119, draft +p2p-circuit, multiaddr, 0x0122, permanent +dag-json, ipld, 0x0129, permanent +udt, multiaddr, 0x012d, draft +utp, multiaddr, 0x012e, draft +crc32, hash, 0x0132, draft +crc64-ecma, hash, 0x0164, draft +unix, multiaddr, 0x0190, permanent +thread, multiaddr, 0x0196, draft +p2p, multiaddr, 0x01a5, permanent +https, multiaddr, 0x01bb, draft +onion, multiaddr, 0x01bc, draft +onion3, multiaddr, 0x01bd, draft +garlic64, multiaddr, 0x01be, draft +garlic32, multiaddr, 0x01bf, draft +tls, multiaddr, 0x01c0, draft +sni, multiaddr, 0x01c1, draft +noise, multiaddr, 0x01c6, draft +shs, multiaddr, 0x01c8, draft +quic, multiaddr, 0x01cc, permanent +quic-v1, multiaddr, 0x01cd, permanent +webtransport, multiaddr, 0x01d1, draft +certhash, multiaddr, 0x01d2, draft +ws, multiaddr, 0x01dd, permanent +wss, multiaddr, 0x01de, permanent +p2p-websocket-star, multiaddr, 0x01df, permanent +http, multiaddr, 0x01e0, draft +swhid-1-snp, ipld, 0x01f0, draft +json, ipld, 0x0200, permanent +messagepack, serialization, 0x0201, draft +car, serialization, 0x0202, draft +ipns-record, serialization, 0x0300, permanent +libp2p-peer-record, libp2p, 0x0301, permanent +libp2p-relay-rsvp, libp2p, 0x0302, permanent +memorytransport, libp2p, 0x0309, permanent +car-index-sorted, serialization, 0x0400, draft +car-multihash-index-sorted, serialization, 0x0401, draft +transport-bitswap, transport, 0x0900, draft +transport-graphsync-filecoinv1, transport, 0x0910, draft +transport-ipfs-gateway-http, transport, 0x0920, draft +multidid, multiformat, 0x0d1d, draft +sha2-256-trunc254-padded, multihash, 0x1012, permanent +sha2-224, multihash, 0x1013, permanent +sha2-512-224, multihash, 0x1014, permanent +sha2-512-256, multihash, 0x1015, permanent +murmur3-x64-128, hash, 0x1022, draft +ripemd-128, multihash, 0x1052, draft +ripemd-160, multihash, 0x1053, draft +ripemd-256, multihash, 0x1054, draft +ripemd-320, multihash, 0x1055, draft +x11, multihash, 0x1100, draft +p256-pub, key, 0x1200, draft +p384-pub, key, 0x1201, draft +p521-pub, key, 0x1202, draft +ed448-pub, key, 0x1203, draft +x448-pub, key, 0x1204, draft +rsa-pub, key, 0x1205, draft +sm2-pub, key, 0x1206, draft +ed25519-priv, key, 0x1300, draft +secp256k1-priv, key, 0x1301, draft +x25519-priv, key, 0x1302, draft +sr25519-priv, key, 0x1303, draft +rsa-priv, key, 0x1305, draft +p256-priv, key, 0x1306, draft +p384-priv, key, 0x1307, draft +p521-priv, key, 0x1308, draft +bls12_381-g1-priv, key, 0x1309, draft +bls12_381-g2-priv, key, 0x130a, draft +bls12_381-g1g2-priv, key, 0x130b, draft +kangarootwelve, multihash, 0x1d01, draft +aes-gcm-256, encryption, 0x2000, draft +silverpine, multiaddr, 0x3f42, draft +sm3-256, multihash, 0x534d, draft +sha256a, hash, 0x7012, draft +blake2b-8, multihash, 0xb201, draft +blake2b-16, multihash, 0xb202, draft +blake2b-24, multihash, 0xb203, draft +blake2b-32, multihash, 0xb204, draft +blake2b-40, multihash, 0xb205, draft +blake2b-48, multihash, 0xb206, draft +blake2b-56, multihash, 0xb207, draft +blake2b-64, multihash, 0xb208, draft +blake2b-72, multihash, 0xb209, draft +blake2b-80, multihash, 0xb20a, draft +blake2b-88, multihash, 0xb20b, draft +blake2b-96, multihash, 0xb20c, draft +blake2b-104, multihash, 0xb20d, draft +blake2b-112, multihash, 0xb20e, draft +blake2b-120, multihash, 0xb20f, draft +blake2b-128, multihash, 0xb210, draft +blake2b-136, multihash, 0xb211, draft +blake2b-144, multihash, 0xb212, draft +blake2b-152, multihash, 0xb213, draft +blake2b-160, multihash, 0xb214, draft +blake2b-168, multihash, 0xb215, draft +blake2b-176, multihash, 0xb216, draft +blake2b-184, multihash, 0xb217, draft +blake2b-192, multihash, 0xb218, draft +blake2b-200, multihash, 0xb219, draft +blake2b-208, multihash, 0xb21a, draft +blake2b-216, multihash, 0xb21b, draft +blake2b-224, multihash, 0xb21c, draft +blake2b-232, multihash, 0xb21d, draft +blake2b-240, multihash, 0xb21e, draft +blake2b-248, multihash, 0xb21f, draft +blake2b-256, multihash, 0xb220, permanent +blake2b-264, multihash, 0xb221, draft +blake2b-272, multihash, 0xb222, draft +blake2b-280, multihash, 0xb223, draft +blake2b-288, multihash, 0xb224, draft +blake2b-296, multihash, 0xb225, draft +blake2b-304, multihash, 0xb226, draft +blake2b-312, multihash, 0xb227, draft +blake2b-320, multihash, 0xb228, draft +blake2b-328, multihash, 0xb229, draft +blake2b-336, multihash, 0xb22a, draft +blake2b-344, multihash, 0xb22b, draft +blake2b-352, multihash, 0xb22c, draft +blake2b-360, multihash, 0xb22d, draft +blake2b-368, multihash, 0xb22e, draft +blake2b-376, multihash, 0xb22f, draft +blake2b-384, multihash, 0xb230, draft +blake2b-392, multihash, 0xb231, draft +blake2b-400, multihash, 0xb232, draft +blake2b-408, multihash, 0xb233, draft +blake2b-416, multihash, 0xb234, draft +blake2b-424, multihash, 0xb235, draft +blake2b-432, multihash, 0xb236, draft +blake2b-440, multihash, 0xb237, draft +blake2b-448, multihash, 0xb238, draft +blake2b-456, multihash, 0xb239, draft +blake2b-464, multihash, 0xb23a, draft +blake2b-472, multihash, 0xb23b, draft +blake2b-480, multihash, 0xb23c, draft +blake2b-488, multihash, 0xb23d, draft +blake2b-496, multihash, 0xb23e, draft +blake2b-504, multihash, 0xb23f, draft +blake2b-512, multihash, 0xb240, draft +blake2s-8, multihash, 0xb241, draft +blake2s-16, multihash, 0xb242, draft +blake2s-24, multihash, 0xb243, draft +blake2s-32, multihash, 0xb244, draft +blake2s-40, multihash, 0xb245, draft +blake2s-48, multihash, 0xb246, draft +blake2s-56, multihash, 0xb247, draft +blake2s-64, multihash, 0xb248, draft +blake2s-72, multihash, 0xb249, draft +blake2s-80, multihash, 0xb24a, draft +blake2s-88, multihash, 0xb24b, draft +blake2s-96, multihash, 0xb24c, draft +blake2s-104, multihash, 0xb24d, draft +blake2s-112, multihash, 0xb24e, draft +blake2s-120, multihash, 0xb24f, draft +blake2s-128, multihash, 0xb250, draft +blake2s-136, multihash, 0xb251, draft +blake2s-144, multihash, 0xb252, draft +blake2s-152, multihash, 0xb253, draft +blake2s-160, multihash, 0xb254, draft +blake2s-168, multihash, 0xb255, draft +blake2s-176, multihash, 0xb256, draft +blake2s-184, multihash, 0xb257, draft +blake2s-192, multihash, 0xb258, draft +blake2s-200, multihash, 0xb259, draft +blake2s-208, multihash, 0xb25a, draft +blake2s-216, multihash, 0xb25b, draft +blake2s-224, multihash, 0xb25c, draft +blake2s-232, multihash, 0xb25d, draft +blake2s-240, multihash, 0xb25e, draft +blake2s-248, multihash, 0xb25f, draft +blake2s-256, multihash, 0xb260, draft +skein256-8, multihash, 0xb301, draft +skein256-16, multihash, 0xb302, draft +skein256-24, multihash, 0xb303, draft +skein256-32, multihash, 0xb304, draft +skein256-40, multihash, 0xb305, draft +skein256-48, multihash, 0xb306, draft +skein256-56, multihash, 0xb307, draft +skein256-64, multihash, 0xb308, draft +skein256-72, multihash, 0xb309, draft +skein256-80, multihash, 0xb30a, draft +skein256-88, multihash, 0xb30b, draft +skein256-96, multihash, 0xb30c, draft +skein256-104, multihash, 0xb30d, draft +skein256-112, multihash, 0xb30e, draft +skein256-120, multihash, 0xb30f, draft +skein256-128, multihash, 0xb310, draft +skein256-136, multihash, 0xb311, draft +skein256-144, multihash, 0xb312, draft +skein256-152, multihash, 0xb313, draft +skein256-160, multihash, 0xb314, draft +skein256-168, multihash, 0xb315, draft +skein256-176, multihash, 0xb316, draft +skein256-184, multihash, 0xb317, draft +skein256-192, multihash, 0xb318, draft +skein256-200, multihash, 0xb319, draft +skein256-208, multihash, 0xb31a, draft +skein256-216, multihash, 0xb31b, draft +skein256-224, multihash, 0xb31c, draft +skein256-232, multihash, 0xb31d, draft +skein256-240, multihash, 0xb31e, draft +skein256-248, multihash, 0xb31f, draft +skein256-256, multihash, 0xb320, draft +skein512-8, multihash, 0xb321, draft +skein512-16, multihash, 0xb322, draft +skein512-24, multihash, 0xb323, draft +skein512-32, multihash, 0xb324, draft +skein512-40, multihash, 0xb325, draft +skein512-48, multihash, 0xb326, draft +skein512-56, multihash, 0xb327, draft +skein512-64, multihash, 0xb328, draft +skein512-72, multihash, 0xb329, draft +skein512-80, multihash, 0xb32a, draft +skein512-88, multihash, 0xb32b, draft +skein512-96, multihash, 0xb32c, draft +skein512-104, multihash, 0xb32d, draft +skein512-112, multihash, 0xb32e, draft +skein512-120, multihash, 0xb32f, draft +skein512-128, multihash, 0xb330, draft +skein512-136, multihash, 0xb331, draft +skein512-144, multihash, 0xb332, draft +skein512-152, multihash, 0xb333, draft +skein512-160, multihash, 0xb334, draft +skein512-168, multihash, 0xb335, draft +skein512-176, multihash, 0xb336, draft +skein512-184, multihash, 0xb337, draft +skein512-192, multihash, 0xb338, draft +skein512-200, multihash, 0xb339, draft +skein512-208, multihash, 0xb33a, draft +skein512-216, multihash, 0xb33b, draft +skein512-224, multihash, 0xb33c, draft +skein512-232, multihash, 0xb33d, draft +skein512-240, multihash, 0xb33e, draft +skein512-248, multihash, 0xb33f, draft +skein512-256, multihash, 0xb340, draft +skein512-264, multihash, 0xb341, draft +skein512-272, multihash, 0xb342, draft +skein512-280, multihash, 0xb343, draft +skein512-288, multihash, 0xb344, draft +skein512-296, multihash, 0xb345, draft +skein512-304, multihash, 0xb346, draft +skein512-312, multihash, 0xb347, draft +skein512-320, multihash, 0xb348, draft +skein512-328, multihash, 0xb349, draft +skein512-336, multihash, 0xb34a, draft +skein512-344, multihash, 0xb34b, draft +skein512-352, multihash, 0xb34c, draft +skein512-360, multihash, 0xb34d, draft +skein512-368, multihash, 0xb34e, draft +skein512-376, multihash, 0xb34f, draft +skein512-384, multihash, 0xb350, draft +skein512-392, multihash, 0xb351, draft +skein512-400, multihash, 0xb352, draft +skein512-408, multihash, 0xb353, draft +skein512-416, multihash, 0xb354, draft +skein512-424, multihash, 0xb355, draft +skein512-432, multihash, 0xb356, draft +skein512-440, multihash, 0xb357, draft +skein512-448, multihash, 0xb358, draft +skein512-456, multihash, 0xb359, draft +skein512-464, multihash, 0xb35a, draft +skein512-472, multihash, 0xb35b, draft +skein512-480, multihash, 0xb35c, draft +skein512-488, multihash, 0xb35d, draft +skein512-496, multihash, 0xb35e, draft +skein512-504, multihash, 0xb35f, draft +skein512-512, multihash, 0xb360, draft +skein1024-8, multihash, 0xb361, draft +skein1024-16, multihash, 0xb362, draft +skein1024-24, multihash, 0xb363, draft +skein1024-32, multihash, 0xb364, draft +skein1024-40, multihash, 0xb365, draft +skein1024-48, multihash, 0xb366, draft +skein1024-56, multihash, 0xb367, draft +skein1024-64, multihash, 0xb368, draft +skein1024-72, multihash, 0xb369, draft +skein1024-80, multihash, 0xb36a, draft +skein1024-88, multihash, 0xb36b, draft +skein1024-96, multihash, 0xb36c, draft +skein1024-104, multihash, 0xb36d, draft +skein1024-112, multihash, 0xb36e, draft +skein1024-120, multihash, 0xb36f, draft +skein1024-128, multihash, 0xb370, draft +skein1024-136, multihash, 0xb371, draft +skein1024-144, multihash, 0xb372, draft +skein1024-152, multihash, 0xb373, draft +skein1024-160, multihash, 0xb374, draft +skein1024-168, multihash, 0xb375, draft +skein1024-176, multihash, 0xb376, draft +skein1024-184, multihash, 0xb377, draft +skein1024-192, multihash, 0xb378, draft +skein1024-200, multihash, 0xb379, draft +skein1024-208, multihash, 0xb37a, draft +skein1024-216, multihash, 0xb37b, draft +skein1024-224, multihash, 0xb37c, draft +skein1024-232, multihash, 0xb37d, draft +skein1024-240, multihash, 0xb37e, draft +skein1024-248, multihash, 0xb37f, draft +skein1024-256, multihash, 0xb380, draft +skein1024-264, multihash, 0xb381, draft +skein1024-272, multihash, 0xb382, draft +skein1024-280, multihash, 0xb383, draft +skein1024-288, multihash, 0xb384, draft +skein1024-296, multihash, 0xb385, draft +skein1024-304, multihash, 0xb386, draft +skein1024-312, multihash, 0xb387, draft +skein1024-320, multihash, 0xb388, draft +skein1024-328, multihash, 0xb389, draft +skein1024-336, multihash, 0xb38a, draft +skein1024-344, multihash, 0xb38b, draft +skein1024-352, multihash, 0xb38c, draft +skein1024-360, multihash, 0xb38d, draft +skein1024-368, multihash, 0xb38e, draft +skein1024-376, multihash, 0xb38f, draft +skein1024-384, multihash, 0xb390, draft +skein1024-392, multihash, 0xb391, draft +skein1024-400, multihash, 0xb392, draft +skein1024-408, multihash, 0xb393, draft +skein1024-416, multihash, 0xb394, draft +skein1024-424, multihash, 0xb395, draft +skein1024-432, multihash, 0xb396, draft +skein1024-440, multihash, 0xb397, draft +skein1024-448, multihash, 0xb398, draft +skein1024-456, multihash, 0xb399, draft +skein1024-464, multihash, 0xb39a, draft +skein1024-472, multihash, 0xb39b, draft +skein1024-480, multihash, 0xb39c, draft +skein1024-488, multihash, 0xb39d, draft +skein1024-496, multihash, 0xb39e, draft +skein1024-504, multihash, 0xb39f, draft +skein1024-512, multihash, 0xb3a0, draft +skein1024-520, multihash, 0xb3a1, draft +skein1024-528, multihash, 0xb3a2, draft +skein1024-536, multihash, 0xb3a3, draft +skein1024-544, multihash, 0xb3a4, draft +skein1024-552, multihash, 0xb3a5, draft +skein1024-560, multihash, 0xb3a6, draft +skein1024-568, multihash, 0xb3a7, draft +skein1024-576, multihash, 0xb3a8, draft +skein1024-584, multihash, 0xb3a9, draft +skein1024-592, multihash, 0xb3aa, draft +skein1024-600, multihash, 0xb3ab, draft +skein1024-608, multihash, 0xb3ac, draft +skein1024-616, multihash, 0xb3ad, draft +skein1024-624, multihash, 0xb3ae, draft +skein1024-632, multihash, 0xb3af, draft +skein1024-640, multihash, 0xb3b0, draft +skein1024-648, multihash, 0xb3b1, draft +skein1024-656, multihash, 0xb3b2, draft +skein1024-664, multihash, 0xb3b3, draft +skein1024-672, multihash, 0xb3b4, draft +skein1024-680, multihash, 0xb3b5, draft +skein1024-688, multihash, 0xb3b6, draft +skein1024-696, multihash, 0xb3b7, draft +skein1024-704, multihash, 0xb3b8, draft +skein1024-712, multihash, 0xb3b9, draft +skein1024-720, multihash, 0xb3ba, draft +skein1024-728, multihash, 0xb3bb, draft +skein1024-736, multihash, 0xb3bc, draft +skein1024-744, multihash, 0xb3bd, draft +skein1024-752, multihash, 0xb3be, draft +skein1024-760, multihash, 0xb3bf, draft +skein1024-768, multihash, 0xb3c0, draft +skein1024-776, multihash, 0xb3c1, draft +skein1024-784, multihash, 0xb3c2, draft +skein1024-792, multihash, 0xb3c3, draft +skein1024-800, multihash, 0xb3c4, draft +skein1024-808, multihash, 0xb3c5, draft +skein1024-816, multihash, 0xb3c6, draft +skein1024-824, multihash, 0xb3c7, draft +skein1024-832, multihash, 0xb3c8, draft +skein1024-840, multihash, 0xb3c9, draft +skein1024-848, multihash, 0xb3ca, draft +skein1024-856, multihash, 0xb3cb, draft +skein1024-864, multihash, 0xb3cc, draft +skein1024-872, multihash, 0xb3cd, draft +skein1024-880, multihash, 0xb3ce, draft +skein1024-888, multihash, 0xb3cf, draft +skein1024-896, multihash, 0xb3d0, draft +skein1024-904, multihash, 0xb3d1, draft +skein1024-912, multihash, 0xb3d2, draft +skein1024-920, multihash, 0xb3d3, draft +skein1024-928, multihash, 0xb3d4, draft +skein1024-936, multihash, 0xb3d5, draft +skein1024-944, multihash, 0xb3d6, draft +skein1024-952, multihash, 0xb3d7, draft +skein1024-960, multihash, 0xb3d8, draft +skein1024-968, multihash, 0xb3d9, draft +skein1024-976, multihash, 0xb3da, draft +skein1024-984, multihash, 0xb3db, draft +skein1024-992, multihash, 0xb3dc, draft +skein1024-1000, multihash, 0xb3dd, draft +skein1024-1008, multihash, 0xb3de, draft +skein1024-1016, multihash, 0xb3df, draft +skein1024-1024, multihash, 0xb3e0, draft +xxh-32, hash, 0xb3e1, draft +xxh-64, hash, 0xb3e2, draft +xxh3-64, hash, 0xb3e3, draft +xxh3-128, hash, 0xb3e4, draft +poseidon-bls12_381-a2-fc1, multihash, 0xb401, permanent +poseidon-bls12_381-a2-fc1-sc, multihash, 0xb402, draft +rdfc-1, ipld, 0xb403, draft +ssz, serialization, 0xb501, draft +ssz-sha2-256-bmt, multihash, 0xb502, draft +sha2-256-chunked, multihash, 0xb510, draft +json-jcs, ipld, 0xb601, draft +iscc, softhash, 0xcc01, draft +zeroxcert-imprint-256, zeroxcert, 0xce11, draft +nonstandard-sig, varsig, 0xd000, deprecated +es256k, varsig, 0xd0e7, draft +bls-12381-g1-sig, varsig, 0xd0ea, draft +bls-12381-g2-sig, varsig, 0xd0eb, draft +eddsa, varsig, 0xd0ed, draft +eip-191, varsig, 0xd191, draft +jwk_jcs-pub, key, 0xeb51, draft +fil-commitment-unsealed, filecoin, 0xf101, permanent +fil-commitment-sealed, filecoin, 0xf102, permanent +plaintextv2, multiaddr, 0x706c61, draft +holochain-adr-v0, holochain, 0x807124, draft +holochain-adr-v1, holochain, 0x817124, draft +holochain-key-v0, holochain, 0x947124, draft +holochain-key-v1, holochain, 0x957124, draft +holochain-sig-v0, holochain, 0xa27124, draft +holochain-sig-v1, holochain, 0xa37124, draft +skynet-ns, namespace, 0xb19910, draft +arweave-ns, namespace, 0xb29910, draft +subspace-ns, namespace, 0xb39910, draft +kumandra-ns, namespace, 0xb49910, draft +es256, varsig, 0xd01200, draft +es284, varsig, 0xd01201, draft +es512, varsig, 0xd01202, draft +rs256, varsig, 0xd01205, draft +scion, multiaddr, 0xd02000, draft diff --git a/test/hexpds_cid_test.exs b/test/hexpds_cid_test.exs new file mode 100644 index 0000000..c2da830 --- /dev/null +++ b/test/hexpds_cid_test.exs @@ -0,0 +1,257 @@ +defmodule CIDTest do + + # Taken from nocursor/ex-cid + + alias Hexpds.CID + alias Hexpds.Multicodec + use ExUnit.Case, async: true + doctest CID + require Multibase + + + #TODO: better test setup to include more re-used data or scope the data, but the data is pretty simple so.......maybe not + setup_all do + Hexpds.Multicodec.start_link() + digest = :crypto.hash(:sha256, "hello world") + {:ok, multihash} = Multihash.encode(:sha2_256, digest) + %{multihash: multihash} + end + + test "creates a v0 CID", %{multihash: multihash} do + codec = "dag-pb" + cid = %CID{version: 0, multihash: multihash, codec: codec} + assert CID.cid(multihash, codec, 0) == {:ok, cid} + assert CID.cid!(multihash, codec, 0) == cid + end + + test "v0 CIDs cannot be created for other codecs", %{multihash: multihash} do + codec = "dag-json" + assert {:error, _reason} = CID.cid(multihash, codec, 0) + assert_raise ArgumentError, fn -> CID.cid!(multihash, codec, 0) end + end + + test "creates a v1 CID for all Multicodecs", %{multihash: multihash} do + for codec <- Multicodec.codecs() do + cid = %CID{version: 1, multihash: multihash, codec: codec} + assert CID.cid(multihash, codec, 1) == {:ok, cid} + assert CID.cid(multihash, codec) == {:ok, cid} + assert CID.cid!(multihash, codec, 1) == cid + assert CID.cid!(multihash, codec) == cid + end + end + + test "errors when trying to create CIDs with codecs that don't exist", %{multihash: multihash} do + codec = "banana fishbones" + assert {:error, reason} = CID.cid(multihash, codec, 0) + assert_raise ArgumentError, fn -> CID.cid!(multihash, codec, 0) end + assert {:error, reason} = CID.cid(multihash, codec, 1) + assert_raise ArgumentError, fn -> CID.cid!(multihash, codec, 1) end + end + + test "errors when trying to create CIDs with versions that don't exist", %{multihash: multihash} do + codec = "dag-pb" + assert {:error, reason} = CID.cid(multihash, codec, -1) + assert_raise ArgumentError, fn -> CID.cid!(multihash, codec, 93349329439) end + end + + test "errors when trying to create a CID v1 with an invalid multihash" do + codec = "dag-pb" + + assert {:error, reason} = CID.cid("cookie palace 5000", codec, 0) + assert_raise ArgumentError, fn -> CID.cid!("perturbed space chicken", codec, 0) end + assert {:error, reason} = CID.cid(<<>>, codec, 0) + assert_raise ArgumentError, fn -> CID.cid!(<<>>, codec, 0) end + end + + test "encodes a v0 CID for base 58 btc", %{multihash: multihash} do + cid = CID.cid!(multihash, "dag-pb", 0) + assert CID.encode(cid, :base58_btc) == {:ok, "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4"} + assert CID.encode(cid) == {:ok, "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4"} + assert CID.encode!(cid, :base58_btc) == "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4" + assert CID.encode!(cid) == "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4" + end + + test "encodes a v1 CID for base 58 btc", %{multihash: multihash} do + cid = CID.cid!(multihash, "dag-pb", 1) + assert CID.encode(cid, :base58_btc) == {:ok, "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz"} + assert CID.encode(cid) == {:ok, "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz"} + assert CID.encode!(cid, :base58_btc) == "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz" + assert CID.encode!(cid) == "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz" + end + + test "encodes a v1 CID for all Multibase encodings", %{multihash: multihash} do + cid = CID.cid!(multihash, "dag-pb", 1) + for encoding_id <- Multibase.encodings() do + assert {:ok, _encoded_cid} = CID.encode(cid, encoding_id) + encoded_cid = CID.encode!(cid, encoding_id) + assert is_binary(encoded_cid) == true + assert encoded_cid != <<0>> + end + end + + test "errors encoding an invalid CID", %{multihash: multihash} do + codec = "dag-pb" + + assert {:error, _reason } = CID.encode(%CID{version: 435843589348594, multihash: multihash, codec: codec}) + assert {:error, _reason } = CID.encode(%CID{version: 1, multihash: multihash, codec: "club spatula"}) + assert {:error, _reason } = CID.encode(%CID{version: 0, multihash: multihash, codec: "club spatula"}) + assert_raise ArgumentError, fn -> CID.encode!(%CID{version: 6666666, multihash: multihash, codec: codec}) end + assert_raise ArgumentError, fn -> CID.encode!(%CID{version: 1, multihash: multihash, codec: "club spatula"}) end + assert_raise ArgumentError, fn -> CID.encode!(%CID{version: 0, multihash: multihash, codec: "club spatula"}) end + # TODO: not sure if we care if someone does something this dumb + #assert {:error, _reason } = CID.encode(%CID{version: 0, multihash: "feathery beast", codec: codec}) + end + + test "decodes a v0 CID string", %{multihash: multihash} do + cid = CID.cid!(multihash, "dag-pb", 0) + cid_string = "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4" + assert CID.decode_cid(cid_string) == {:ok, cid} + assert CID.decode_cid!(cid_string) == cid + end + + test "decodes a v0 CID string with its encoding id", %{multihash: multihash} do + cid = CID.cid!(multihash, "dag-pb", 0) + cid_string = "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4" + assert CID.decode(cid_string) == {:ok, {cid, :base58_btc}} + assert CID.decode!(cid_string) == {cid, :base58_btc} + end + + test "decodes a v1 CID string", %{multihash: multihash} do + cid = CID.cid!(multihash, "dag-pb", 1) + cid_string = "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz" + assert CID.decode_cid(cid_string) == {:ok, cid} + assert CID.decode_cid!(cid_string) == cid + end + + test "decodes a v1 CID string with its encoding id", %{multihash: multihash} do + cid = CID.cid!(multihash, "dag-pb", 1) + cid_string = "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz" + assert CID.decode(cid_string) == {:ok, {cid, :base58_btc}} + assert CID.decode!(cid_string) == {cid, :base58_btc} + end + + test "errors decoding invalid CIDs" do + assert {:error, _reason} = CID.decode(<<>>) + assert {:error, _reason} = CID.decode("pudding should be drunk not eaten") + assert {:error, _reason} = CID.decode("Zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz") + assert {:error, _reason} = CID.decode(<<0, "Zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz">>) + + assert_raise ArgumentError, fn -> CID.decode!(<<>>) end + assert_raise ArgumentError, fn -> CID.decode!("shout for some sprouts") end + assert_raise ArgumentError, fn -> CID.decode!("Zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz") end + assert_raise ArgumentError, fn -> CID.decode!(<<0, "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz">>) end + end + + test "errors cid decoding invalid CIDs" do + assert {:error, _reason} = CID.decode_cid(<<>>) + assert {:error, _reason} = CID.decode_cid("Zam, but not Shazam") + assert {:error, _reason} = CID.decode_cid("Zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz") + assert {:error, _reason} = CID.decode_cid(<<0, "Zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz">>) + + assert_raise ArgumentError, fn -> CID.decode_cid!(<<>>) end + assert_raise ArgumentError, fn -> CID.decode_cid!("softest pretzels in the city") end + assert_raise ArgumentError, fn -> CID.decode_cid!("Zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz") end + assert_raise ArgumentError, fn -> CID.decode_cid!(<<0, "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz">>) end + end + + test "transparently encodes and decodes v1 CIDs for all Multibase encodings and Multicodec codecs", %{multihash: multihash} do + # could do as parallel, but meh + for codec <- Multicodec.codecs() do + cid = CID.cid!(multihash, codec, 1) + for encoding_id <- Multibase.encodings() do + {:ok, cid_string} = CID.encode(cid, encoding_id) + assert CID.decode_cid(cid_string) == {:ok, cid} + assert CID.decode(cid_string) == {:ok, {cid, encoding_id}} + assert CID.encode!(cid, encoding_id) |> CID.decode_cid!() == cid + assert CID.encode!(cid, encoding_id) |> CID.decode!() == {cid, encoding_id} + end + end + end + + test "encodes a CID v0 buffer", %{multihash: multihash} do + cid = CID.cid!(multihash, "dag-pb", 0) + assert CID.encode_buffer(cid) == {:ok, "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4"} + end + + test "encodes a CID v1 buffer", %{multihash: multihash} do + cid = CID.cid!(multihash, "dag-pb", 1) + assert CID.encode_buffer(cid) == {:ok, + <<1, 112, 18, 32, 185, 77, 39, 185, 147, 77, 62, 8, 165, 46, 82, 215, 218, 125, + 171, 250, 196, 132, 239, 227, 122, 83, 128, 238, 144, 136, 247, 172, 226, + 239, 205, 233>>} + end + + test "encodes a CID v1 buffer for all codecs", %{multihash: multihash} do + for codec <- Multicodec.codecs() do + cid = CID.cid!(multihash, codec, 1) + assert {:ok, _buffer} = CID.encode_buffer(cid) + encoded_buffer = CID.encode_buffer!(cid) + assert is_binary(encoded_buffer) + assert encoded_buffer != <<0>> + end + end + + test "humanizes a v0 CID string" do + cid_string = "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4" + assert CID.humanize(cid_string) == {:ok, "base58_btc - CIDv0 - dag-pb - sha2_256 - b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"} + end + + test "humanizes a v0 CID string with a custom separator" do + cid_string = "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4" + assert CID.humanize(cid_string, "-") == {:ok, + "base58_btc-CIDv0-dag-pb-sha2_256-b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"} + assert CID.humanize(cid_string, "=^_^=") == {:ok, + "base58_btc=^_^=CIDv0=^_^=dag-pb=^_^=sha2_256=^_^=b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"} + end + + test "humanizes a v1 CID string" do + cid_string = "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz" + humanized_string = "base58_btc - CIDv1 - dag-pb - sha2_256 - b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9" + assert CID.humanize(cid_string) == {:ok, humanized_string} + end + + test "humanizes a v1 CID string with a custom separator" do + cid_string = "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz" + humanized_string = "base58_btc-CIDv1-dag-pb-sha2_256-b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9" + assert CID.humanize(cid_string, "-") == {:ok, humanized_string} + assert CID.humanize(cid_string, "><(((('>") == {:ok, + "base58_btc><(((('>CIDv1><(((('>dag-pb><(((('>sha2_256><(((('>b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"} + end + + test "checks if a CID v0 string is encoded" do + cid_string = "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4" + assert CID.cid?(cid_string) == true + assert CID.cid?("super super super cats") == false + end + + test "checks if a CID v1 string is encoded" do + cid_string = "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz" + assert CID.cid?(cid_string) == true + assert CID.cid?("wwwwwwwwhat? what did you put in those pants of yours?") == false + end + + test "CID v0 can be converted to v1", %{multihash: multihash} do + cid_v1 = CID.cid!(multihash, "dag-pb", 1) + cid_v0 = CID.cid!(multihash, "dag-pb", 0) + assert CID.to_version(cid_v0, 1) == {:ok, cid_v1} + end + + test "CID v1 can be converted to v0 for the default codec", %{multihash: multihash} do + cid_v1 = CID.cid!(multihash, "dag-pb", 1) + cid_v0 = CID.cid!(multihash, "dag-pb", 0) + assert CID.to_version(cid_v1, 0) == {:ok, cid_v0} + end + + test "CID v1 cannot be converted to v0 for codecs other than the default codec", %{multihash: multihash} do + cid_v1 = CID.cid!(multihash, "dag-json", 1) + assert {:error, _reason} = CID.to_version(cid_v1, 0) + end + + test "Conversions to the same CID version are effecitvely a noop", %{multihash: multihash} do + cid_v1 = CID.cid!(multihash, "dag-pb", 1) + cid_v0 = CID.cid!(multihash, "dag-pb", 0) + assert CID.to_version(cid_v1, 1) == {:ok, cid_v1} + assert CID.to_version(cid_v1, 0) == {:ok, cid_v0} + end + +end diff --git a/test/hexpds_k256_test.exs b/test/hexpds_k256_test.exs index 87293c2..d9d5205 100644 --- a/test/hexpds_k256_test.exs +++ b/test/hexpds_k256_test.exs @@ -3,6 +3,11 @@ defmodule HexpdsK256Test do doctest Hexpds.K256 alias Hexpds.K256, as: K256 + setup_all do + Hexpds.Multicodec.start_link() + :ok + end + defp test_cases do %{ "9085d2bef69286a6cbb51623c8fa258629945cd55ca705cc4e66700396894e0c" => From 21f57cdaab57f4d9e65555a4565108e2f39946c3 Mon Sep 17 00:00:00 2001 From: ShreyanJain9 Date: Mon, 26 Feb 2024 17:18:53 -0800 Subject: [PATCH 2/2] fix warnings --- test/hexpds_cid_test.exs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/test/hexpds_cid_test.exs b/test/hexpds_cid_test.exs index c2da830..a1db3f2 100644 --- a/test/hexpds_cid_test.exs +++ b/test/hexpds_cid_test.exs @@ -2,8 +2,7 @@ defmodule CIDTest do # Taken from nocursor/ex-cid - alias Hexpds.CID - alias Hexpds.Multicodec + alias Hexpds.{CID, Multicodec} use ExUnit.Case, async: true doctest CID require Multibase @@ -42,24 +41,24 @@ defmodule CIDTest do test "errors when trying to create CIDs with codecs that don't exist", %{multihash: multihash} do codec = "banana fishbones" - assert {:error, reason} = CID.cid(multihash, codec, 0) + assert {:error, _reason} = CID.cid(multihash, codec, 0) assert_raise ArgumentError, fn -> CID.cid!(multihash, codec, 0) end - assert {:error, reason} = CID.cid(multihash, codec, 1) + assert {:error, _reason} = CID.cid(multihash, codec, 1) assert_raise ArgumentError, fn -> CID.cid!(multihash, codec, 1) end end test "errors when trying to create CIDs with versions that don't exist", %{multihash: multihash} do codec = "dag-pb" - assert {:error, reason} = CID.cid(multihash, codec, -1) + assert {:error, _reason} = CID.cid(multihash, codec, -1) assert_raise ArgumentError, fn -> CID.cid!(multihash, codec, 93349329439) end end test "errors when trying to create a CID v1 with an invalid multihash" do codec = "dag-pb" - assert {:error, reason} = CID.cid("cookie palace 5000", codec, 0) + assert {:error, _reason} = CID.cid("cookie palace 5000", codec, 0) assert_raise ArgumentError, fn -> CID.cid!("perturbed space chicken", codec, 0) end - assert {:error, reason} = CID.cid(<<>>, codec, 0) + assert {:error, _reason} = CID.cid(<<>>, codec, 0) assert_raise ArgumentError, fn -> CID.cid!(<<>>, codec, 0) end end