IPFS CID 研究
Self-describing content-addressed identifiers for distributed systems
为什么需要CID?
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转化为“用户可读CID”:
<hr-cid> ::= <hr-mbc> "-" <hr-cid-version> "-" <hr-mcp> "-" <hr-mh>
每一部分都表示了各自的可读内容:
<hr-mbc>
是一种用户可读的 multibase 编码 (egbase58btc
)<hr-cid-version>
是一个版本cidv#
(egcidv1
orcidv2
)<hr-mcp>
是一种用户可读的 multicodec-packed 编码 (egcbor
)<hr-mh>
是一种用户可读的 multihash (egsha2-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>
CIDv1
描述见: How does it work? — Protocol Description
<cidv1> ::= <multibase-prefix><cid-version><multicodec-packed-content-type><multihash-content-address>
已有的实现方式
常见问题
Q. 我对multicodec, multibase, or multihash有疑问.
请参考相应的库: multicodec, multibase, multihash.
Q. 为什么需要构造CID?
我们目前在IPFS中用base58btc对 multihashes进行编码。 在开发IPLD的过程中遇到了很多与数据格式相关棘手的问题,CID的出现让管理不同格式的数据成为了可能。相关的讨论如下: https://github.com/ipfs/specs/issues/130
Q. 多编码格式(multicodec-packed)与文件后缀类似吗?
是的,很相像!就像文件后缀一样,multicodec-packed表示了数据的格式。不同点是,multicodec-packed是数据标识符的一部分,用户不能随意修改。支持的格式也有限。
Q. CID支持哪些multicodec-packed编码 ?
格式正在开发中,计划支持多种格式。目前在开发的有IPFS原生的protobuf格式,IPLD CBOR格式,git,比特币和以太坊对象。
参考资料: