开始学习区块链时会想到一个问题:区块链是一个去中心化的网络,所有的数据都写上链上,那DAPP 的所用到的文件要存放到哪里呢,该不会也写到链上吧如果放在传统的中心化伺服器上,数据有机会被恶意修改,即使使用一些校验机制保障数据正确,如果数据被删除了,那 DAPP 是否无法使用呢又或者在数据传输的过程中,前端内容有机会被DNS污染,这也与去中心化背道而驰,到底要存储在哪呢

区块链上每个区块的区块空间非常细小而且相当有限,想像一下,如果将一张正常图片的全部数据分拆写入区块链主链上,暂时姑且可以说是没有问题,但如果大家将现实生活中使用的系统所有文件统统放上主链上,这将是何等浪费空间和严重影响出块速度而且当文件也必定会经常有所修改,而根据区块链的特性是不能篡改,所以每次那怕有少许改动,整个文件又要再次写入链上,实在是不科学和不现实。

而目前传统主流中心化的系统中,静态文件通常由伺服器或伺服器集群负责提供存储。假设一个最基本的静态网站,前端文件中会有网页源文件, CSS, JS, 图片, 影片等多种静态文件,而这些文件通常都是集中储存在互联网公司的伺服器上(当然,目前也有很多CDN啦),当大家打开这个网站时,都会得到相同的文件。但如果负责运行这个静态网站的伺服器发生错误、被骇客攻击、入侵修改文件等情况而导致网站不能正常运作时,那么大家也无法访问这个网站了,更也不用说其他大部份的带有数据库的动态网站。

个人认为在区块链的世界中真正的 DAPP 应该是完整去中心化的,不论是DAPP的数据或者文件。就如早前大热的加密猫,原则上来说不是一个真正的 DAPP,因为整个加密猫的网页和一些网页素材都存储在中心化的伺服器上。目前区块链就好比传统的分布式数据库,而为了构成一个真正意义上的 DAPP,也应该使用分布式文件系统存储 DAPP 的相关数据。

IPFS

IPFS(InterPlanetary File System,星际文件系统)是一个旨在建立持久且分布式储存和共用文件的网路传输协议,是一种内容可寻址的对等超媒体分发协议(P2P),IPFS网路中的节点将构成一个分布式文件系统。

请注意,IPFS并不是一种区块链,它的设计宗旨是与区块链结合协同运作。尽管IPFS使用与区块链中Merkle Tree类似的架构元素,但IPFS并不是一种基于区块链的技术。

可以这样理解,使用IPFS 时,整个互联网可以被当作成一个种子Torrent 文件(有用过BitTorrent, BT的朋友应该相当熟悉),而任何文件、影片等资料都是存在于同一个BT 群组并且透过同一个Git 仓库存取,同时共享给全互联网上的用户。当需要到某个文件时,IPFS 将会像BT那样为你寻找最接近的用户取得文件。

那你又可能会问,那和BT有什么分别,直接用BT不就可以了吗

BT中每个种子文件背后都是一组独立的用户,即使是同一段影片,只要该种子内另外其他文件那怕有少许不一样,那就会产生两个种子,而彼此间不能交叉互通共享,而且BT 并不支持所有的数据类型,更不关心在网络上重复的数据,因此会产生很多冗余数据,影响网络整体的效率。

IPFS 在技术上大量参考了Git 版本管理控制及BitTorrent,因此,在IPFS 上,假设A和B先后上载同一个文件,而在IPFS 上储存数据时则只会有一份,文件是分块(Block)存储的,拥有相同Hash的Block,只会存储一次。

IPFS文件的存储和读取的原理与 BitTorrent 类似。IPFS 采用的索引结构是DHT(Distributed Hash Table, 分布式哈希表),与BT相同,而数据结构方面则是 Merkle DAG(Merkle Directed Acyclic Graph, 有向无环图)。

而 Merkle DAG 具有以下特点:

1. 内容可寻址:所有内容都是被多重 Hash 校验和作为整个网络上唯一识别的。

2. 无法篡改:由于所有内容都是经过多重 Hash 校验及被用作验证,如果文件有任何不一样或者被修改,就马上能够被识别出来;

3. 删除重复数据:由于根据内容进行 Hash,所以能够识别出网络上是次只存在一份,也能确保只存储一次;

以下是一段IPFS 简单的介绍影片,我觉得介绍相当浅白易懂

https://www.youtube.com/watchv=EClPAFPeXIQ

历史

2014年5月,IPFS协议由墨西哥人Juan Benet 所设计,他利用比特币区块链技术的特性和网路基础设施的优势来实现永久存储不可篡改的资料,移除网路上的重复文件,以及取得储存节点的位址资讯以用于搜寻网络中的文件。目标是让互联网速度更快、更安全、更开放,让全世界的使用者都能够从 IPFS网络上对等地存储及提取文件。

以下是IPFS 官方的介绍影片

运作流程

引用一个例子说明IPFS 的运作流程

John 想上传一个PDF文件到IPFS 他将他的PDF文件放在他的工作目录下 他使用IPFS 的命令添加这个文件,同时会得到了一个以Qm 开头的Hash值 他的文件已经在IPFS 网络上并可以被访问了

接下来,John 想将这个文件分享给他的同事Mary,他只需要将第3步得到的Hash 值告诉Mary ,Mary 随即透过这个Hash 值,从IPFS 下载这个PDF文件。

以上这个就是简单的IPFS 存储和读取过程。

每上传一个文件到 IPFS 网络上,系统将会为文件分配一个永久不可改变的地址(一个与内容关联的唯一加密Hash值),IPFS会将这个地址写在不可篡改的区块链主链上。IPFS 提供可公开访问的数据库,而区块链则主链被设计为负责验证的部份。对于重复数据方面的处理,IPFS 网络将会自动删除重复数据并追踪数据的历史版本记录,而根据文件地址和历史版本记录,可以有效避免数据被误删除。

“If you add it to IPFS and take that hash and put it in a block, you can then use IPFS to browse the transaction and browse the file directly on the web, Since distributed ledgers can be put on top of IPFS for application building, he calls the two systems a “great marriage”.” --- IPFS Inventor, Juan Benet

简单来说,IPFS 以负责以P2P的方式存储文件本身及其历史版本记录,同时给出与内容对应的唯一地址,而将这些地址写在区块链上,这样就既能确保文件的完整性,同时又能存储大量文件,节省区块链主链的网络带宽。

安全性

一般而言,直接上载到 IPFS 网络上的文件,只要知道这个地址或者是这个文件的hash值的使用者都能够下载。

慢着!这不是很有问题吗如果是一些比较敏感的资料或文件,其他人都能够正常访问下载,那还有安全性可言吗所以我们在将一些敏感文件上载至 IPFS 时,就必须预先对这些文件进行加密处理。只要透过一些现成的加解密工具,就能够很好地解决文件赤裸地曝露的问题,同时又能利用到 IPFS的特性。

然而,我们可以使用非对称加密技术对文件预先进行加密,然后才放到IPFS 上,我们可以使用文件接收方的公钥加密文件,然后接收方从IPFS 网络上下载了这个文件,再用自己的私钥解密。就算文件被其他人下载下来,没有接收方的私钥,也无法打开。

实际做法又是何做呢我们不妨再引用上面的例子再作修改,加入加密和解密的过程:

John 想上传一个PDF文件到IPFS,但只想让Mary 访问 他将他的PDF文件放在他的工作目录下并使用Mary 的公钥进行加密 他使用IPFS 的命令添加这个加密文件,同时会得到了一个以Qm 开头的Hash值 他的文件已经在IPFS 网络上并可以被访问了 Mary 下载这个文件,透过相应的私钥解密,就可以正常访问这个文件 然而,其他知道这个hash值的人下载后,因为没有私钥,所以无法对文件解​​密,也就无法正常访问了

优缺点

优点

存储安全性高:以往存储在中心化系统,数据有机会被监控、因管理不善而外泄、甚至被黑客恶意修改;而IPFS 可以在网络上会存在多个副本区块,并透过文件内容的hash 作为验证,避免了资料被恶意篡改,存储不稳定的情况,同时可以利用加密工具作为解决文件的安全问题; 存储成本分散:以往存储在中心化系统,数据都被集中存储,由单一互联网公司内的伺服器硬盘负责存储数据,随着互联网的爆炸式发展,存储成本集中,另外当去到瓶颈位置时,旧数据有机会被删除或归档。IPFS 则将存储分布到网络上所有节点,共同构成一个庞大的存储空间; 数据稳定性高:当中心化系统出现紧急情况,集中的数据有机会出现丢失的情况,同时未能被找回。数月前,国内著名的云计算供应商腾讯云亦曾经出现类似情况;IPFS 则将风险分布至网络上所有节点,数据稳定性长远而言相对较稳定; 节省网络频宽和成本:当所有使用者都向中心化系统读取数据时,由于系统的网络频宽有限而且昂贵,所以有机会出现网络挤塞;IPFS 则可以利用网络上所有节点的网络频宽资源,同时确保能从最接近的节点读取数据,节省网络频宽和资源的使用率;

缺点

文件不可撤回,不可篡改:这个是优点也是缺点,对于目前很多使用场景下,文件若不能被修改,可能也是不太适合; 大型文件风险:由于IPFS 是将文件分拆被存放在众多小块中,如果当其中一个小块不能使用,整个文件也将失效;

激励机制

IPFS 网络依赖激励机制去维护整个网络,IPFS 网络内所有的节点都是由很多不同独立的节点组成,要让节点心甘情愿地贡献自己的存储空间和网络频宽,这就需要一套有效合理的激励机制,如同比特币、以太坊等区块链一样,存储数据的节点就相当于区块链网络中的矿工,提供存储数据也就能够获得相应的奖励。而FileCoin 则是一个基于IPFS 的去中心存储项目,它是一种运行在IPFS 内的激励机制,IPFS是一个P2P的网络,而众所周知,P2P内节点的数量越多,下载速度就越快,所以透过FileCoin这种激励机制,能够有效地保障IPFS 网络的存储空间正常运作。

总结

IPFS 实现了真正的分布式文件存储,对于当前区块链的缺少一个文件存储方面的解决方案,两者可就如IPFS 作者所言,是一场"完美的婚姻"。真正的DAPP除了数据是Decentralization 外,DAPP的其他文件也应同样地是Decentralization,IPFS将会很有机会成为未来区块链上,所有项目的存储配搭。IPFS 结合了比特币区块链技术的不可篡改特性、大量参考Git和BitTorrent,构建整个分布式网络基础设施来实现永久存储不可篡改的资料,要实现让互联网速度更快、更安全、更开放的目标,并非不可能。而且在目前区块链世界中,主流都是在讨论如何解决上层的交易速度,给出很多的解决方案,但个人认为,要实现真正去中心化的DAPP,一个分布式文件系统同样重要,至少目前来说IPFS 能够基本满足要求。