2021-07-08-IPFS基本原理(一)


title: IPFS基本原理(一)
date: 2021-07-08 17:46:47
categories:

  • 数据库
    tags:
  • IPFS

IPFS基础

1.1 IPFS 概述

IPFS(InterPlanetary File System)是一个基于内容寻址的、分布式的、新型超媒体传输协议。IPFS支持创建完全分布式的应用。它旨在使网络更快、更安全、更开放。IPFS是一个分布式文件系统,它的目标是将所有计算设备连接到同一个文件系统,从而成为一个全球统一的存储系统。

IPFS项目通过整合已有的技术(BitTorrent、DHT、Git和SFS),创建一种点对点超媒体协议,试图打造一个更加快速、安全、开放的下一代互联网,实现互联网中永久可用、数据可以永久保存的全球文件存储系统。同时,该协议有内容寻址、版本化特性,尝试补充甚至最终取代超文本传输协议(HTTP协议)。IPFS是一个协议,也是一个P2P网络,它类似于现在的BT网络,只是拥有更强大的功能,使得IPFS拥有可以取代HTTP的潜力。

它提供了更加便宜、安全、可快速集成的存储解决方案。

1.1.1 HTTP四大问题
  • 极易受到攻击,防范攻击成本搞。
  • 数据存储成本高。
  • 数据中心化带来泄露风险。
  • 大规模数据存储、传输和维护难。
1.1.2 IPFS优势
  • 下载速度快

    IPFS使用了BitTorrent协议作为数据传输方式,使得IPFS系统在数据传输速度上大幅度提高,并且能够节省约60%的网络带宽。

  • 优化全球存储

    IPFS采用为数据块内容建立哈希去重的方式存储数据,数据的存储成本将会显著下降。

  • 更加安全

    IPFS、Filecoin的分布式特性与加密算法使得数据存储更加安全,甚至可以抵挡黑客攻击。

  • 数据的可持续保存

    IPFS提供了一种使互联网数据可以被可持续保存的存储方式,并且提供数据历史版本(Git)的回溯功能。

1.2 IPFS借鉴的技术

1.2.1 哈希表DHT

全称为分布式哈希表(Distributed Hash Table),是一种分布式存储方法。DHT的原理是:在不需要服务器的情况下,每一个客户端存储一小部分数据,并负责一定区域的检索,进而实现整个DHT网络的寻址和检索。

1.2.2 Kademlia

在Kademlia网络中,所有信息均以哈希表条目的形式加以存储,这些信息被分散的存储在各个节点上,从而形成一张巨大的分布式哈希表。

1.2.3 Git

Git存储时会把文件拆成若干部分,并计算各个部分的哈希值,利用这些构建起于文件对应的有向无环图(DAG),DAG的根节点也就是该文件的哈希值。

如果需要修改文件,那么只需要修改少数图中节点即可;需要分享文件,等价于分享这个图;需要传输全部的文件,按照图中的哈希值下载合并即可。

1.2.4 默克尔树

在IPFS项目里,也借鉴了默克尔树的思想。数据分块存放在有向无环图中,如果数据被修改了,只需要修改对应默克尔有向无环图中的节点数据,而不需要向网络重新更新整个文件。

1.2.5 IPFS 补充区块链两大缺陷
  • 区块链存储效率低,成本高。
  • 跨链需要各个链之间协同配合,难以协调。

1.3 IPFS的优势与价值

1.3.1 技术优势

IPFS技术可以分为多层子协议栈,从上至下为身份层、网络层、路由层、交换层、对象层、文件层、命名层,每个协议栈各司其职,又互相协同。

身份层和路由层

对等节点身份信息的生成以及路由规则是通过Kademlia协议生成制定的,该协议实质上是构建了一个分布式哈希表,简称DHT。每个加入这个DHT网络的节点都要生成自己的身份信息,然后才能通过这个身份信息去负责存储这个网络里的资源信息和其他成员的联系信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1hCFoYnf-1626262637972)(https://chaincode.gitee.io/chaincode/2021/07/08/IPFS基本原理(一)/1.pdf)]

网络层

比较核心,所使用的Libp2p可以支持主流传输层协议。NAT技术能让哪网中的设备共用同一个外网IP。

交换层

IPFS吸取了BitTorrent的技术,自研了BitSwap模块。使用BitSwap进行数据的分发和交换,用户上传分享数据会增加信用分,分享得越多信用分越高;用户下载数据会降低信用分,当信用分低于一定值时,将会被其他节点忽略。

对象层和文件层

他们管理了IPFS上80%的数据结构,大部分数据对象都是以Merkle-DAG的结构存在,这为内容寻址和去重提供了便利。文件层有blob、tree、list、commit等多种结构体,并采用与Git类似的方式来支持版本控制。

命名层

具有自我验证的特性(当其他用户获取该对象时,将交换节点公钥进行验签,即验证公钥信息是否与NodeID匹配,从而来验证用户发布对象的真实性),并且加入IPNS这个巧妙的设计使得哈希过后的内容路径名称可定义,增强阅读性。

1.3.2 IPFS 基础模块

IPFS将这几个模块集成为一种系统级的文件服务,以命令行(CLI)和Web服务的形式供大家使用。

Multiformats

Multiformats是一系列散列函数和自描述方式(从值上就可以知道值是如何生成的)的集合,目前拥有多种主流的散列处理方式,用以加密和描述NodeID以及内容ID的生成。基于Multiformats用户可以很便捷的添加新的哈希算法,或者在不同的哈希算法之间迁移。

LibP2P

LibP2P是IPFS模块体系内核心中的核心,用以适配各式各样的传输协议以及连接众多复杂的网络设备,它可以帮助开发者迅速建立一个高效可用的P2P网络层,非常利于区块链网络层的搭建。

IPLD

IPLD是一个转换中间件,将现有的异构数据结构统一成一种格式,方便不同系统之间的数据交换和互操作。IPLD中间件可以把不同的区块结构统一成一个标准进行传输,为开发者提供了简单、易用、健壮的基础组件。

IPFS底层技术

2.1 分布式哈希表DHT

DHT主要思想是:全网维护一个巨大的文件索引哈希表,这个表的条目形如<key,value>。这里key通常是文件的某个存储文件的IP地址。查询时,仅需要提供key,就能从表中查询到存储节点的地址并返回给查询节点。当然,这个哈希表会被分割成小块,按照一定的算法和规则分布到全网各个节点上。每个节点仅需要维护一小块哈希表。这样,节点查询文件时,只要把查询报文路由到相应的节点即可。

2.1.1 Kademlia DHT

Kademlia DHT是分布式哈希表的一种实现

特性:
  • 节点ID与关键字是同样的值域,都是使用SHA-1算法生成的160位摘要,这样大大简化了查询时的信息量,便于查询。
  • 可以使用XOR,计算任意两个节点的距离或节点和关键字的距离。
  • 查找一条请求路径的时候,每个节点的信息是完备的,只需要进行Log(n)量级次跳转。
  • 可根据查询速度和存储量的需求调整每个节点需要维护的DHT大小。

KAD网络对DHT有很大改进,一个新来的网络节点在初次连接网络时会被分配一个ID;每个节点自身维护一个路由表和一个DHT,这个路由表保存网络中一部分节点的连接信息,DHT用于存放文件信息;每个节点优先保存距离自己更近的节点信息,但一定确保距离在[2^n,2(n+1)-1]的全节点至少保存K个(k是常数),我们称作K-Bucket;每个网络节点需要优先存储与自己的ID距离较小的文件;每次检索时,计算查询文件的哈希值与自己的ID的距离,然后找到与这个距离对应的K-Bucket,向K-Bucket中的节点查询,接受查询的节点也做同样的检查,如果发现自己存有这个数据,便将其返回给查询的节点。

Kademlia 二叉状态树

kademlia网络的节点ID是由二叉树维护的,最终生成的二叉树的特点如下:

  • 每个网络节点从根节点出发,沿着它的最短唯一前缀到达。
  • 每个网络节点是叶子节点。对于任意的一个树的节点,我们可以沿着它的前缀作为路径,向下分解成一系列不包含自己的子树。kademlia二叉树的建立,需要确保每个网络的节点都能从树根沿着它的最短唯一前缀的路径到达。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IbayxFY4-1626262637974)(https://chaincode.gitee.io/chaincode/2021/07/08/IPFS基本原理(一)/2.pdf)]

在kademlia中,每个DHT条目包含<key,value>对。key是文件的哈希值,value是节点ID。key和value有相同的值域,都是160位。每一个新加入网络的计算机都会被随机分配一个节点ID值。数据存放在key值与ID值最接近key值的节点上。XOR运算可以解决这个问题。<key,value>在160位Hash上,判断两个节点x,y的距离远近的方法是进行二进制运算异或。两个二进制位结果相同,它们的异或值是0,如不同,值为1.

如果给定了x ,任意一个a(a>=0)会唯一确定另一个节点y,满足d(x,y)=a。假设这里的x是我们需要查询的文件key,我们只需要不断更新y,使得y沿着d(x,y)下降的方向找下去,那么一定能收敛到距离x最近的点。

文件就是放在网络编号与文件哈希的XOR最近的几个节点上。只要沿着XOR距离降低的方向查找,从任意一个网络节点开始查询,我们总能找到这个存放文件的地址。而且每次更新总能筛选掉一半的节点,那么最多只需logN步即可到达。

节点路由表K-Bucket

节点路由表用于保存每个节点与自己一定距离范围内其他节点的连接信息。每一条路由信息由如下3部分组成:IP Address、UDP Port、Node ID。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值