CID 是类似IPFS分布式文件系统中标准的文件寻址格式。它集合了内容寻址、加密散列算法和自我描述的格式。它是IPFS和IPLD的内部重要的识别符。
CID相关讨论可参照:https://github.com/ipfs/specs/issues/130(第一个post见这里)
CID是一种自描述式的内容寻址的识别符。它必须使用加密散列函数来得到内容的地址。它使用了很多 multiformats 来实现灵活的自描述,即使用multihash得到哈希值,multicodec-packed用于描述内容类型,通过 multibase将CID本身编码成字符串。
当前版本: CIDv1
一个CIDv1 由四部分组成:
<cidv1> ::= <mb><version><mcp><mh>
# or, expanded:
<cidv1> ::= <multibase-prefix><cid-version><multicodec-packed-content-type><multihash-content-address>
其中:
<multibase-prefix>
是一个multibase 编码 (1到2个字节), 便于将CID编码成不同的格式。<cid-version>
是一个表示CID版本的变量,为了便于今后升级。<multicodec-packed-content-type>
是一种用 multicodec-packed 编码表示内容的类型或者数据的格式。<multihash-content-address>
是一个 multihash 值, 表示了内容的加密哈希散列值。Multihash 让CID可以使用不同的加密哈希散列函数,便于今后的升级和改造。CIDs在设计的时候考虑到了构建IPFS时遇到的各种权衡方案。这与众多支持多格式的项目有关。
压缩性:CID二进制的特性让其压缩效率非常高,这也让CID可以作为URL的一部分。 传输友好性:即“易复制性,copy-pastability”。CID以multibase编码来方便传输,例如,以base58btc编码的CID的长度将更短,而且便于哈希值的复制黏贴。 多变性:CID可以表示任意格式、任意哈希函数的结果。 避免内容锁:CID要防止受限于历史内容。 可升级性:CID的编码版本必须要可以升级。
为了更好的调试和解释,我们需要CID的内容是有意义的,可读的。按照以下方法可以将普通CID转化为“用户可读CID”:
<hr-cid> ::= <hr-mbc> "-" <hr-cid-version> "-" <hr-mcp> "-" <hr-mh>
每一部分都表示了各自的可读内容:
<hr-mbc>
是一种用户可读的 multibase 编码 (如base58btc
)<hr-cid-version>
是一个版本cidv#
(如 cidv1
或 cidv2
)<hr-mcp>
是一种用户可读的 multicodec-packed 编码 (如cbor
)<hr-mh>
是一种用户可读的 multihash (如sha2-256-256-abcdef0123456789...
)例如:
# TODO example
# example CID
# corresponding human readable CID
CIDv0是一个向后兼容的版本,其中:
CIDv0是一个向后兼容的版本,其中:
multibase
一直为 base58btc
multicodec
一直为 protobuf-mdag
cid-version
一直为 cidv0
multihash
表示为:
cidv0 ::= <multihash-content-address>
描述见: https://github.com/ipld/cid#how-does-it-work-protocol-description
<cidv1> ::= <multibase-prefix><cid-version><multicodec-packed-content-type><multihash-content-address>