第37章 【IPFS一问一答】解析IPFS应用层IPLD之CID

37. 【IPFS一问一答】解析IPFS应用层IPLD之CID

37.1 为什么需要CID?

CID 是类似IPFS分布式文件系统中标准的文件寻址格式。它集合了内容寻址、加密散列算法和自我描述的格式。它是IPFS和IPLD的内部重要的识别符。

CID相关讨论可参照:https://github.com/ipfs/specs/issues/130(第一个post见这里)

37.2 协议描述

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>

其中:

37.3 设计理念

CIDs在设计的时候考虑到了构建IPFS时遇到的各种权衡方案。这与众多支持多格式的项目有关。

压缩性:CID二进制的特性让其压缩效率非常高,这也让CID可以作为URL的一部分。 传输友好性:即“易复制性,copy-pastability”。CID以multibase编码来方便传输,例如,以base58btc编码的CID的长度将更短,而且便于哈希值的复制黏贴。 多变性:CID可以表示任意格式、任意哈希函数的结果。 避免内容锁:CID要防止受限于历史内容。 可升级性:CID的编码版本必须要可以升级。

37.4 可读的CID值

为了更好的调试和解释,我们需要CID的内容是有意义的,可读的。按照以下方法可以将普通CID转化为“用户可读CID”:

<hr-cid> ::= <hr-mbc> "-" <hr-cid-version> "-" <hr-mcp> "-" <hr-mh>

每一部分都表示了各自的可读内容:

例如:

# TODO example
# example CID
# corresponding human readable CID

37.5 版本

37.5.1 CIDv0

CIDv0是一个向后兼容的版本,其中:

CIDv0是一个向后兼容的版本,其中:

37.5.2 CIDv1

描述见: https://github.com/ipld/cid#how-does-it-work-protocol-description

<cidv1> ::= <multibase-prefix><cid-version><multicodec-packed-content-type><multihash-content-address>

37.6 已有的实现方式