IPFS之CID

作者: 孔祥子看天下 | 来源:发表于2018-08-01 11:37 被阅读245次

    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

    已有的实现方式

    1. go-cid

    2. java-cid

    3. js-cid

    4. rust-cid

    5. py-cid

    参考链接

    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

    相关文章

      网友评论

        本文标题:IPFS之CID

        本文链接:https://www.haomeiwen.com/subject/tsblvftx.html