IPFS技术系列之IPFS模块解析

前言

本文主要介绍IPFS的三大组成模块,包括Multiformat(自描述格式协议库) 、libp2p(P2P网络协议模块库) 和IPLD(数据结构模型库),它们之间相互协同,同时也保持一定的独立性

一、Multiformat

Multiformat 是IPFS中的自描述格式协议组件,它用以解决各种编程语言或数据类型难以详细区分的问题。它采用的方式是在数据上添加自描述的字段,只需要在字段上判断数据的属性即可。
Multi-Format目前支持以下5种协议:

1.Multi-hash

Multi-Hash具有一下特点:
1.Multi-Hash会提示用户,比如一些哈希值可能不再安全,有被破译的风险。
2.让更新哈希算法变得更加简单,更容易规范化哈希算法的类型和哈希值的长度。
3.绝大多数工具不再需要对哈希做任何检查。
Multi-Hash格式
Multi-Hash的格式保存了3类信息,分别是类型type、长度length和哈希值。命名格式为(type-length-value)

<Multi-Hash> ::= <type-哈希类型><长度><哈希值>

从Multi-Hash的格式可以看出,它为我们的使用带来了诸多好处。
1.拿到一个哈希值,可以通过这个值都前两字节判断出它得加密方式。
2.为以后更新系统的加密算法提供了便利。
3.不占用太多额外都空间。
Multi-Hash记录了100余中常见都哈希类型,这些哈希算法名称和十六进制编号可以通过表格查询

2.Multi-Base

  Multi-Base 是自描述基础编码协议,用来保存数据并描述该数据是如何编码的,它可以自由选择输入和输出的编码类型,其他程序也能通过该值获取到其编码类型。
Multi-Base的格式存有两类信息,分别是编码代号type和编码数据value,在这里它不需要定义长度,只需要1字节类区分各种类型。

<Multi-Base> ::= <type编码类型><编码内容>

Multi-Base的好处在于,使用者可以快速分辨出各类编码方式,并且能通过调用Multi-Base在各类编码方式中转换。
Multi-Base 也拥有自己的映射检索表。如下图:

3.Multi-Addr

  Multi-Addr 组建的目的在于把自描述的信息添加到地址数据中。Multi-Addr分为两个版本,一类是具有可读性的UTF-8编码的版本,用来向用户展示;另一类是十六进制版本,方便网络传输。
  Multi-Addr的格式也有两类信息,分别是地址类型代号type和编 码数据value,每个Multi-Addr都由type/value形式循环表示,形如:/地 址类型代号/地址/地址类型代号/地址

<UTF-8 Multi-Address> ::= /<UTF-8 type-地址类型>/<UTF-8地址>

Multi-Addr拥有如下的函数类型表,已经整合到Multi-Formasts中。

4.Multi-Codec

Multi-Codec是为了使得数据更加紧凑地自描述都编码解码器。
除了定义了Multi-Hash、 Multi-Addr、Multi-Base等数据类型以外,Multi-Codec还定义了JSON文 件类型、压缩类型、图片类型及IPLD。
Multi-Code的格式如下:

<Multi-Codec> ::= /<十六进制 type >/<数据内容>

Multi-Codec与前面几类Multi-Formats是相互兼容的,因为在设计Multi-Codec表格时,已经考虑避开了前面已经 占用的代码。
正如前面所说,Multi-Codec定义了多种类型的数据,包括原始数据、IPLD数据、区块链数据、序列化数据和其他一些Multi-Formats。
如下图:

5.Multi-Stream

Multi-Stream是自描述编码流协议,用于实现自描述的位串,其主要场景主要是在网络中传输。
Multi-Stream包含3个字段,分别为流长度、Multi-Codec类型和编码 数据本身,之间使用两个分隔符分隔开。
Multi-Stream格式如下:

<Multi-Codec> ::= <流长度length>/<Multi-Codec type>\n<编码数据>

二、libp2p

libp2p是IPFS协议栈工程实现中最为重要的模块
libp2p负责IPFS数据的网络通信、路由、交换等功能
  libp2p抽象集成了所有开发者基本都需要的一些工具属性功能。包括节点之间的链接复用; 节点信息之间的互相交换;指定中继节点;网络地址转换(NAT);分 布式哈希表(dht)寻址;消息往返时延(RTT)统计等。如下图:

在如图的属性功能中,协议实验室和开源社区的贡献者都做了一定的实现,并且规划了长远的目标。
如下图:

用途:
libp2p是一个专门为P2P应用而 设计的多模块、易扩展网络堆栈库,其应用场景主要集中于物联网、区 块链、分布式消息以及文件传输这几个方面。
1.物联网:如我们的熟知都安防场景,安防摄像头与手机之间建立直连连接,从而减轻中央服务器的带宽压力。
2.区块链:在区块链领域也有一些项目利用libp2p作为自己的底层服务。比如Filecoin和Polkadot(波卡链)项目。
在Filecoin的“区块数据同步”“文件传输”“节点查找”等方面都用到了libp2p。
3.分布式消息:分布式消息系统,可以不通过中心服务器的中转功能,直接在节点之间建立连接,用于消息的发送和接收。
4.传输文件:Filecoin和IPFS都是基于libp2p来进行数据传输的。

三、IPLD

IPLD是基于内容寻址的数据模型的抽象层,IPLD能够连接起各类 以内容寻址为主的数据结构,比如区块链数据、Git、BitTorrent等
【IPLD数据模型】
IPLD定义了3种数据类型:默克尔链接(Merkle-Links)、默克尔有向无环图(Merkle-DAG)和默克尔路径(Merkle-Paths)。
默克尔链接
默克尔链接主要有两个功能:
1.加密完整性验证 :用户可以通过对目标对象的哈希来测试数据 的完整性。
2.数据结构不可改变 :带有默克尔链接的数据结构在引用后不可 以改变。

【内容识别符(CID)】
CID是一种自描述的内容寻址标识符,它使用哈希来实现内容寻址。
CID目前有 两个版本,分别为CIDv0和CIDv1。CIDv0只适用于IPFS 默认的编码规则和加密算法。而CIDv1适应算法和编码规则大大增加。
1.CIDv1
CIDv1包含4个字段,分别为multibase类型前缀代码,cid版本号, multi-codec内容识别符,完整的multihash。
CIDv1格式如下:

<cidv1> ::= <multibase type><cid-版本号><multicodec><multihash>

2.CIDv0
CIDv0的定义方式和CIDv1是一样的。只不过CIDv0中,Multi-Base类型代号默认为Base58,CID版本 号默认为0,Multi-Codec默认Protobuf。

总结

本文主要对IPFS的几个模块做一下简单介绍,包括Multiformat(自描述格式协议库) 、libp2p(P2P网络协议模块库) 和IPLD(数据结构模型库。

猜你喜欢

转载自blog.csdn.net/ggj89/article/details/122583098