167 lines
7.4 KiB
JSON
167 lines
7.4 KiB
JSON
{
|
|
"$schema": "cid-rank-vectors/v1",
|
|
"$comment": [
|
|
"CANONICAL golden vectors for the CID utility rank. THE single source of truth.",
|
|
"The rank decides which of a record's several CIDs is elected canonical - the cid a",
|
|
"record is advertised and addressed by. It is reimplemented in Go, 2x Rust and 3x TS;",
|
|
"they cannot share code (independent submodules, no cargo path-dep). These vectors are",
|
|
"the only thing holding them in sync: every implementation's test suite loads this file.",
|
|
"",
|
|
"This file is VENDORED into each consuming submodule (submodule CI cannot read above its",
|
|
"own tree). scripts/check-cid-vectors.sh diffs every copy against this one.",
|
|
"",
|
|
"Ranking is by UTILITY for external retrieval, not cryptographic strength.",
|
|
"Ties break on the lexicographically smaller cid, so the election is deterministic",
|
|
"across peers and does not churn.",
|
|
"",
|
|
"See METADATA_KEYS.md section 2/14.13 and docs/cid-formats.md."
|
|
],
|
|
"ladder": {
|
|
"40": "dag-pb (IPFS block)",
|
|
"30": "sha2-256 / sha3-256 / sha3-384 - real content digests",
|
|
"25": "nzb-posting - content-derived (Message-ID set digest), but not itself fetchable",
|
|
"20": "BitTorrent infohashes - swarm interop",
|
|
"10": "midhash256 - the record address",
|
|
"5": "opaque locators (nzb-release, url, card) - never outrank a real digest",
|
|
"0": "weak/unknown digests, unparseable input"
|
|
},
|
|
"tieBreak": "lexicographically smaller cid wins",
|
|
"vectors": [
|
|
{
|
|
"name": "ipfs-dagpb",
|
|
"cid": "bafybeiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"rank": 40,
|
|
"note": "dag-pb codec 0x70 - chunked IPFS file, broadest network reach"
|
|
},
|
|
{
|
|
"name": "sha2-256-raw-codec",
|
|
"cid": "bafkreiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"rank": 30,
|
|
"note": "fullhash/gateway convention: raw codec 0x55, mh names the algo"
|
|
},
|
|
{
|
|
"name": "sha2-256-codec-eq-mh",
|
|
"cid": "baejbeibku6ua2l6r5olnggx4pto2sii2s5jeeawgh4cbkhlbmp52gudbua",
|
|
"rank": 30,
|
|
"note": "REAL meta-hash fixture; meta-hash sets codec == mh"
|
|
},
|
|
{
|
|
"name": "sha3-256",
|
|
"cid": "baelbmidner7x3dd7t2kldh6wiq4w6lsye7qrwo6uoqot2t52zkhqk56fnq",
|
|
"rank": 30,
|
|
"note": "REAL meta-hash fixture"
|
|
},
|
|
{
|
|
"name": "sha3-384",
|
|
"cid": "baekrkmeglipkjf33exqexdvijl4twipruay4wsbvt44akce43lq5rgccxgr7v6dwksmj3sxedakevc53g6ga",
|
|
"rank": 30,
|
|
"note": "REAL meta-hash fixture"
|
|
},
|
|
{
|
|
"name": "nzb-posting",
|
|
"cid": "bagbsaeraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"rank": 25,
|
|
"note": "codec 0x1003 + REAL sha2-256 multihash (0x12) over the normalised, sorted Message-ID set - NOT a locator, so it sits ABOVE tier 5, but it addresses no fetchable block (bitswap can never satisfy a want for it - the digest is over an id set, not over any block's bytes), so it stays BELOW a real content digest (30): once meta-share materialises the media and re-seeds it, that genuine sha2-256 cid must win the canonical election, not this one. Rank MUST match on codec BEFORE falling through to the mh switch, or this scores 30 (same trap as nzb-release/url, in reverse: those need a codec check because their mh is identity 0x00; this needs one because its mh is REAL sha2-256 and would otherwise tie with tier 30)."
|
|
},
|
|
{
|
|
"name": "btih-v2-codec-eq-mh",
|
|
"cid": "bag3sdnzbeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"rank": 20,
|
|
"note": "meta-hash encoder convention"
|
|
},
|
|
{
|
|
"name": "btih-v2-raw-codec",
|
|
"cid": "bafk3oijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"rank": 20,
|
|
"note": "fullhash encoder convention - SAME tier, both conventions must match"
|
|
},
|
|
{
|
|
"name": "btih-v1-file",
|
|
"cid": "bagasbajacqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"rank": 20,
|
|
"note": "gateway per-file BitTorrent v1"
|
|
},
|
|
{
|
|
"name": "btih-v2-file",
|
|
"cid": "bagbcbaraeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"rank": 20,
|
|
"note": "gateway per-file BitTorrent v2"
|
|
},
|
|
{
|
|
"name": "midhash256-codec-eq-mh",
|
|
"cid": "bagacbabaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"rank": 10,
|
|
"note": "the record address; internally meaningful, externally invisible"
|
|
},
|
|
{
|
|
"name": "midhash256-raw-codec",
|
|
"cid": "bafkyaibaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"rank": 10
|
|
},
|
|
{
|
|
"name": "nzb-release-locator",
|
|
"cid": "bagcsaaazcbqxa2jonz5gez3fmvvs42lomzx55ln657fp4aab",
|
|
"rank": 5,
|
|
"note": "codec 0x1005 + IDENTITY multihash 0x00. The locator code is in the CODEC slot, not the mh slot - rank MUST match on codec. Tier 5 = below midhash: a locator never outranks a real digest, it wins only as a record's sole cid."
|
|
},
|
|
{
|
|
"name": "url-locator",
|
|
"cid": "bagdcaaaznb2hi4dthixs6zlymfwxa3dffzxxezzpmexhazdg",
|
|
"rank": 5,
|
|
"note": "codec 0x1006 + IDENTITY multihash 0x00. Same tier/reasoning as nzb-release."
|
|
},
|
|
{
|
|
"name": "card-locator",
|
|
"cid": "bagdsaaanar2g2zdcor3duojvgq3ts",
|
|
"rank": 5,
|
|
"note": "codec 0x1007 + IDENTITY multihash 0x00, digest = varint(len(source)) || source || id — here (\"tmdb\",\"tv:95479\"). Same codec-slot rule as nzb-release/url: match on the CODEC, never the mh. The limit case of the family — the only CID in MetaMesh with NO bytes behind it anywhere, ever: it addresses a *work* (a series, a film), not a file, so the byte path 404s by design and bitswap never offers it (seeding is gated on sha2-256). Tier 5 is load-bearing for the planned cross-source merge: one card record may carry BOTH a TMDB and a MyAnimeList locator, and if a real card body is ever added (see card-tier-search.md §4.3) its sha2-256 must win the canonical election over both locators without any addressing change. Ranking it 0 instead would still lose to a digest, but would put the implementations back out of agreement — which is the exact failure this fixture exists to prevent."
|
|
},
|
|
{
|
|
"name": "sha1",
|
|
"cid": "baeircff3eqvxxaqqot2lt242stkdtk3gq4c2vra",
|
|
"rank": 0,
|
|
"note": "REAL meta-hash fixture; weak digest"
|
|
},
|
|
{
|
|
"name": "md5",
|
|
"cid": "bahkqdvibcatpcfl7ine2n625eb5ml5mzkfaa",
|
|
"rank": 0,
|
|
"note": "REAL meta-hash fixture; weak digest"
|
|
},
|
|
{
|
|
"name": "crc32",
|
|
"cid": "bagzafmqcathsbnrk",
|
|
"rank": 0,
|
|
"note": "REAL meta-hash fixture; weak digest"
|
|
},
|
|
{
|
|
"name": "bt-pieces-root",
|
|
"cid": "bafkyf3qceaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"rank": 0,
|
|
"note": "torrent-internal merkle root, NOT a file-identity cid"
|
|
},
|
|
{
|
|
"name": "cidv0-rejected",
|
|
"cid": "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG",
|
|
"rank": 0,
|
|
"note": "TRAP: Go rejected this (rank 0) while Rust's MsCid::from_str ACCEPTED it and ranked it 40 (dag-pb). Strict parse = CIDv1 base32-lower only. This vector pins the fix."
|
|
},
|
|
{
|
|
"name": "token-form-rejected",
|
|
"cid": "midhash256:bagacbabaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"rank": 0,
|
|
"note": "TRAP: the deprecated <algo>:<cid> token form. Rust used to strip the prefix and rank it 10. It must now be rejected."
|
|
},
|
|
{
|
|
"name": "garbage",
|
|
"cid": "not-a-cid",
|
|
"rank": 0
|
|
},
|
|
{
|
|
"name": "empty",
|
|
"cid": "",
|
|
"rank": 0
|
|
}
|
|
]
|
|
}
|