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

已有的实现方式

  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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352