从“分布式”角度看IPFS对区块链的重要性
区块链是一个分布式系统,但包括以太坊、EOS在内的诸多公链本身实现的都只是数据的分布式计算,而没有提供数据的分布式存储,这导致分布式的区块链系统无法真正彻底地做到分布式。
IPFS(Inter Planetary File System,星际文件系统)协议解决的正是这样一个问题,它是分布式文件系统,可以实现数据的分布式存储。同时它也是一个去中心化网络的基础设施,包括公链在内的不同类型的应用都可以构建在它的基础之上。
如果说公链是高速公路,IPFS则是高速公路路面之下的层层地基中重要的一层,它为不同的公链和应用提供数据的分布式存储这一支持。
IPFS并非全新发明,它是几十年来分布式系统探索的产物,综合了包括DHT(Distributed Hash Table),BitTorrent,Git和SFS(Self-Certified Filesystems)在内的优秀思想。IBFS对它们做出适合区块链系统的改进,并通过分层设计将它们组合成一个新的系统。
本文将去繁从简,以数据的存取过程为线索,通过对IPFS最关键的三个系统技术的分析,看它是如何满足区块链数据的分布式存储需求的。
01 Merkle DAG
当把文件存储到IPFS系统中时,文件并不是以一个完整的个体被存储,文件数据以平均分割法的方式被切分成若干个256KB大小的块。这些块在经过哈希运算后,也并不是存储在单个中心化的服务器上,而是分开存储在网络中的各个分布式的节点之中,没有节点拥有特权。
这一分布式存储的难点不在于文件的切割或加密,而在于如何把这些被分割的和被分开存储的数据重新组合成一个文件,这正是IPFS协议的第一个关键技术——Merkle DAG(Merkle Directed Acyclic Graph,默克尔有向无环图)。
Merkle DAG从Git系统(林纳斯·托瓦兹创作的分布式版本控制系统)改造而来,是在Merkle Tree的基础上构建,储存的是哈希值。IPFS上大部分数据对象都是以Merkle DAG的结构存在。
当从网络中获取文件时,先从可信的节点获得文件的Merkle Tree树根哈希值。一旦获得了树根,就可以从其他不可信的节点获取Merkle Tree的各个节点的哈希值。通过可信的树根来检查接收到的Merkle Tree节点,如果Merkle Tree某节点是损坏的或者虚假的,就从其他存储节点获得另一个Merkle Tree节点,直到最终获得一个与可信树根匹配的Merkle Tree。
这样一来,从上至下,直到获得最底层的被切割成小块的数据的哈希,最终形成一个完整的正确的文件。
由于Merkle DAG是基于哈希值的,而哈希值取决于数据块的内容,因此IPFS协议拥有内容寻址的功能(HTTP是基于域名寻址),此外它还有防篡改和去重复的功能。防篡改是因为可以通过检查哈希值来确认数据是否被篡改;去重复是由于相同内容的数据块哈希是相同的,可以去掉重复的数据,节省存储空间。
02 DHT
依靠Merkle DAG,可以构建一个数据结构用于实现分布式的数据存储,但还缺最后一步,Merkle DAG存储的哈希值如何定位到具体存储数据的节点,也就是说,应该把数据分配到哪一个网络节点去存储,以及去从哪一个网络节点获得存储数据。DHT(Distributed Hash Table,分布式哈希表)便是用来解决这一问题的方法。
哈希表是一种存储“键值对( Key/Value Pairs)”的容器,它能方便快速地通过key值来获得 value值。在DHT中,key是被存储数据的哈希值,通过K/V可以实现数据块与目标节点的映射关系。
哈希表被分割成不连续的块,每个节点被分配一个属于自己的哈希块,也称做区间表,并成为这个哈希块的管理者,当用户存储数据时,系统对数据进行哈希运算,根据哈希运算的结果决定此数据由哪个节点负责储存,并生成哈希表。
当用户提取数据的时候,用同样的算法计算数据的哈希,然后从哈希表获得对应的数据存储位置(如下图所示)。
03 BitSwap
仅仅实现数据的分布式存储还远远不够,数据还需要在节点之前有效的交换,从而使得整个系统能够高效运转。IPFS协议受BitTorrent 的启发,通过对等节点间交换数据块来分发数据。
BitTorrent 是一种点对点传输的网络协议,它可以在存有不信任对等节点的网络中分发数据,对于一个文件,下载的用户数越多,下载的速度就越快,部分的网络拥堵或服务器宕机也不会对整个系统造成大的影响。不过BitTorrent有一个致命的缺点,就是节点往往更多的是索取而不是贡献。
如何激励节点分享数据?IPFS在BitTorrent的基础上进行了创新,增加了包括信用、策略、帐单在内的体系,这一体系之上的新的数据交换协议被称做BitSwap。
在BitSwap协议下,发送数据给其他节点可以增加节点信用值,而从其他节点接受数据则会降低节点信用值。
也就是说,如果一个节点持续分享数据,其他节点给它发送数据的概率就会越来越大;而如果一个节点只接收数据而不分享数据,其他节点给它发送数据的概率就会越来越低,直到低到被其他节点忽略。
此外,BitSwap获取数据块的时候不限于从同一组对等节点中,在该协议里存在一个对等节点形成的大集群,它包括所有的数据块,这使得BitSwap的效率相比于BitTorrent更高。
04 结语
Juan Benet在2014年5月成立了Protocol Labs协议实验室,并在2015年1月发布了IPFS.IPFS在本质上是一个内容寻址的分布式存储和传输协议。
IPFS被寄予厚望,它是目前阶段最好的分布式存储解决方案之一,人们甚至认为它可能取代超文本传输协议(HTTP,HyperText Transfer Protocol)。但另一方面,它在目前阶段还不够成熟,仍面临着包括安全性、可用性在内的诸多问题。
最后,简单介绍一下Filecoin和Filenet。
Filecoin和Filenet都是运行在IPFS上的激励层,通过Token激励让节点有动力为网络提供存储空间,从而在IPFS协议的基础上构建一个分布式的存储网络。但Filecoin和Filenet彼此独立,是两个不同的项目,采用的也是不同的Token分发模式。从某种角度而言,任何组织都可以在IPFS上搭建自己的激励层。