自2014年5月胡安·贝内特发起了IPFS项目至今,IPFS发展迅速,目前全球存储总量已经达到9EB(1EB=1024*1024TB)。 IPFS在我国也备受青睐,国家对它很重视,从2019年起就开始布局。 IPFS并不是一个全新的技术,它是各种技术的集合体。协议实验室通过整合分布式哈希表、BT技术、Git版本协议、SFS自验证文件系统四种已有技术,创建一种点对点超媒体协议,试图打造一个更加快速、安全、开放的下一代互联网,实现互联网中永久可用、数据可以永久保存的全球文件存储系统。 在本篇文章中,我既希望能够通用分析、解读IPFS的技术原理,给我们开发IPFS生态应用提供帮助,也希望能够帮助我们学习协议实验室是如何运用并整合现有开源技术推成出新。 下面我们来了解一下IPFS是如何使用上述4种技术的。
1. 分布式哈希表
分布式哈希表技术(DHT),是一种分布式的存储和寻址技术。 DHT的最主要思想是全网维护一个巨大的文件索引哈希表,这个哈希表的条目形如<Key,Value>。其中,Key通常是文件的某个哈希算法下的哈希值(也可以是文件名或者文件内容描述) ,而Value则是存储文件的IP地址。查询时,仅需要提供Key,就能从表中查询到存储节点的地址。 由于这个哈希表很大,因此它会被分割成小块,按照一定的算法和规则分布到全网各个节点上。 每个节点仅需要维护一小块哈希表,但每块哈希表不止由一个节点维护(这样即使节点意外挂掉也有其他的节点使DHT可用)。
当节点接受到查询请求后,如果可以在自己的桶(每一个节点维护的DHT子集被称为”桶“)中找到则回复,否则联系最近节点回复。这个过程一直到找到目标节点为止。
2. BT技术
BitTorrent是一种内容分发协议。它采用内容分发和点对点技术,帮助用户相互更高效地共享大文件,减轻中心化服务器的负载。BitTorrent网络里,每个用户需要同时上传和下载数据。文件的持有者将文件发送给其中一个或多个用户,再由这些用户转发给其他用户,用户之间相互转发自己所拥有的文件部分,直到每个用户的下载全部完成。这种方法可以减轻下载服务器的负载,下载者也是上传者,平摊带宽资源,从而大大加快文件的平均下载速度。 IPFS对BitTorrent技术进行了创新,在BT技术的基础上支持请求数据跨文件(BT只能基于文件传输),并增加了信用和帐单体系来激励节点去分享,由此创造出了Bitswap(数据块交换协议)。
Bitswap的信用账单体系由信用、策略、账单组成。
BitSwap信用体系
BitSwap协议为能够激励节点去乐于分享数据(即使这个节点暂时没有数据需求),根据节点的之间的数据收发建立了一个信用体系:有借有还,再借不难。
- 发送给其他节点数据可以增加信用值
- 从其他节点接受数据降低信用值
如果一个节点只接收数据而不分享数据,信用值就会降得很低而被其他节点忽略掉。简单来讲就是:你乐于分享数据,其它节点也乐于发送数据给你,如果你不愿意分享,那么其它节点也不愿意给你数据。
BitSwap策略
根据上面的信用体系,BitSwap可以采取不同的策略来实现,每一种策略都会对系统的整体性能产生不同的影响。 IPFS在其发布的白皮书中提供一个可参考的策略机制(实际的实现可以有所变化):
- 每个节点根据和其他节点的收发数据,计算负债率
r
=
b
y
t
e
s
S
e
n
t
/
(
b
y
t
e
s
R
e
c
v
+
1
)
r = bytesSent / (bytesRecv + 1)
r=bytesSent/(bytesRecv+1) 其中r表示节点的负债率,bytesSent表示发送到负债节点的字节数,bytesRecv表示其他节点从负债节点接收到的字节数。当发送到负债节点的数据越多,而其他节点从负债节点接收的字节数越少,负债越高。 - 通过负债率可以计算负债节点能够接收到数据的概率
P
=
1
?
1
/
(
1
+
e
x
p
(
6
?
3
r
)
)
P = 1? 1/(1+exp(6?3r))
P=1?1/(1+exp(6?3r)) ? 其中,P表示节点接收到其他节点数据的概率。 从图中可以看出,当负债率达到1左右(即接收和发送的数据量相等)的时候,能够接收到数据的率会急剧下降;当接收量是发送量的2倍时,能够接收到数据的概率只有0.5*;*当接收量是发送量的4倍时,能够接收到数的概率几乎为0。
BitSwap账本
每个节点都会记录下来和其他节点通信的账本(数据收发),可以保持节点间数据交换的历史和防止篡改。当两个节点之间建立连接的时候,BitSwap会相互交换账单信息,如果账单不匹配,则清除重新记账。恶意节点可能会故意“丢失”账单,以希望清除掉自己的债务。但其它交互节点会把这种情况记下来,如果发生的次数较多,其他节点就不会再信任它了。
3. Git 版本协议
IPFS使用GIT技术来解决数据分发和版本管理的问题。
我们在进行大文件传输或修改的时候总会遇到存储或传输压力大的问题,而Git在版本迭代方面非常出色。Git存储时会把文件拆成若干个部分,并计算各个部分的哈希值,利用这些构建起与文件对应的有向无环图(DAG),DAG的根节点也就是该文件的哈希值。这样的好处十分明显:如果需要修改文件,那么只需要修改少数图中节点即可;需要分享文件,等价于分享这个图;需要传输全部的文件,按照图中的哈希值下载合并即可。 上面的数据结构就是Git的数据结构Merkle DAG(默克有向无环图)。IPFS对此基础上进行改进,将每个文件拆分成256K大小的文件块。
值得注意的是,对同一个文件修改,提交到ipfs后产生的是新的文件,旧的文件还会存在,这样,在ipfs库里就记录了两个版本(旧版和新版)。通过这样,就可以很好地实现版本控制。
4. SFS自验证文件系统
SFS(Self-Certifying File System)是为了设计一套整个互联网共用的文件系统而提出的,它的宗旨是全球的SFS系统都在同一个命名空间下。在SFS中,分享文件会变得十分简单,只需要提供文件名就行了。
IPFS使用SFS自验证文件系统用于解决文件便捷分享及可信认证问题。
一般用于解决可信认证的方法是,所有服务器都生成一对公钥和私钥,当客户端向服务端发送文件时,客户端先用服务端的公钥进行加密,服务端接受到文件时用私钥解密。但这存在一个问题,怎么让所有的客户端都能获得服务器的公钥呢?
SFS使用一种新的解决思路,将公钥信息嵌入到文件名中,这种命名为“自验证文件名”。这样就没必要在文件系统内部实现密钥管理了。
IPFS使用该概念创建星际名称空间(IPNS),这是一种使用公钥加密来自我认证网络用户发布的对象的SFS。
|