IPFS学习笔记
1.IPFS和目前WEB(HTTP)的现状对比
-
IPFS可以把大的文件都切成很小的Block,每一个Block有自己的唯一Hash,可以做到重复的部分只存一份,这就可以节省很大的存储成本。
-
对于带宽来讲,P2P 网络可以从很多不同的节点拉取你所需要的 block。对于内容的服务商来讲,不需要很大的带宽,以为流量都被整个网络分摊了。
-
谈到开放程度呢,现在互联网是被中心化管控的,我们用去中心化的网络可以更加开放。像朝鲜这样的国家都访问不了 Facebook等网站,我是接受不了的。
2.IPFS的技术架构
- 由下到上是网络、路由、数据交换、数据存储、naming服务、和应用。
- IPFS 是很多现有技术的组合,右侧是 IPFS 采用的关键技术,底层网络在go网络库上基础上实现了一个 libp2p 库,包含了各种网络协议。
- 路由技术使用的 DHT 分布式哈希表(可能是Kad算法),数据交换是从 BitTorrent 基础上演化的 BitSwap,数据存储借鉴了Git。还有 SFS,一种自签名的文件寻址系统。
3.节点ID的生成
-
跟 Bitcoin 等有点类似,先生成公私钥,再根据公钥生成地址。
-
有一点不同的地方是它在里面加入了一个轻量级的 PoW 算法。在生成节点ID的时候,经过一定运算生成合法的nodeID。这么做的好处就是可以提高攻击的成本。
-
以女巫攻击为例,攻击者需要伪造很多恶意的节点来污染整个网络,如果采用这种生成 ID 的方式,可以提高攻击者的成本,从而避免一些攻击。
-
女巫攻击:女巫攻击是在P2P网络中,因为节点随时加入退出等原因,为了维持网络稳定,同一份数据通常需要备份到多个分布式节点上,这就是数据冗余机制。女巫攻击是攻击数据冗余机制的一种有效手段。
如果网络中存在一个恶意节点,那么同一个恶意节点可以具有多重身份,就如电影了的女主角都可以分裂出16个身份,那么恶意节点比它还能分。这一分可好,原来需要备份到多个节点的数据被欺骗地备份到了同一个恶意节点(该恶意节点伪装成多重身份),这就是女巫攻击。
- 解决女巫攻击:一种方法是工作量证明机制,即证明你是一个节点,别只说不练,而是要用计算能力证明,这样极大地增加了攻击的成本。
-
4.网络
-
IPFS在网络方面做了以下工作
- 传输层兼容现有的协议,对WEBRTC也有很好的支持
- 可靠性可以使用uTP和sctp来保障,这两种协议可以动态调整网络状态。
- 连通性方面支持ice等 NAT 穿透技术。
- 完整性通过文件hash校验的方式保障,IPFS中所有数据块都有唯一的hash。
- 所以理论上IPFS可以使用任意网络。
- 这张图是IPFS对节点地址存储的方式multiaddr,将完整的访问路径都记录下来了,包括协议名。
5.路由
1.路由算法经历了以下演进过程:
-
第一代 Napster 采用中央数据库查询网络节点。
-
第二代 Gnutella 查询所有节点
-
#####第三代 Kadmlia 使用 XOR 算法定位节点和文件。
①KAD网络通过节点ID的XOR操作来存储和查找节点信息。
② 从左到右的节点数越来越少是因为所有bit都相同的概率越来越少。
- IPFS 的路由的技术吸收了 Kademlia、Coral、S/Kademlia 等多种技术的优点。
- KAD网络寻址性能比较好,一般一千万节点最多20跳就可以查到。控制协议比较简单,只有四种控制协议,本身可以抵挡多种攻击。
- Coral DHT会把节点中数据的hash记录下来,直接就能知道内容和节点的关系,查找比较高效。Coral DHT还支持 Region,可以优先就近查找。
- S/Kademlia 可以在一半恶意节点网络中保证85%的正确率 。
6.数据交换
-
IPFS 节点都会维护 have_list 和 want_list,节点通信的时候会交换这两个列表,然后按照列表互换数据。
-
IPFS 还有一个 Pin 的功能,可以指定某个文件永远存在我这儿,不会被 GC 掉。
-
IPFS 还引入了债务的概念。从别的节点去拉取数据的时候,会产生债务,你发送数据给别的节点的时候可以偿还债务。通过这种形式,可以避免自私节点。
-
节点之间还维护帐本,通过互换账本可以发现恶意节点,避免攻击。
- 这个是负债率的计算公式。比如说A和B两个节点,现在A在往B发送数据,如果A往B发的越多,那对A来讲,B的负债率就会很高。
- 上面这个公式是发送率的计算公式。可以看到就是如果 r 大于 2 时,发送率会变的很小,从而A就不会继续给B发送数据。
- 如果B只收不发,权重就会迅速降低,就不会有人给他发送数据包了。这么做的好处是这样的网络更高效,大家都有收有发,不断做数据交换,是一个比较健康的状态。
7.文件系统
1.IPFS在做数据交换之后怎么存储这些数据呢?
一:Merkle Tree
- IPFS 的文件系统现在叫 IPLD,以前是 Merkle DAG。是 Merle Tree 的变种。这是 Bitcoin 和以太坊用的 Merkle Tree。
- 只有叶子节点存储数据,其他节点将下面节点的 hash 进行计算存储。根节点等于是从这个树的所有节点计算出来的,可以方便验证数据是否正确。
二:Merkle DAG
- Merkle Dag 在此基础上把文件数据也存在每一个节点上。可以根据根找到所有link的blocks。并且确保这些数据没被篡改过。
- 而且可以看到最右侧,hello.txt 和 my_file.txt 由于内容一致。只会产生一个节点。达到了去重的目的。
- 另外对于文件夹 my_dir 也是通过link指向下面的文件,然后文件在做 chunk。
三:大小文件存储
- 我们来看下IPFS一个block是什么样子。对于小于256K的数据直接放在一个block,记录了hash和data。大于256k的文件会被chunk为很多份小文件。原始block只包含hash和到这些block的引用。
四:怎么实现类似GIT的版本系统
- 我们看在左边first commit 中的mydir 窒息那个的 my file 就是2 的内容有修改,到second commit my dir的hash产生了改变因为下面的文件内容变了。同时指向了相同的testing.txt 因为内容没有改变。 指向了新的 my_file 文件。
- 这个是一个类似于Git支持多版本的文件存储的方案,我们先看左边这个树 First Commit,我们先看"my_file.txt"这个block,他的内容是“Hello World”。现在我们对他进行修改,改成“Another World”。
- 这是会生成第二个版本 Second Commit,所有的内容都指向之前的原始Block,不过因为"my_file.txt"发生了改变,所以产生了一个新的block。
8.Naming
- 我们给每一个Node分配一个Namespace,节点上传的数据都存储在这个Namespace里面。
- SFS加上 Namespace 再到后面文件名的hash 就确定这个路径的Hash。
- 在获取文件的时候可以使用节点的公钥来验证这个路径是否真的是合法
- IPFS 还支持很多的Naming的方式,比如说域名访问,还有 Proquint、短地址等方法。