锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

IPFS、区块链的libp2p

时间:2023-01-27 00:30:00 p784xlf连接器d

IPFS基本定义

IPFS即InterPlanetary File System,基于内容寻址的分布式 新的超媒体传输协议。IPFS支持创建完全分布式的应用程序。它旨在使 网络更快、更安全、更开放。IPFS它的目标是分布式文件系统 将所有计算设备连接到同一文件系统,成为全球统一的存储 系统。 

IPFS与区块链的基本关系

什么是区块链? 区块链实际上是一个基于密码学的分布式账本数据库的分布式数据库。它具有分布式、不可篡改、开放和共识等基本特征。 然而,它有很大的缺点。在开放和共识的基础上,任何笔交易操作都需要复杂的共识机制和证明计算,因此需要大量的计算资源和时间。因此,区块链存储效率低,成本高,需要各链之间的协调,难以协调。而恰巧的是IPFS针对这些问题,可以解决上述缺点,IPFS解决办法是: 可用于存储效率低、成本高的问题IPFS存储文件数据, 唯一永久可用的IPFS地址放置在区块链事务中,而不是数据本身。很难协调各链之间的协调,IPFS它可以帮助不同的区块链网络传输信息和文件。 

IPFS协议栈与TCP/IP协议栈对比

IPFS协议栈分层与TCP/IP协议栈的分层非常相似,本质上IPFS协议与HTTPS协议相似度较高。比较如下图: 

在这里插入图片描述

.
对于IPFS协议栈分为身份层、网络层、路由层、交换层、对象层、文件层和命名层。bitswap是最重要的,是的IPFS协议栈最大的亮点之一是借鉴bittorrent并进行了优化和改进,使其更符合区块链和实际使用场景。
简单对比如下:
两者都在下载数据时不断上传现有数据,因此两者都合理利用客户端,即整个网络分散网络流量,在一定程度上分散传输,避免单点传输的各种缺点。相较于bittorrent,BitSwap不限于种子文件中的数据块。 BitSwap协议中有一个数据交换市场,包括每个节点 这些块数据可能来自文件系统中完全不相关的文件, 与此同时,这个市场的IPFS由网络中的所有节点组成。这样的数据市场需要创建加密数字货币来实现可信价值交换,这也是为了IPFS协议实验室后来启动 Filecoin这是区块链项目的伏笔。这里有一个小广告,所以filcoin不仅有一定的市场价值,值,而且具有一定的存储价值,但我子,啊!
另可参考博文:https://editor.csdn.net/md/?articleId=115839712 及 https://mp.csdn.net/editor/html/115324574

IPFS关键技术及分块简介

底层基础

1. DHT(分布式哈希表)
主要思想:
 全网维护一个巨大的文件索引哈希表,这个哈希表的条目形状就像。这里Key通常是文件的某个哈希算法下的哈希值(也可以是文件名或者文件内容描述), 而Value存储文件IP地址。只需提供查询Key,存储节点的地址可以从表中查询,并返回到查询节点。当然,这个哈希表会分成小块,按照一定的算法和规则分布到整个网络的每个节点。每个节点只需要维护一小块哈希表。这样,节点查询文件时,只要把查询报文路由到相应的节点即可。 

IPFS引用的分布式哈希表分为三类:Kademlia DHT、Coral DHT和S/Kademlia DHT。

(1)Kademlia DHT
基本特性:
1.节点ID使用与关键字相同的值域SHA-11算法生成的160位 摘要大大简化了查询时的信息量,更容易查询。  2. 可以使用XOR,计算两个节点之间的距离或节点与关键字之间的距离。  3. 在查找要求路径时,每个节点的信息都是完整的,只需要进行Log(n)量级跳转。  4. 每个节点需要维护的维护可以根据查询速度和存储量的要求进行调整DHT大小。 
基本原理
KAD网络对我们之前说的话DHT有了很大的改进,一个新的网络节 点在初次连接网络时会被分配一个ID;每个节点自己维护一个路由表和 一个DHT,该路由表保存了网络中部分节点的连接信息,DHT用于存 放置文件信息;每个节点优先保存更近的节点信息,但必须确保 距离在[2n,2 (n 1)-1]所有节点至少保存k个(k我们称之为常数)K- Bucket;每个网络节点都需要优先存储和自己的存储ID距离较小的文件;每次 检索时,计算查询文件的哈希值及其自身ID找到距离,然后找到距离 离对应的K-Bucket,向K-Bucket接受节点查询的节点也是一样的 样的检查,如果您发现您有此数据,请将其返回到查询节点。 

Kademlia 网络的节点ID二叉树由二叉树维护,具有以下特点:

1. 每个网络节点从根节点开始,沿着它最短的唯一前缀到达。(前缀格式与哈夫曼树相比,如左树标1,右树标0)  2. 每个网络节点都在叶节点上ID即最短网络前缀。  3. 在Kademlia中,每个DHT条目包含对。key是文件的哈 希值,value是节点ID。key和value值域相同,160位。每一个 新加入网络的计算机将随机分配节点ID值。数据存放在key值 与ID值最接近key在值的节点上。计算距离的方式为:key值与ID不同或计算值。 
节点路由表K-bucket

节点路由表用于保存与其他节点在一定距离内的连接信息。每条路由信息由以下三部分组成:IP Address、UDP Port、 Node ID。
KAD路由表将距离分为160个K桶(存储K数据的桶),并单独存储。编号为i的路由表存储距离[2i, 2(i 1)-K条路由信息。 而且每个K桶的内部信息存储位置都是按照上次看到的时间顺序排列的,最早看到的放在头上,最后看到的放在尾上。因为网络中的节点可能是在线或离线的,而以前经常在线的节点在需要访问的时候更容易在线,所以我们会优先考虑它(尾部的节点)。
当节点x收到消息时,发送者yIP地址用于更新相应的地址K 桶,具体步骤如下:

 1)计算自己和发送者ID距离:d(x,y)=x⊕y。    2)通过距离D选择相应的K桶进行更新。    3)如果y的IP如果地址已经存在于这个K桶中,则将相应项目移动到这个K桶中 尾部;如果yIPK桶中没有记录地址:     ①如果K桶的记录项小于k,则直接将y的记录项(IP address,UDP port,Node ID)将信息插入队列尾部。     ②如果k桶的记录项大于k,则选择头部的记录项(如果是节日) 点z)进行RPC_PING操作:        如果z没有响应,将z的信息从K桶中删除,并将y的信息插入队列 尾部。        如果z有响应,将z的信息移到队列尾部,同时忽略y的信息。 

K桶的更新机制非常有效地实现了最近看到的节点更新的策略 略,除非在线节点从未从K桶中移出。也就是说,在线时间长的节点 在K桶列表中保留点的可能性更大。

路由查询机制
假如要找到节点xID值t的节点,Kad 路由搜索按以下递归操作步骤进行: 1)计算t的距离:d(x,t)=x⊕t。  2)从x的第log(d)在K桶中取出节点信息,同时进行FIND_NODE操作。如果k桶中的信息少于k,则从附近的多个k桶中选择最接近d的总k节点。  3)如果发现自己是接收查询操作的每个节点,t,则回答自 自己最接近t;否则,测量自己与t的距离,从相应的K桶中选择 给出一个节点的信息x。  4)x重新执行新接收到的每个节点FIND_NODE操作,这个过程不断重复,直到每个分支都有节点响应,最接近t。  5)通过上述搜索操作,x获取最接近t的k个节点信息。 

注意:这里强调的是k最接近t的节点信息,而不是完全相等的信息,因为 网络可能根本不存在ID为t节点。

加入和离开节点

若要添加节点uKAD网络,它必须和一个已经在一起了KAD网络中的节 点,比如w,取得联系。u首先,将w插入自己合适的K桶,对自己进行节约 点ID执行一次FIND_NODE操作,然后根据收到的信息更新自己K 桶内容。通过逐步从近到远查询相邻节点,u完成后还是空的 构建K桶信息,同时将自己的信息发布到其他节点的K桶中。在 KAD在网络中,每个节点的路由表都是二叉树,叶节点是K 桶,K桶储存相同ID前缀的节点信息是K桶 二叉树的位置。这样,每个K桶都被覆盖了ID空间的一部分,所有K桶 信息加起来覆盖了整个160bit的ID没有重叠的空间。
路由表的生成过程如下:

1)最初,u路由表为单个K桶,覆盖160bit ID空间。  2)学习新节点信息后,u会尝试将新节点信息根据其前缀值插入相应的K桶。  ①如果K桶不满,新节点直接插入K桶;  ②K桶已满:果该K桶覆盖范围包含了节点u的ID,则把该 K桶分裂为两个大小相同的新K桶,并对原K桶内的节点信息按照新的K 桶前缀值进行重新分配;如果该K桶覆盖范围没有包含节点u的ID,则直接丢弃该新节点信息。
 
3)上述过程不断重复,直到满足路由表的要求。达到距离近的节点的信息多、距离远的节点的信息少的结果,这样就保证了路由查询过 程能快速收敛。

节点离开KAD网络不需要发布任何信息,等待节点离线的时间足够 长,其他网络节点访问它失效后,便会自动将其移出各自的路由表,那 么这一节点也就离开了。

(2)Coral DSHT

Coral DSHT则是Coral CDN(内容分发网络)最核心的部件之一,内容分发网络即在网络部署一些节点服务器,并且建立一套虚拟网络。网络中节点服务器之间实时更新连接信息、延时信息、用户距离参数等,然后将用户的请求重定向到最适合的节点服务器上。

基本思想
Coral首先对所有的节点评估连接 情况,然后根据循环时间(Round-Trip Time)划分为几个等级(Coral 中是3层),L2(<20ms)、L1(<60ms)、L0(其他)。Coral还提供了两个操作接口,put和get,用于添加和查找一个键值对,以确定从哪一个等级的DSHT中查询。

Coral DSHT(Distributed Sloppy hash table)适用于软状态的键值对 检索,也就是同一个Key可能会保存多个Value。
KAD DHT与Coral DSHT对比
1、Coral DSHT依据实际使用情况和情景增加了等级划分操作。

2、二者的键值对均是SHA-1计算所得,均为160bit

3、Coral DSHT增加了Sloppy存储机制,用于解决单点访问过热(Hot-Spot)及一个缓存键值对存储过多的值(Tree-saturation),Coral DSHT增加了两种异常状态,Full(在当前节点R,已经存在L个对使得Key=k,并且这L 个键值对的生存周期都大于新值的1/2)和Loaded(对于给定 的Key=k,在过去的一分钟里已经收到超过特定次请求),Coral 在执行存储时,会执行一下操作:
   1)向前查询:持续查找距离key更近的节点ID,每个节点返回该节点是否被加载及对于该key值节点存储了多少个value值及该值的有效期。若查找异常,则截至,否则,将连续节点的信息存入栈中。
   2)反向查询:客户端从第1步中得到了可以存放的节点列表。 那么按照距离Key从近到远的顺序,依次尝试添加对到这些 节点。如果操作失败,比如在此时有其他节点也进行了插入,这一节点 成为FULL状态,那么客户端将放弃存储这一节点,将其从堆栈内弹 出,并尝试下一个节点,直到被成功存储。
(3)S/Kademlia DHT

S/Kademlia DHT是在Kademlia协议的基础上增加了安全机制(安全的节点分配策略、不相交路径查找算法),其在节点ID中加入隐式身份认证和兄弟广播 (sibling Broadcast),故而可以抵御常见的日蚀攻击 (eclipse attack)和女巫攻击(Sybil attack)。

2. 块交换协议(BitTorrent协议)

IPFS的核心协议bitswap协议便是基于块交换协议改进而来的,在此,做简单介绍:
bitTorrent协议是一种内容分发协议,采用内容分发和点对点技术,每个客户端在下载的过程中也在不断的上传自己所拥有的别人请求的资源,否则将被终止下载。因而每个客户端在下载的过程中也在逐渐成为服务端,这有效的利用了网络资源和分散中心服务器的压力。

相关术语介绍:
torrent:它是服务器接收的元数据文件(通常结尾是.Torrent)。 这个文件记录了下载数据的信息(但不包括文件自身),例如文件名、 文件大小、文件的哈希值,以及Tracker的URL地址。

tracker:是指互联网上负责协调BitTorrent客户端行动的服务器。 当你打开一个torrent时,你的机器连接tracker,并且请求一个可以接触 的peers列表。在传输过程中,客户端将会定期向tracker提交自己的状 态。tracker的作用仅是帮助peers相互达成连接,而不参与文件本身的传 输。

peer:peer是互联网上的另一台可以连接并传输数据的计算机。通 常情况下,peer没有完整的文件。peer之间相互下载、上传。

seed:有一个特定torrent完整拷贝的计算机称为seed。文件初次发 布时,需要一个seed进行初次共享。

swarm:连接一个torrent的所有设备群组。

Chocking:Chocking阻塞是一种临时的拒绝上传策略,虽然上传停 止了,但是下载仍然继续。BitTorrent网络下载需要每个peer相互上传, 对于不合作的peer,会采取临时的阻断策略。

Pareto效率:帕累托效率(Pareto efficiency)是指资源分配已经到 了物尽其用的阶段,对任意一个个体进一步提升效率只会导致其他个体 效率下降。此时说明系统已经达到最优状态了。

针锋相对(Tit-fot-Tat):又叫一报还一报,是博弈论中一个最简 单的策略。以合作开局,此后就采取以其人之道还治其人之身的策略。 它强调的是永远不先背叛对方,除非自己被背叛。在BitTorrent中表现 为,Peer给自己贡献多少下载速度,那么也就贡献多少上传速度给他。

文件分发过程

1. 新的文件发行,需要从seed开始进行初次分享。首先,seed会生成一个扩展名为.torrent的文件,它包含如下信息:文件名、大小、 tracker的URL。

2. 一次内容发布至少需要一个tracker和一个seed,tracker保存文件信息和seed的连接信息,而seed保存文件本身。一旦seed向tracker 注册,它就开始等待为需要这个torrent的peer上传相关信息。

3. 通 过.torrent文件,peer会访问tracker,获取其他peer/seed的连接信息,例如 IP和端口。

4. tracker和peer之间只需要通过简单的远程通信,peer就能使用连接信息,与其他peer/seed沟通,并建立连接下载文件。

5. 文件拷贝采取分块交换的原则和片段选择算法,其中分块将文件切分为大小固定的块,这样方便跟踪节点已经下载的数据,另使用SHA-1算法验证完整性。而片段选择算法有助于我们合理的选择下载片段,提高下载速度和性能,片段选择遵循一下算法:优先完成单一片段、优先选择稀缺片段、第一个片段随机选择、结束时取消子片段请求。

6. 为了使整个P2P系统里的参与节点都遵守规矩合理的运行,bittorrent增加了阻塞策略对那些只下载不上传或者恶意上传或是进行攻击的伪节点进行”限行“操作。(最优阻塞,反对歧视、完成后上传)
3. git

git在此不做详述

4. 自验证文件系统(SFS)
SFS即自验证文件系统(Self-Certifying File System,SFS),它将公钥信息嵌入文 件名中,这个做法命名为“自验证文件名”。
SFS核心思想:
1. SFS文件系统具备自验证路径名称,不需要在文件系统内部实现密 钥管理。

2. 在SFS上易于架设各种密钥管理机制,包括各类组合机制。

3. SFS将密钥管理与密钥分发解耦。

4. 实现全球范围的文件系统。
5. Merkle DAG和Merkle Tree

基本定义:

Merkle Tree则用于区块链交易的验 证。Merkle Tree通常也被称为哈希树(Hash Tree),顾名思义,就是存 储哈希值的一棵树;而Merkle DAG的全称是Merkle Directed Acyclic Graph(默克有向无环 图)。

二者对比:

1. 从对象格式上,Merkle Tree的叶子是数据块(例如,文件、交易) 的哈希值。非叶节点是其对应子节点串联字符串的哈希。Merkle DAG 的节点包括两个部分,Data和Link;Data为二进制数据,Link包含 Name、Hash和Size这3个部分。

2. 从数据结构上看,Merkle DAG是Merkle Tree更普适的情况,换句话说,Merkle Tree是特殊的Merkle DAG。从功 能上看,后者通常用于验证数据完整性,而前者大多用于文件系统。

3. Merkle DAG不需要进行树的平衡操作、非叶子节点允 许包含数据等。	

4. Merkle DAG在功能上与Merkle Tree有很大不同,上面我们提到 Merkle Tree主要是为了验证,例如验证数字签名,以及比特币Merkle Proof。而对于Merkle DAG,它的目的有如下:
  	 内容寻址:使用多重Hash来唯一识别一个数据块的内容。
     防篡改:可以方便地检查Hash值来确认数据是否被篡改。
     去重:由于内容相同的数据块Hash值是相同的,很容易去掉重复 的数据,节省存储空间。

Merkle Tree特点:

	1)Merkle Tree的叶子节点的value是数据集合的单元数据或者单元 数据Hash。
	
	2)非叶子节点的value是根据它下面所有的叶子节点值,按照哈希 算法计算而得出的。
	
	3)通常,使用哈希算法(例如:SHA-2和MD5)来生成数据的Hash 值。但如果目的仅仅是防止数据不被蓄意的损坏或篡改,可以使用安全 性低但效率高的校验算法,如CRC。
	
	4)Merkle Tree是一种树,大多数是二叉树,也可以是多叉树。因而其具有所有树结构所具有的特点。

Merkle Tree和Hash List的主要区别:

1. Hash List是一棵扁平树,只有下载整个Hash List才能验证数据的完整性

2. Merkle Tree可以直接下载并立即验证 Merkle Tree的一个分支。因为可以将文件切分成小的数据块,这样如果 有一块数据损坏,仅仅重新下载这个数据块就行了。

Merkle Tree应用:

1. 数字签名:高效的数字签名框架,即 Merkle签名方法。

2. P2P网络:在P2P网络中,Merkle Tree用来确保从其他节点接收的 数据块没有损坏且没有被替换,甚至检查其他节点不会欺骗或者发布虚 假的块。

3. 比特币:Merkle Proof最早的应用是Bitcoin(比特币),它是由中 本聪在2009年描述并创建的。Bitcoin的Blockchain利用Merkle proofs来存 储每个区块的交易。而这样做的好处也就是中本聪描述到的“简化支付 验证”(Simplified Payment Verification,SPV)的概念:一个“轻客户 端”(light client)可以仅下载链的区块头,即每个区块中的80字节的数 据块,仅包含5个元素,而不是下载每一笔交易以及每一个区块。5个元 素为上一区块头的Hash值、时间戳、挖矿难度值、工作量证明随机数 (nonce)以及包含该区块交易的Merkle Tree的根Hash。Bitcoin的轻客户端有它的局限。一个局限是,尽管它可以证明包含 的交易,但是它不能进行涉及当前状态的证明(如数字资产的持有、名 称注册、金融合约的状态等)。

BitSwap协议

在IPFS中,数据的分发和交换使用BitSwap协议。受到BitTorrent技术的启 发,每个节点在下载的同时不断向其他节点上传已下载的数据。BitSwap协议主要负责两件事情:向其他节点请求需要的数据块列表(want_list),以及为其他节点提供已有的数据块列表(have_list)。当我们需要向其他节点请求数据块或者为其他节点提供数据块时, 都会发送BitSwap message消息,其中主要包含了两部分内容:想要的数据块列表(want_list)及对应数据块。在BitSwap系统中,有两个非常重要的模块——需求管理器(Want- Manager)和决策引擎(Decision-Engine):前者会在节点请求数据块时在本地返回相应的结果或者发出合适的请求;而后者决定如何为其他节点分配资源,当节点接收到包含want_list的消息时,消息会被转发至决策引擎,引擎会根据该节点的BitSwap账单决定如何处理请求。

当进行一次BitSwap数据交换时节点需要经历以下四个状态:

1. 状态开放(open):对等节点间开放待发送BitSwap账单状态,直到建立连接;
   当节点建立连接时,发送方节点初始化BitSwap信用账单,保存一份对等方的账单或者创建一个新的被清零的信用账单,这取决于节点信 用账单一致性。之后,发送方节点将发送一个携带账单的open信息通知 接收方节点,接收方节点接收到一个open信息之后,选择是否接受此连 接。如果接收方根据本地的信用账单数据,发现发送方是一个不可信的 节点,例如传输超时、信用分较低、债务率较高等,则接收方会通过 ignore_cooldown忽略这个请求,并且断开连接,目的是防范作弊行为。 如果连接成功,接收方将用本地信用账单来初始化一个Peer对象, 并更新last_seen时间戳。然后,它会将接收到的账单与自己的账单进行 比较。如果两个信用账单完全一样,那么这个连接就被开放;如果账单 不完全一致,那么此节点会创建一个新的被清零的信用账单,并发送同 步此信用账单,以此保证发送方节点和接收方节点的账单一致。
   
2. 数据发送(sending):节点间发送want_list和数据块;
   当连接已经处于开放状态时,发送方节点将会把want_list广播给所 有连接的接收方节点。与此同时,接收方节点在收到一个want_list后, 会检查自身是否有接收方想要的数据块。如果有,会使用BitSwap策略来发送传输这些数据块。发送块的方法逻辑很简单,默认发送方节点只传输数据块,接收到 所有数据后,接收方节点计算Multihash以验证它是否与预期的匹配,然 后返回确认。在完成块的传输后,接收方节点将数据块信息从need_list 移到have_list,并且接收方和发送方都同步更新他们的账单列表。如果 传输验证失败,则发送方可能发生故障或存在故意攻击接收方的行为, 接收方可以拒绝进一步的交易。

3. 连接关闭(close):节点发送完数据后断开连接;
   对等连接应该在两种情况下关闭:1)silent_wait已超时,但未收到来自对方的任何消息(默认BitSwap使 用30秒),节点发出Peer.close(false)。2)节点正在退出,BitSwap正在关闭,在这种情况下,节点发出 Peer.close(true)。

4. 节点忽略(ignored):节点因为超时、自定义、信用分过低等因素被忽略。

BitSwap有自己的信用体系:通常情况下,一个节点给其他节点发送数据会增加信用积分,而下载数据则会降低信用积分,当信用积分低于一定的值时,则将会其他节点忽略,并被迫停止下载。常用的BitSwap信用体系策略有:

1. BitSwap账单,当两个节点建立连接时,节点间会相互交换账单信息,若是账单信息不匹配,则直接删除账单并重新建立账单,若是一个节点账单总是不匹配,则该节点会被认为是恶意节点,则拒绝与其交易。
6. IPFS对象层、文件层和命名层

IPFS对象层主要的数据结构为Merkle DAG,基于Merkle DAG,其提供以下基本功能:

1. 内容可寻址:所有内容由多重哈希校验并唯一标识。

2. 防止篡改:所有内容都通过哈希验证,如果数据被篡改或损坏, 在IPFS网络中将会被检测到。

3. 重复数据删除:保存完全相同内容的所有对象都是相同的,并且 只存储一次。这对于索引对象特别有用。

4. 对象级别的加密。

而IPFS的文件层则是Git功能的Copy与根据实际的使用场景的改进。故而其具有与Git类似的版本和数据变更的记录。
而至于IPFS的命名层则是为了解决当数据对象的内容更新后,同时发生改变的还有内容地址的名称所带来的存储问题。为了解决这个问题,IPFS协议实验室研发了IPNS星际文件命名系统模块。虽然IPNS是重新命名地址的良好方式,但是对用户来说,却不是十分友好和利于记忆的,因为它使用很长的哈希值作为名称,这样的名称很难被记住,故而IPFS增加了对等节点链接(遵循自验证文件系统(SFS)的设计理念,用户可以将其他用户节点的对象直接链接到自己的命名空间下。这也有利于创建一个更可信的网络)、DNS TXT IPNS记录(在现有的DNS系统中添加TXT记录,这样就能通过域名 访问IPFS网络中的文件对象了)以及短地址的命名服务(类似我们现在看到的 DNS和WebURL链接)来改善用户友好度。

IPNS星际文件命名系统模块属于自验证命名系统,使用自验证的命名方案给了我们一种在加密环境下、在全局命名空间中,构建可自行认证名称的方式。模式如下:

1. 通过NodeId=hash(node.PubKey),生成IPFS节点信息。

2. 给每个用户分配一个可变的命名空间,由之前生成的节点ID信息 作为地址名称,在此路径下:/ipns/。

3. 一个用户可以在此路径下发布一个用自己私钥签名的对象,比 如: /ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/。

4. 当其他用户获取对象时,他们可以检测签名是否与公钥和节点信 息相匹配,从而验证用户发布对象的真实性,达到了可变状态的获取。

IPFS模块解析

在IPFS的诸多特性里,很多重要特性都是由3个工程模块库集成而 来的,这3个组件分别是Multiformat(自描述格式协议库)、 libp2p(P2P网络协议模块库)和IPLD(数据结构模型库),它们被设 计为轻耦合的堆栈模型,模块之间互相协同,也能保证一定的独立性,以下分别做介绍:

Multi-Format

Multi-Format是IPFS内的自描述格式协议组件,它是为了解决各种编程语言或数据类型难以详细区分而诞生的。该组件的定义要求如下:

1)一个自描述文件或者变量,必须在它的值内描述自己,不能从 函数、外带参数、文档甚至是隐式信息中体现。

2)考虑到效率,自描述协议必须保持数据的紧凑性。

3)自描述协议要有可读性。

当前Multi-Format支持下述图中五类协议,简介和对比如图:

libp2p

libp2p是IPFS协议栈工程实现中最为重要的模块。负责IPFS数据的网络通信、路由、交换等功能。它高度抽象了 主流的传输协议,使得上层应用搭建时完全不必关注底层的具体实现, 最终实现跨环境、跨协议的设备互联,其在IPFS中的功能如下图所示:

libp2p抽象集成了所有开发者基本都需要的一些工具属性功能,这些工具的功能主要包括:节点之间的链接复用、节点信息之间的互相交换、指定中继节点、网络地址转换(NAT)、分 布式哈希表(dht)寻址、消息往返时延(RTT)统计等。

libp2p核心组件

核心组件如下图所示:

libp2p核心流程(初始化节点、监听、拨号)
  1. 初始化节点。配置基本信息,如支持的传输协议,构建地址本、生成host信息等。

  2. 节点监听。监听过程是从初始链接 到用户可用链接的过程,filter到私网链接到构建加密传输到选择多路复 用协议再到conn这一流程就是upgrader的过程。首先在底层建立了一个 TCP的监听器,然后在这个监听器会分配一个链接,然后将该链接转换 为对应的multi-addr格式,随后对该链接进行升级。首先使用filter进行地 址过滤满足条件则进行私网连接,进而握手并构建加密传输。通过协商 与对方协商构建多路复用器。upgrader的链接构建完成后有两个分支, 一个分支需要异步处理新链接。另一个是在这个链接上面启动一个 stream监听器,加入网络管理。

  3. 节点拨号。首先节点会发起一个stream,并根据底层是否已经存在连接判断是否需要建立新的连接。同时不管又有多少个拨号请求,最终发出的只有一个。接着过滤掉无效地址,然后对有效地址同时进行拨号申请,对于每个需要拨号的地址 来说,建立对应的传输之后,就与监听过程类似了。

libp2p数据交换过程(数据交换层)

libp2p的用途

讲了那么多原理,对于一个经验丰富的开发者来说,或许他已经想到了libp2p的各种应用场景了,那么,libp2p有那些应用场景呢,如下:

  1. 对于物联网场景来说,P2P连接是很重要的一环。比如, 在安防场景,安防摄像头与手机之间最好建立直连连接。如此可以大幅 度减轻中央服务器的带宽压力。libp2p可以帮助其完成链路上的连接工 作,同时可以完成诸如NAT打洞(目前尚未实现,但正在完善中)、流 量及RTT统计、长链接、流式加密传输、服务端主动和终端通信等工 作。此外,libp2p在车联网领域也有适合的应用场景。由于该场景中终 端设备会不断在各种网络之间进行切换,导致其IP地址信息不断发生变 化。libp2p基于节点ID的链接方式及DHT路由发现机制,可以解除底层 物理链接与上层逻辑的耦合。随着互联网的发展,应用规模越来越大, 如何有效且快速地分发信息(如抖音与快手的关注视频、直播平台的实 时推流等),同时降低中心化服务器的压力,是未来网络技术发展的一 个重要方向。
  2. 区块链:在区块链领域里面已经有项目利用libp2p作为自己的底层服务,比如之前多次提到的Filecoin。在“区块数据同步”“文件传输”“节点查找”等核心环节都使用了libp2p。还有Polkadot(波卡链)项目,作 为可能成为区块链3.0的开辟者,为了兼容现有的诸如以太坊等主链而采用异构多链架构,更要考虑终端设备的复杂场景,因此选择使用 libp2p作为其底层传输层,利用libp2p在各个模块中的高度抽象带来的灵活性及可扩展性,来避免因区块链技术发展而导致的不兼容问题。
  3. 分布式消息:分布式消息系统,可以不通过中心服务器的中转功能,直接在节点之间建立连接,用于消息的发送和接收。去除了中心化服务器,可以有效防止单点失效、网络攻击。
  4. 传输文件:Filecoin和IPFS是基于libp2p来进行数据传输的。对于点对点文件传输,libp2p将有非常广泛的应用场景。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章