什么是 IPFS
“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 就是内容寻址的重要组成部分。
当您将文件添加到 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 协议。
一个节点中的所有文件块,以 DHT 的形式组织,DHT 是一个键值对的表格,key 值代表了 CID,而 value 值代表了 PeerID,也就是节点的 ID。它的组织结构就是如图所示的。在 ipfs 中,我们使用 Kademlia 算法来实现 DHT 协议。
查询和下载
当你查找和下载文件时,你会先向邻近的对等节点发送 want-list,请求你想要的文件内容的 cid,如果没有,则邻近的节点继续向外扩散请求。如果有,则邻近的节点返回它的结果。这一切是通过 Bitswap 这个 IPFS 自己开发的协议完成了。
当你查找和下载文件时,你会先向邻近的对等节点发送 want-list,请求你想要的文件内容的 cid,如果没有,则邻近的节点继续向外扩散请求。如果有,则邻近的节点返回它的结果。这一切是通过 Bitswap 这个 IPFS 自己开发的协议完成了。
同时在你下载的时候,你也充当了一个上传者的功能。比如当你在下载某个文件的时候,你的邻居正巧也要下载这个文件,则它会像你发送下载的请求,此时你一边从别人那里下载文件,一边给你的邻居提供下载。
IPFS Q&A
第一,如果存储了某个文件的节点离线了,那么就不能在获取这个文件了。这些也很多 BT 厂商面临的问题,大家都白嫖,白嫖完就走。比如大家使用迅雷下载,经常发现,有些文件,下载到一半没速度了。解决方法就是建立激励机制,鼓励人们长期在线分发文件和建立备份,这就是 Filecoin 做的事情。
第二,内容寻址是否会产生商业碰撞。理论上可能,现实不太可能。IPFS 使用 sha2-256 进行加密,其碰撞的可能性在 10^77 左右,这个数字大概就是可见宇宙中原子的总数。
IPFS 的商业前景
IPFS 目前依旧是备受质疑,比如,没有审查机制,那么存储内容的合法性如何解决。比如认为 IPFS 取代 HTTP 简直是异想天开。而 IPFS 诞生至今,除了 filecoin 外尚无成熟的商业应用。而 filecoin 也主要是作为数字货币进行炒作,没有太多基于存储的实际商业价值。