LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 新闻观点 > 链动精灵丨揭秘IPFS数据交换模块Bitswap

链动精灵丨揭秘IPFS数据交换模块Bitswap

2021-01-11 链动精灵科技 来源:区块链网络

链动精灵丨揭秘IPFS数据交换模块Bitswap

IPFS是一个旨在创建持久且分布式存储和共享文件的网络传输协议,与传统的文件系统不同的是它是一种基于内容寻址的点对点超媒体发布协议。IPFS网络中的节点构成一个分布式文件系统网络,其中BitSwap是IPFS对的核心模块,主要负责网络中其他节点之间和发送数据块。

BitSwap是IPFS网络中定义数据块交换方式的一种协议,是一种基于统一格式的消息对等协议,有别于request、response方式的协议。简答的说就是IPFS请求和响应的消息都使用同一类型的消息包。由于在IPFS网络中,所有Peers都是对等节点,不存在BitTorret中那样的Tracker服务器,所以通信的方式更加简单。

BitSwap协议还定义了如何请求数据、如何发送数据以及向谁发送数据等策略,每个节点都可以有自己的策略,作为数据交换的核心模块,BitSwap使用一些预定义的激励机制来促进网络中数据的流动,通过一个点对点之间的传输记录账本来达到互惠的目的。

IPFS每一个节点都维护了两个列表:

·已有的数据块(have_list)

·想要的数据块(want_list)

当两个节点建立连接后,他们会根据hava_list和want_list互通有无。跟BitTorrent不一样的是:BitSwap获取数据块的时候不限于从同一个torrent里面。也就是说BitSwap可以从不属于本文件的其他文件获取数据块(只要数据块的哈希值一样,数据内容必然是一样的),从全局考虑,这使得BitSwap的效率相比于BitTorrent更高。

我们知道,对于p2p网络,有一个很重要的问题是:如何激励大家分享自己的数据?用过迅雷、BitTorrent、emule等p2p软件的读者应该都知道,如果只下载不上传的话,很快你的节点就无法下载数据了或者下载数据变得很慢。每一个p2p软件都实现了自己的数据分享策略。IPFS也不例外。

步骤如下:

图1

IPFS将文件分解为称为block的数据块,这些块由内容标识符(CID)标识。

IPFS文件内容存储在不同的节点上,每个节点存储root block,少量节点存储完整文件数据,大部分节点存储部分文件block。因为block分散存储在不同节点,Bitswap协议解决了从多个节点高效获取全部数据块的问题

图2?多节点文件存储示意图

总体架构

本文基于Bitswap v0.3.3版本进行分析。

IPFS向Bitswap获取block,Bitswap是IPFS exchange接口的具体实现,负责完成IPFS网络数据交换功能。

图3?Bitswap组件架构图

Bitswap协议内容比较繁琐,为了降低实现复杂度协议划分为block请求模块、block发送模块、会话管理模块、block提供者发现模块、网络模块等。

Bitswap模块负责接收新的消息并且提供对外数据交换接口。

session管理模块用来管理多个session,每个session管理一组文件的下载,来提高下载效率。

block发送模块负责管理向其它节点发送数据块。block请求模块负责管理数据块的请求。block提供者发现模块负责通过DHT网络发现网络中的数据块,通常session找不到已拥有所需block的节点时会调用此模块进行数据块发现。

协议概述

为了完成节点间block交换,Bitswap定义了通信消息及通信协议。

图4

Bitswap消息处理流程:

1、IPFS请求文件区块,Bitswap发送want-have消息携带CID1信息到连接的所有节点。节点根据自己是否有CID1文件块返回have或dont-have消息。

2、client向拥有CID1的节点发送want-block消息,节点返回相应的block消息。

3、当没有节点有请求的block,Bitswap广播want-have到所有的连接节点,或者通过DHT查找拥有文件区块的节点。

IPFS 网络中使用 Bitswap 协议获取数据块一个最大的特点是,请求的数据块是跨文件的,这个是跟 BitTorrent 最大的区别所在,因为在 BitTorrent 中,块请求都是基于文件的,一个 Peer Swarm 都是对同一个文件(目录)进行数据传输。而在 IPFS 中,由于数据请求是基于块的,任何类型的数据块,只要其哈希值一样,都可以拿为己用,一个 Peer Swarm 对应的是整个 IPFS 网络中的数据,因此所有的数据块都可以被用来使用,实现真正的跨文件数据交换。这不仅大大减少了数据的冗余,还大大提高的块检索的效率。显然,BitSwap 的效率比 BitTorrent 更高。

模块详解

▲?Bitswap模块

Bitswap模块负责接收新消息并且实现对外的数据交换接口。

当接收到新消息后,Bitswap处理流程:

1、记录有关消息的一些统计信息

2、通知发送模块wants消息,这样数据发送模块可以根据实际情况向需求节点发送响应消息。

3、通知发送模块任何收到的blocks,发送模块根据节点的需求列表可以将接收到的块发送给任何需要它们的节点

4、向SessionManager通知接收到的blocks,HAVEs和DONT_HAVEs消息,这样SessionManager可以通知消息相关的session。

Bitswap通过Facade Pattern 提高了模块使用的便利性,使得Bitswap子系统的用法变得简单,避免了IPFS和Bitswap的高度耦合。

▲?Session管理模块

session管理模块用来管理多个数据块下载session,每个session管理一组文件的下载。

当SessionManager收到新消息时,它将

1、通知BlockPresenceManager组件跟踪每个block。

2、通知对接收到的block感兴趣并想要的Sessions。

3、通知PeerManager组件收到的block,PeerManager检查是否有任何wants被发送到节点以接收已经收到的块。?如果是这样,它将向那些节点发送“CANCEL”消息,防止其它节点重复发送消息。

Session管理模块通过协调多个session的数据需求来提高数据交互的效率,避免数据块的重复请求、发送。

▲?Session模块

Session管理一组文件的下载,用来提高一组文件块,比如单个文件下载效率。当IPFS调用Bitswap时,Bitswap会创建一个新的Session并调用Session的相应方法,比如GetBlocks()获取blocks。Session会管理一个节点列表,数据获取过程只会向session中的节点获取数据,而不是所有的连接节点。当Session中的节点都没有某个block时,Bitswap才会通过DHT获取具有block的节点并加入session。

由于session刚开始没有任何节点,处于“discovery”模式。当IPFS最初从session请求block时,该session处理流程如下:

1、通知SessionInterestManager组件它感兴趣的block。

2、通知sessionWantManager 组件需要的block。

3、通知PeerManager组件向连接节点发送“want-have”消息,以发现哪些节点有需要的block。

4、查询ProviderQueryManager组件以发现哪些节点具有该block。

当session收到带有“ HAVE”或“ block”的消息时,它将通知SessionPeerManager组件。

当session收到带有“ block”的消息时,它将通知SessionInterestManager组件。

一旦session具有节点,就不再处于“discovery”模式。当IPFS请求后续block时,session将通知sessionWantSender组件。sessionWantSender组件通知PeerManager组件向会话中的节点发送“ want-have”和“ want-block”消息。

对于session所需的每个block,sessionWantSender组件通过与BlockPresenceManager组件核对哪些节点已为该block发送了“ HAVE”,来确定哪个节点最有可能拥有该block。如果多个节点发送过“ HAVE”,则会根据先前请求回复速度来选择节点。

由于DHT内容发现速度慢并且网络带宽消耗大,session通过向一组含有目标数据块可能性大的节点获取数据,从而大大提高了数据块获取的效率。

▲?Block发送模块

block发送模块负责管理向其它节点发送数据块,包含节点需求管理组件(Ledger)和消息发送任务队列(PeerTaskQueue)。

Engine是block发送模块的处理类,当Engine被告知有新的wants时

1、将want添加到Ledger,Ledger会存储每个节点的需求列表。

2、检查blockstore中的相应block,并将任务添加到PeerTaskQueue组件。如果block库没有想要的block,则添加“DONT_HAVE”任务;如果blockstore有block,对于“want-have”添加了“HAVE”任务,对于“want-block”添加了“block”任务。

3、当Engine收到新block的消息时,它会检查Ledger以查看是否有节点需要此block。对于发送“want-have”的每个节点向PeerTaskQueue组件添加一个?“HAVE”任务,对于为发送了“ want-block”的每个节点,向PeerTaskQueue组件添加一个“block”任务。

4、Engine会定期从PeerTaskQueue组件中取出任务,并创建带有“ blocks”,“ HAVEs”和“ DONT_HAVEs”的消息。

PeerTaskQueue组件通过对任务进行优先级排序,发送队列中数据量最少的节点方具有最高优先级,通过这种流控措施,提高数据块发送处理效率。

▲?数据块请求模块

Block请求模块负责管理数据块的请求。PeerManager组件为连接到Bitswap的每个节点创建一个MessageQueue组件,记录了“want-have”?、“want-block”已发送到哪个节点,并将任何新的wants定向到正确的节点。并且MessageQueue组件通过合并多个want为一条消息,然后将该消息发送给节点,从而提高了消息发送效率。

▲?内容发现模块

当Bitswap找不到已拥有所需block的节点时,它会使用DHT进行内容发现。Bitswap通过ProviderQueryManager组件管理这些请求,ProviderQueryManager组件对请求进行速率限制,并对进行中的请求进行重复删除处理。BitSwap节点会记录下来和其他节点通信的账单(数据收发),可以保持节点间数据交换的历史和防止篡改。当两个节点之间建立连接的时候,BitSwap会相互交换账单信息,如果账单不匹配,则清除重新记账。恶意节点可能会故意“丢失”账单,以希望清除掉自己的债务。其它交互节点会把这些都记下来,如果总是发生,节点就会被拒绝。

总结

Bitswap作为IPFS网络数据交换接口的具体实现,设计并实现了一套高效的节点间交换数据的协议。协议主要关注点是如何快速、高效获取需要的block,其中包括节点选择策略,如何最大化利用每个节点的能力。Bitswap通过Facade Pattern 提高了模块使用的便利性,在具体实现上解耦复杂依赖到各功能模块,从而降低系统实现的复杂度。

更多区块链知识请关注微信公众号:链动精灵科技

抖音号:链动精灵

—-

编译者/作者:链动精灵科技

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...