什么是 IPFS
IPFS 是一种内容可寻址、版本化、点对点超媒体的分布式存储、传输协议,目标是补充甚至取代过去半个多世纪里使用的超文本媒体传输协议(HTTP),希望构建更快、更安全、更自由的互联网时代。
IPFS 能解决什么问题
回顾下 HTTP 时代的网络请求,输入域名,请求 DNS 服务器,找到对应的 IP,根据 IP + uri 找到目标服务器,目标服务器收到请求后处理,然后按照原路径返回,那么这个过程可能会遇到哪些问题了:
效率低,成本高。使用 HTTP 协议每次需要从中心化的服务器下载完整的文件 (网页, 视频, 图片等), 速度慢, 效率低. 如果改用 P2P 的方式下载, 可以节省近 60% 的带宽. P2P 将文件分割为小的块, 从多个服务器同时下载, 速度非常快.
Web 文件被删除、服务器关闭。回想一下是不是经常你收藏的某个页面, 在使用的时候浏览器返回 404(无法找到页面), http 的页面平均生存周期大约只有 100 天. Web 文件经常被删除 (由于存储成本太高), 无法永久保存. IPFS 提供了文件的历史版本回溯功能 (就像 git 版本控制工具一样), 可以很容易的查看文件的历史版本, 数据可以得到永久保存
中心化限制。我们的现有互联网是一个高度中心化的网络. 互联网是人类的伟大发明, 也是科技创新的加速器. 各种管制将对这互联网的功能造成威胁, 例如: 互联网封锁, 管制, 监控等等. 这些都源于互联网的中心化. 而分布式的 IPFS 可以克服这些 web 的缺点.
高度依赖主干网。主干网受制于诸多因素的影响, 战争, 自然灾害, 互联网管制, 中心化服务器宕机等等, 都可能是我们的互联网应用中断服务. IPFS 可以是互联网应用极大的降低互联网应用对主干网的依赖.
这些问题正是当前 HTTP 无法根治的,而 IPFS 却能很好的解决。
IPFS 的优势
IPFS 不仅仅是为了加速 web,而是为了最终取代 HTTP 协议,针对上述 HTTP 面临的问题,IPFS 提出了各种解决方案
IPFS 是一个文件系统,定义了基于内容的寻址文件系统
IPFS 天生就是一个 CDN,文件添加到 IPFS 网络,使用分布式哈希、p2p 传输、版本管理系统,将会在全世界进行 CDN 加速
IPFS 是一个 web 协议,可以像 http 那样查看互联网页面,未来浏览器可以直接支持 ipfs:/ 或者 fs:/ 协议
IPFS 是模块化的协议,连接层:通过其他任何网络协议连接;路由层:寻找定位文件所在位置;数据块交换:采用 BitTorrent 技术
IPFS 是一个 p2p 系统,分布式网络结构,没有单点失效问题
IPFS 拥有命名服务 IPNS:基于 SFS(自认证系统)命名体系,可以和现有域名系统绑定
IPFS 架构设计
IPFS 至少有八层子协议栈,从上至下为身份、网络、路由、交换、对象、文件、命名、应用,每个协议栈各司其职,又互相搭配。
身份层和路由层可以一起解释。对等节点身份信息的生成以及路由规则是通过 Kademlia 协议生成制定,KAD 协议实质是构建了一个分布式松散 Hash 表,简称 DHT,每个加入这个 DHT 网络的人都要生成自己的身份信息,然后才能通过这个身份信息去负责存储这个网络里的资源信息和其他成员的联系信息。如同微信名片分享,在无法通过直接搜索微信号的情况下,如果你要找一个人,可以通过有这个人联系方式的朋友分享名片来建立联系。
网络层比较核心,使用的 LibP2P 可以支持任意传输层协议。NAT 技术能让内网中的设备共用同一个外网 IP,我们都体验过的家庭路由器就是这个原理。
交换层,是类似迅雷这样的 BT 工具。迅雷其实是模拟了 P2P 网络,并创建中心服务器,当服务器登记用户请求资源时,让请求同样资源的用户形成一个小集群 swarm,在这里分享数据。这种方式有弊端,一位服务器是由迅雷统一维护,如果出现了故障、宕机时,下载操作无法进行。
中心化服务还可以限制一些下载请求,人们发明了一种更聪明的方式就是 Bittorrent,让每一个种子节点所要存储的数据,通过哈希表存储在里面,BT 工具相对不太受监管,服务更加稳定。
IPFS 团队把 BitTorrent 进行了创新,叫作 Bitswap,它增加了信用和帐单体系来激励节点去分享,我推断 FileCoin 有很大概率是基于 Bitswap,用户在 Bitswap 里增加数据会增加信用分,分享得越多信用分越高。如果用户只去检索数据而不存数据,信用分会越来越低,其它节点会在嵌入连接时优先选择信用分高的。
这一设计可以解决女巫攻击,信用分不可能靠机器刷去提高,一直刷检索请求,信用分越刷越低。请求次数和存储量的变量之间有一个比较精妙的算法,类似一个抛物线,前期可以容忍很多东西,达到一定次数后不再信任。
对象层和文件层适合结合来谈,它们管理的是 IPFS 上 80% 的数据结构,大部分数据对象都是以 MerkleDag 的结构存在,这为内容寻址和去重提供了便利。文件层是一个新的数据结构,和 DAG 并列,采用 Git 一样的数据结构来支持版本快照。
命名层具有自我验证的特性(当其他用户获取该对象时,使用指纹公钥进行验签,即验证所用的公钥是否与 NodeId 匹配,这验证了用户发布对象的真实性,同时也获取到了可变状态),并且加入了 IPNS 这个巧妙的设计来使得加密后的 DAG 对象名可定义,增强可阅读性。
最后是应用层,IPFS 核心价值就在于上面运行的应用程序,我们可以利用它类似 CDN 的功能,在成本很低的带宽下,去获得想要的数据,从而提升整个应用程序的效率。
基于 IPFS 的项目
IPFS 的团队在开发时,采用高度模块集成化的方式,像搭积木一样去开发整个项目。协议实验室团队 2015 年创立,到 17 年的时间里都在做 IPLD、LibP2P、Multiformats 这三个模块的开发,它们服务于 IPFS 底层。Mutiformats 是一系列 hash 加密算法和自描述方式(从值上就可以知道值是如何生成)的集合,它具有 SHA1SHA256 SHA512Blake3B 等 6 种主流的加密方式,用以加密和描述 nodeID 以及指纹数据的生成。LibP2P 是 IPFS 核心中的核心,面对各式各样的传输层协议以及复杂的网络设备,它可以帮助开发者迅速建立一个可用 P2P 网络层,快速且节约成本,这也是为什么 IPFS 技术被众多区块链项目青睐的缘由。IPLD 其实是一个转换中间件,将现有的异构数据结构统一成一种格式,方便不同系统之间的数据交换和互操作。现在 IPLD 支持的数据结构,是比特币、以太坊的区块数据,也支持 IPFS 和 IPLD。这也是 IPFS 为什么受到区块链系统欢迎的原因之二,它的 IPLD 中间件可以把不同的区块结构统一成一个标准进行传递,为开发者提供了成功性比较高的标准,不用担心性能、稳定和 bug。IPFS 应用了这几个模块的功能,集成为一种容器化的应用程序,运行在独立节点上,以 Web 服务的形式,供大家使用访问。最后是 Filecoin,Filecoin 是建立在 IPFS 基础上的一条公链,旨在创立一个分布式的储存市场,帮助 IPFS 激励用户利用多余的空间存储链上信息,维系 IPFS 生态的正常运行与发展。Filecoin 激励用户出租自己的闲置硬盘、磁盘等存储空间,用于接收链内存储信息,防止部分节点下线或破坏导致文件不可用问题。出租了自己存储空间的用户便成为矿工,只需连接到 Filecoin 网络,然后等着协议来处理文件传输和交易就行。矿工贡献的存储空间越大,获得的 Filecoin(FIL)就越多。当然,客户也可以通过花费 Filecoin 来雇佣矿工来存储或分发数据。
IPFS 的应用意义
第一,可以为内容创作带来一定的自由。Akasha 是一个典型的应用,它是一个基于以太坊和 IPFS 的社交博客创作平台,用户创作的博客内容通过一个 IPFS 网络进行发布,而非中心服务器。同时,用户和以太坊钱包账户进行绑定,用户可以对优质内容进行 ETH 打赏,内容创作者能以此赚取 ETH,如同人脑挖矿一样。它没有太多监管的限制,也没有中间商抽成,内容收益直接归创作者所有。第二,可以降低存储和带宽成本。我之前也举过爱奇艺的例子,而做视频比较成功的项目叫「Dtube」。它是一个搭建在 Steemit 上的去中心化视频播放平台,其用户上传的视频文件都经过 IPFS 协议进行存储,具有唯一标识。相较于传统视频网站,它降低了同资源冗余程度,同时大大节约了海量用户在播放视频时所产生的带宽成本。第三个,可以与区块链完美结合。区块链的本质是分布式账本,本身的瓶颈之一就是账本的存储能力,目前大部分公链的最大问题是没法存储大量的超媒体数据在自己的链上。比特币至今全部的区块数据也才 30-40G 左右,以太坊这样可编程的区块链项目也只能执行和存储小段合约代码,DApp 想发展成超级 App,受到了极大的限制。运用 IPFS 技术解决存储瓶颈是目前来看的过渡方案,最典型的应用就是 EOS。EOS 引以为傲的是可以支持百万级别 TPS 的并发量,其中除了 DPOS 共识机制的功劳之外,还归功于其底层存储设计是采取 IPFS 来解决大型数据的传输效率。EOS 将自己打包好的区块数据通过 IPLD 进行异构处理,统一成一种便于内容寻址的数据结构类型,并挂载到 IPFS 的 link 上,让 IPFS 网络承担存储和 P2P 检索的逻辑,而不消耗 EOS 区块链系统本身太多的计算资源。第四,可以为传统应用提供分布式缓存方案。IPFS-GEO,它是一个为传统 LBS 应用提供分布式缓存的项目,可以将地理位置坐标数据通过 GeoHash 算法转化成一维字符串,并将与之相关联的具有检索价值的数据存入 IPFS 网络,由 IPFS 网络标识唯一性,并分布在各个邻近节点上。当检索请求到来时,系统先通过字符串近似度范围比较,缩小检索范围,加快检索效率,通过 NodeID 从附近节点拿到超媒体数据,达到类似分布式缓存的效果,大大提高了 LBS 应用整个检索动作的效率。
IPFS 的缺陷
信息不可撤销、不可篡改是 IPFS 的优点,也是缺点。如果是一个内容错误,需要更新的文件,那么不可撤销、不可更改将会成为一个很麻烦的事情。对此,IPFS 给出的对应措施是:可以将修改之后的文件上传至 IPFS,IPFS 也会对文件进行更新,在 IPFS 内可搜索到文件更新的所有历史纪录。IPFS 将大文件分别存放于不同的块中,也不可避免的有一个隐患,即:如果一部分存放文件的节点统统下线不可用了,并且该文件没有备份,那么整个文件都是不可用的。对此,有两种解决方案,一是激励更多的节点去存储这个信息,二是积极分发文件,使得更多节点存储这个信息。
欢迎订阅「K 叔区块链」– 专注于区块链技术学习 博客地址:http://www.jouypub.com 简书主页:https://www.jianshu.com/u/756c9c8ae984segmentfault 主页:https://segmentfault.com/blog/jouypub 腾讯云主页:https://cloud.tencent.com/developer/column/72548