去中心化IPFS概念

15 min read

什么是 IPFS

IPFS 是由 Protocol Lab(协议实验室) 于 2015 年开发的一个分布式文件存储协议
英文的全称叫做InterPlanetary File System,翻译成中文非常的霸气,叫做星际文件系统
“IPFS is a distributed system for storing and accessing files, websites, applications, and data”,也就是说,IPFS 就是一个用来分发和存储各种数据类型资源的分布式存储系统协议。它的其中一个阶段性的目标就是取代 HTTP 成为 Web3.0 时代的底层(应用层)网络协议
我们可以用一个等式来描述 ipfs 协议,即 ipfs = Distributed Hash Tables(DHT:分布式哈希表)+Content Based Addressing(基于内容寻址)+Git Version Control Systems(借鉴 Git 版本控制)+ Merkle DAG(默克尔有向无环图)+Peer to Peer(P2P网络)+IPNS(全球命名系统)+ BitTorrent ...

为什么使用 IPFS

但是话又说回来,我们目前使用基于 http 的万维网,使用着上面丰富的应用,似乎目前的互联网没有什么不好的地方,为什么非要搞一个 ipfs 来作为 http 的补充呢?
第一,ipfs 提供便宜的的网络使用费用。我们现在经常在网络上使用的是 cs 模型,即多个客户端连接到一个中心服务器来请求获取资源,而互联网公司维护一个中心化服务器的代价是非常高的,羊毛出在羊身上,这些代价最终会转让给消费者。而在 p2p 模型中,每个节点既是服务器也是客户端,我们可以从邻近的节点获取资源。因此无需花费高昂的成本来维护中心服务器。
在一篇名为《A P2P VIDEO DELIVERY NETWORK 》的论文中,就证明了,通过 p2p 网络可以节省 60% 的带宽费用。
同时在 ipfs 的白皮书中介绍到,HTTP 擅长于传输小的文件,但面对如今互联网的海量资源,传输高清 4K 的视频,HTTP 就捉襟见肘了,在金色财经就曾报道过,利用 filecoin(基于 ipfs 的激励层应用)可以相比于主流的云存储和传输服务供应商节省 1/3 的费用。
第二,IPFS 在协议层面支持永久性保存。在 2020 年 Github 推出了一项永久代码保存计划--Github Archive Program,计划将在大量的开源代码存储在北极一个永久冻土区(250m),至少 1000 年。你们也可以登录自己的 github 账号查看自己是否有开源代码入选了这个项目。
当然,我们要知道 github 之所以能够大费周章,大动干戈,花大力气完成这项任务,是因为得到了微软的支持,因为 github 是被微软收购了的。
但实际上对于普通人来说,只要你愿意,你可以通过 ipfs 协议就可以实现资源的“永久保存”。
第三,去中心化。当然这个地方我们不去讨论严格的审查机制是否应该和合理的问题。像百度,脸书等互联网巨头爆出窥探用户网盘隐私的情况层出不穷。
而 ipfs 却恰好可以提供一个扁平的,开放的网络存储环境。在这里没有谁是统治者,大家都是平等的。
第四,更加安全。HTTP 天生就是不安全的,它在设计之初并没有考虑到安全问题,甚至 HTTP 默认还是用明文传输,中心化的服务器一直也是黑客攻击的目标,经常可以看黑客在暗网的交易平台兜售各种用户信息。比如今年就爆出大量脸书的用户信息在某黑客论坛交易。
还有一个例子,正好是前段时间我在浏览 v2ex 的时候,有一个网友就分享自己朋友的服务器就遭到了黑客的攻击,黑客删除了服务器中的一个数据库,要求对方支付 0.005 个 btc,才归还备份,我查了一下当天的 btc 价格,0.005 个 btc 大概相当于 2000 元左右人民币。所以可以看到,当前的中心化的网络环境依然面临着严重的安全威胁。
但是对于 ipfs 来说,它是天然带有安全属性的,因为没有中心,所以自然无法对特定的目标发动 ddos 攻击。

IPFS 如何工作

<font style={{color: 'rgb(25, 27, 31)'}}>刚才我们讲了很多 ipfs 与众不同的特性,也讲了 IPFS 为什么有存在的意义。那么 ipfs 究竟如何实现这些功能的呢,我们就来简单介绍一下 ipfs 是如何工作的。
上传文件<font style={{color: 'rgb(25, 27, 31)'}}>
当您将文件添加到 IPFS 时,您的文件(大于256 k)会被拆分为更小的块,经过加密散列(hash),并被赋予一个称为内容标识符 (CID) 的唯一指纹。而每一个文件片段的 CID 又可以生成整个文件的 hash 过后的 CID。所以在 ipfs 中,每一个资源对象都有一个独一无二的 CID。而 CID 就是内容寻址的重要组成部分。
这个就是最开始介绍的基于内容寻址,常见的呢,是基于位置寻址,比如,https://www.google.com,E:\me\分布式.ppt,都是典型的基于位置寻址,这有一个问题,如果在 E:\me\分布式.ppt 中,我不小心把 ppt 删除了,或者我把 ppt 替换成了 word ,用户都不可能得到想要的结果。实际生活中,访问一个网址,结果显示 404,或者一个百度网盘的资源,显示内容被删除。但是比如说,之前有人下载过这个资源,其实是可以通过这个人获取资源的,但是这在基于位置的寻址中无法实现。
左边就是一个原始的 ipfs 地址,开头是 ipfs 协议,中间这一段就是 cid,后面是 name-path-to-object。
内容寻址在我们生活中也非常常见。比如你去图书馆要找一本书,你肯定是告诉图书管理员,请给我《how to defi》这本书,这就是基于内容寻址,你绝对不会说,请把一楼,三区,第一个书架,第六排的第七本书给我。
同时,我们可以看到,刚刚展示的文件 cid 非常的长,而且没有规律,但这并不意味着你需要记住一长串 CID——IPFS 可以使用 IPNS 分散命名系统找到你文件的最新版本,利用 DNSLink 可用于将 CID 映射到人类可读的名称。这一点很像把 IP 地址映射成域名的 DNS 系统一样。
文件结构<font style={{color: 'rgb(25, 27, 31)'}}>
下面我们来看看文件的结构。
ipfs 采用 merkle dag 的方式来组织文件,这和类 unix 系统中的文件系统非常类似。我们拿刚才的文件举例,一个大的文件被分割成小的文件片段(文件块),在大的文件中,通过 link 数组可以将所有的子文件块链接在一起。
我们知道,因为文件的内容是 hash 了的,也就是说,内容无法篡改或者修改,因为一旦修改 hash 值的内容就不一样了。但是修改有时有时不可避免的。于是 ipfs 就借鉴了 git 的思想(实际上是几乎原封不动的把 git 的代码拷贝了过来)。通过 git 的版本控制,来串联起同一文件不同版本的关系。但是新的文件和以前的文件已经不是同一份文件了。
发布对象<font style={{color: 'rgb(25, 27, 31)'}}>
一个节点中的所有文件块,以 DHT 的形式组织,DHT 是一个键值对的表格,key 值代表了 CID,而 value 值代表了 PeerID,也就是节点的 ID。它的组织结构就是如图所示的。在 ipfs 中,我们使用 Kademlia 算法来实现 DHT 协议。
查询和下载
当你查找和下载文件时,你会先向邻近的对等节点发送 want-list,请求你想要的文件内容的 cid,如果没有,则邻近的节点继续向外扩散请求。如果有,则邻近的节点返回它的结果。这一切是通过 Bitswap 这个 IPFS 自己开发的协议完成了。
同时在你下载的时候,你也充当了一个上传者的功能。比如当你在下载某个文件的时候,你的邻居正巧也要下载这个文件,则它会像你发送下载的请求,此时你一边从别人那里下载文件,一边给你的邻居提供下载。

IPFS Q&A

第一,如果存储了某个文件的节点离线了,那么就不能在获取这个文件了。这些也很多 BT 厂商面临的问题,大家都白嫖,白嫖完就走。比如大家使用迅雷下载,经常发现,有些文件,下载到一半没速度了。解决方法就是建立激励机制,鼓励人们长期在线分发文件和建立备份,这就是 Filecoin 做的事情。
第二,内容寻址是否会产生商业碰撞。理论上可能,现实不太可能。IPFS 使用 sha2-256 进行加密,其碰撞的可能性在 10^77 左右,这个数字大概就是可见宇宙中原子的总数。

IPFS 的商业前景

IPFS 目前依旧是备受质疑,比如,没有审查机制,那么存储内容的合法性如何解决。比如认为 IPFS 取代 HTTP 简直是异想天开。而 IPFS 诞生至今,除了 filecoin 外尚无成熟的商业应用。而 filecoin 也主要是作为数字货币进行炒作,没有太多基于存储的实际商业价值。

评论

去中心化IPFS概念 | Niutr's Blog | Niutr's Blog