区块链之分布式存储系统 IPFS

According to white paper:

The InterPlanetary File System (IPFS) is a peer-to-peer distributed file system that seeks to connect all computing devices with the same system of files. In some ways, IPFS is similar to the Web, but IPFS could be seen as a single BitTorrent swarm, exchanging objects within one Git repository. In other words, IPFS provides a high throughput content-addressed block storage model, with content- addressed hyper links. This forms a generalized Merkle DAG, a data structure upon which one can build versioned file systems, blockchains, and even a Permanent Web. IPFS combines a distributed hashtable, an incentivized block exchange, and a selfcertifying namespace. IPFS has no single point of failure, and nodes do not need to trust each other.

让我们提取一下这段话里的关键词:

  1. P2P对等网络
  2. 基于BT协议
  3. 类似Git仓库的版本文件系统
  4. 内容寻址
  5. Merkle DAG的数据格式
  6. 无单点故障

下面逐一解释;

P2P对等网络

IPFS声称可以替代Web,内容不再通过中心服务器响应,而是以P2P的方式从邻近的对等节点拉取;同时全网维护一个统一的路由表,每个节点作自我调整,以保证节点与数据的动态增删、完整性、去冗余等细节问题。

根据官方网站介绍,传统的HTTP协议具有以下不足之处:

  1. HTTP的效率低下,并且服务器昂贵。使用HTTP协议从中心化的服务器集群中一次需要下载一个完整文件,而P2P的方式可以从许多peers(对等节点)中下载不同的数据块,经研究可以节省60%的带宽成本。
  2. 历史文件被删除。我们在上网的过程中看到过太多的404,网页的平均寿命是100天,部分网站数据不能得到永久保存。这也是受限于中心化服务器的高存储成本。
  3. HTTP的中心化限制了发展机会。全球互联网DNS根源上是由13个根服务器所提供。同时主要的云服务也由几家重要的云服务商所提供。政府和机构可以在这些中心化集群前截取HTTP消息包,窥探和监控网民的生活;黑客们也可以很容易的通过DDOS等手段攻击中心化的服务器集群导致网络瘫痪。
  4. 网络应用过于依赖主干网。当主干网因为不可抗力因素造成拥塞或宕机等,无法继续服务时,应用也会受到影响。


HTTP协议诞生20年来,协议只是从1.0到2.0,但web应用本质上还是基于B/S架构的模式,它的根本劣势仍然无法得到很好的改进。

基于BT协议

IPFS 中的BitSwap协议受到BitTorrent 的启发,通过对等节点间交换数据块来分发数据.

举个例子:小明想要观看一部视频

  1. 小红和小刚以前看过该视频,于是他们将视频文件加入IPFS网络,得到相同的哈希指纹B。(现实中,若该视频在周边好几个节点都持有,IPFS会把文件分块去重,节省节点的存储成本)
  2. 小明在本地通过哈希指纹B(形如 /ipfs/B 的路径名),试图从IPFS网络拉取该视频。小明不关心最终的视频数据来自哪些节点。
  3. 小明的节点索引DHT(分布式哈希表)中的哈希值所对应的节点列表,并行地从这些节点下载部分数据块。IPFS网络会自动从各节点下载部分数据块,再由本地的manager拼成完整的文件。
  4. 小明的节点获得了这个视频,不仅自己可以观看,还可以为其他人提供资源。

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

  1. 已有的数据块(have_list)
  2. 想要的数据块(want_list)

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

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

类似Git仓库的版本文件系统

IPFS各节点本身使用类似git的版本控制系统,来管理本地文件与数据块。这既保证了数据块的去冗余,又提供了可追溯的历史版本。

IPFS为模型化版本系统定义了一组对象模型,与Git很类似:

block:一个可变大小的数据块。
list:块或其他链表的集合。
tree:块、链表和其他树的集合。
commit:当前文件数在版本历史记录中的一个快照。

Blob
Blob对象代表一个文件,并且包含一个可寻址的数据单元。IPFS文件可以使用lists或者blobs来表示。但区别是Blob没有链接。

List
List对象包含一个有序的队列,该队列由blob或list对象组成。

{
    "data": ["blob", "list", "blob"],
    // lists have an array of object types as data
    "links": [
        { "hash": "XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x","size": 189458 },
        { "hash": "XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5","size": 19441 },
        { "hash": "XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z","size": 5286 }
        // lists have no names in links
  ]
}

Tree
在IPFS中,Tree对象与Git的tree类似:它代表一个目录,或者一个名字到哈希值的映射表。哈希值表示blobs,lists,其他的trees,或commits。

Commit
在IPFS中,commit对象代表任何对象在版本历史记录中的一个快照。它与Git的commit也非常类似,但它可以指向任何类型的对象(Git中只能指向tree或其他commit)。

内容寻址
域名寻址vs内容寻址

类似Git,IPFS使用哈希指纹来实现去重,内容一样的文件哈希值一定相同;


哈希指纹
从最近的节点查找内容
Markle Tree 和DAG

关于在海量数据中寻找变量或增量,相比传统方法中,数据中的改变需要传输整个文件才能进行验证,而使用Markle Tree只需要时间复杂度O(Log n),空间复杂度O(Log n)。

Merkle Tree本质上是二叉树hash,IPFS的方案是,文件只储存在leaf nodes中,非叶子节储存left child+right child的hash值。

下面看一张长图


image

总结来说:

  1. 每次有文件有改动,只需要传输相应的data,验证根节点是否相同
  2. 文件拷贝时也只需要考虑改动的leaf node,及其与根节点之间的节点

As for the Merkle DAG: A Merkle DAG is a Merkle directed acyclic graph. That is a data structure similar to a Merkle tree but not so strict: such DAG does not need to be balanced and its non-leaf nodes are allowed to contain data.

无单点故障

基于以上几个特征,IPFS没有单点故障,并且节点不需要相互信任。

IPFS的应用和愿景

基于IPFS,我们可以实现一种更廉价、带奖励机制的分布式存储方案(如FileCoin),这为IPFS生态的发展提供了十足的想象空间。

且IPFS本身是不消耗任何代币的。

IPFS的实现得益于区块链技术的发展。在区块链诞生之前,对于IPFS的实现存在两个问题:

  1. 节点网络在维护路由表的一致性,特别是涉及到节点、资源的动态增删,节点的信用以及防欺骗和防free loader等方面,往往不得不采用一些中心化的解决方案(例如迅雷下载P2P加速),而这又违背了去中心的理念。
  2. 对节点实行奖惩机制,涉及到账本、信用管理,代币发行以及交易事务处理等等,在分布式架构下难以保证高可靠、高可用和安全防篡改。过去的解决方案也是引入一个中心化的机构作背书。

这些问题在今天来看,使用区块链技术,综合效率和成本两方面,是再合适不过的。

在接下来的10年,我们一定会看到IPFS在分布式应用方面大行其道。基于区块链技术的杀手级应用,很可能也会因此到来。

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

推荐阅读更多精彩内容