IPFS之CID
CID是什么
Self-describing content-addressed identifiers for distributed systems(用于分布式系统的自描述内容定位标识符。)
链接:https://github.com/ipld/cid#motivation
为何需要CID,CID解决了什么问题
CID 是分布式文件系统中标准的文件寻址格式。它集合了内容寻址、加密散列算法和自我描述的格式。它是IPFS和IPLD的内部重要的识别符。
CIDs在设计的时候考虑到了构建IPFS时遇到的各种权衡方案。这与众多支持多格式的项目有关。
-
压缩性:CID二进制的特性让其压缩效率非常高,这也让CID可以作为URL的一部分。
-
传输友好性:即“易复制性,copy-pastability”。CID以multibase编码来方便传输,例如,以base58btc编码的CID的长度将更短,而且便于哈希值的复制黏贴。
-
多变性:CID可以表示任意格式、任意哈希函数的结果。
-
避免内容锁:CID要防止受限于历史内容。
-
可升级性:CID的编码版本必须要可以升级。
运行原理
CID是一个自描述的内容寻址标识符。它使用密码散列来实现内容寻址。它使用几种多格式来实现灵活的自我描述,即哈希的multihash,数据内容类型的multicodec,以及将CID本身编码为字符串的multibase。
当前的版本是1.0,它包含四个部分
<pre class="ql-syntax ql-authorBlock-13003047 first-line ql-long-13003047" spellcheck="false" line="U2jG" data-linenum="1"><cidv1> ::= <mb><version><mc><mh></pre>
<pre class="ql-syntax ql-authorBlock-13003047 ql-long-13003047" spellcheck="false" line="QE9W" data-linenum="2"># or, expanded:</pre>
<pre class="ql-syntax ql-authorBlock-13003047 last-line ql-long-13003047" spellcheck="false" line="PMcZ" data-linenum="3"><cidv1> ::= <multibase-prefix><cid-version><multicodec-content-type><multihash-content-address></pre>
解释
-
multibase-prefix:multibase,一到2个字节用来将CID编码成不同的格式。
-
cid-version:cid版本,用来以后的可能升级用的。
-
multicodec-content-type:是一种多编解码代码,表示要寻址的数据的内容类型或格式。
-
<multihash-content-address>:是一个多哈希值(multihash)格式,表示被寻址内容的加密哈希。多哈希允许CIDs使用许多不同的加密哈希函数,用于升级和协议敏捷性目的。
用到的子协议介绍
Multibase
地址
https://github.com/multiformats/multibase
描述
Multibase是一种用于区分基本编码和其他简单字符串编码的协议,并确保与程序接口完全兼容。它回答了这个问题 : 给定编码为字符串s的数据d,我如何知道用什么基d编码?
我的理解,看名字都可以看出来multi base ,很多加密算法起名字都有base,例如base64 、base32等等~ 这大概也是这个multibase大来源吧!
举例
假设有一个字符串被base16编码编码成了下面一个字符串
<pre class="ql-syntax ql-authorBlock-13003047 first-line last-line ql-long-13003047" spellcheck="false" line="Rt5O" data-linenum="1">4D756C74696261736520697320617765736F6D6521205C6F2F</pre>
它的multibase表示是
<pre class="ql-syntax ql-authorBlock-13003047 first-line last-line ql-long-13003047" spellcheck="false" line="cCmy" data-linenum="1">F4D756C74696261736520697320617765736F6D6521205C6F2F</pre>
这里的F前缀就代表的是base64编码。
这里是一个对照列表
https://github.com/multiformats/multibase/blob/master/multibase.csv
对multibase的思考
可以看出来,base类的主要作用在IPFS中就是对CID地址通过加一个前缀的方式来让其他系统和人很方便的知道CID的编码格式,以便后续的处理。我最开始的疑问是,如果这样,怎么和multicodec做的事情类似了。后来想通了(可能不对)。CID这种自描述认证描述符号通常经常需要从二进制转换为字符串~ 和multicodec还是有区别的。一个是对类似地址的code,一种是对内容的code(编码)。
Multicodec
地址
https://github.com/multiformats/multicodec
描述
Multicodec为最常见的数据序列化格式定义了一个表,这些格式可以在以后扩展,也可以在每个应用程序基础上扩展。但是,为了让两个程序能够互相通信,它们需要事先知道使用的是哪个表或表扩展。
为了实现可以动态描述的自描述性数据格式或流,没有向表中添加二进制填充代码的形式集,我们有multistream,因此应用程序可以为它们的流采用多种数据格式,并创建不同的协议。
这个说那么多,可以简单理解为对内容的编码使用了什么格式。
Multistream
链接
https://github.com/multiformats/multistream
感觉又造了一个概念。给数据或者字节流加一个前缀,让系统方便知道目前所使用的流的格式。
multihash 、multibase、等multi开头的都是这个套路,一类算法给用一个【multi】加一个multi前缀
人类可读工具
给定一个cid自动解析所有字段
http://cid-utils.ipfs.team/#zb2rhe5P4gXftAwvA4eXQ5HJwsER2owDyS9sKaQRRVQPn93bA
已有的实现方式
参考链接
https://github.com/ipld/specs/blob/master/IPLD.md
https://github.com/ipfs/specs/issues/130
https://github.com/ipld/cid/blob/master/original-rfc.md
联系微信:bitwiki