ipfs

IPFS之CID

2018-08-01  本文已影响245人  孔祥子看天下

CID是什么

Self-describing content-addressed identifiers for distributed systems(用于分布式系统的自描述内容定位标识符。)

链接:https://github.com/ipld/cid#motivation

为何需要CID,CID解决了什么问题

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

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

运行原理

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

地址

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

上一篇下一篇

猜你喜欢

热点阅读