IPFS CID 研究

Self-describing content-addressed identifiers for distributed systems

Sophie Huang
5 min readNov 25, 2017

为什么需要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 编码 (eg base58btc)
  • <hr-cid-version> 是一个版本cidv# (eg cidv1 or cidv2)
  • <hr-mcp> 是一种用户可读的 multicodec-packed 编码 (eg cbor)
  • <hr-mh> 是一种用户可读的 multihash (eg 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>

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,比特币和以太坊对象。

参考资料:

https://ipld.github.io/js-cid/#cidmultihash

--

--