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,它包含四个部分

 ::= 

# or, expanded:

 ::= 

解释

  • multibase-prefix:multibase,一到2个字节用来将CID编码成不同的格式。

  • cid-version:cid版本,用来以后的可能升级用的。

  • multicodec-content-type:是一种多编解码代码,表示要寻址的数据的内容类型或格式。

  • :是一个多哈希值(multihash)格式,表示被寻址内容的加密哈希。多哈希允许CIDs使用许多不同的加密哈希函数,用于升级和协议敏捷性目的。

用到的子协议介绍

Multibase

地址

https://github.com/multiformats/multibase

描述

Multibase是一种用于区分基本编码和其他简单字符串编码的协议,并确保与程序接口完全兼容。它回答了这个问题 : 给定编码为字符串s的数据d,我如何知道用什么基d编码?

我的理解,看名字都可以看出来multi base ,很多加密算法起名字都有base,例如base64 、base32等等~ 这大概也是这个multibase大来源吧!

举例

假设有一个字符串被base16编码编码成了下面一个字符串

4D756C74696261736520697320617765736F6D6521205C6F2F

它的multibase表示是

F4D756C74696261736520697320617765736F6D6521205C6F2F

这里的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)