详解IPFS技术架构与应用

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介:

IPFS是什么?

星际文件系统(InterPlanetary File System)

本质上是一种内容可寻址、版本化、点对点超媒体的分布式存储、传输协议,目标是补充乃至取代过去20年里使用的超文本媒体传输协议(HTTP),希望构建更快、更安全、更自由开放的互联网时代。

Ipfs最核心的技术是p2p,原来是中心化的服务器在分发内容,现在我们想要下载某一个内容,可以直接建立一个连接,也可以跟其他人连接,迅雷也是这种模式,它是一个虚拟的p2p中心网络,这里不多细讲。

为什么需要IPFS?

HTTP的中心化是低效的, 并且成本很高

油管上,鸟叔的“江南style”这个视频,累计被播放30亿次,假设这个文件100MB大小,则播放这个视频浪费300Petabytes(1P=1,000,000GB)的网络流量,按照0.01USD/GB算CDN成本,谷歌将支付300W美金给ISP服务商。

使用HTTP协议每次需要从中心化的服务器下载完整的文件(网页, 视频, 图片等), 速度慢, 效率低。如果改用P2P的方式下载, 可以节省近60%的带宽。

f5649751f2e3be3c3f29f607cc1958c889c59540

Web文件经常被删除

http的页面平均生存周期大约只有100天,Web文件由于存储成本太高经常被删除,无法永久保存。

IPFS提供了文件的历史版本回溯功能(就像git版本控制工具一样), 可以很容易的查看文件的历史版本, 且数据无法删除,可以得到永久保存。

9a0e5b197992eea8a1ba857b4ea654c639004551

中心化限制了web的成长

现在使用的互联网其实是由数百万个分布在世界各地的服务器构成的。世界最大的芯片制造厂商 Intel 有大约10万台服务器,Facebook有3万台,美国最大的电话公司 AT&T 也有2万台,而 Google有超过100万台服务器。

在现有的http协议下,所有的数据都保存在这些巨头的服务器上,这是高度中心化的。巨头不但对我们的数据有绝对的控制权和解释权,各种各样的监管,封锁,监控一定程度上也极大的限制了创新和发展。

建立在去中心化的分布式网络上的IFPS很难被中心化管理和限制,互联网将更加开放。

9f77e3f9633d0c78c13a62aa413e5152a6fb2878

互联网应用高度依赖互联网主干网

过于中心化,为了支撑http协议,服务器7*24小时开启,对于大流量公司,比如百度、腾讯、阿里等,投入大量资源维护服务器和安全隐患,防止DDoS,XSS,CSRF等攻击。

主干网络受制于战争,自然灾害,中心服务器宕机等因素,都可能造成整个互联网中断服务。

IPFS可以极大的降低对中心主干网络的依赖。

417b2fc9a50aa0b0e646f356a0db636751f96d27

IPFS如何工作?

IPFS为每一个文件分配一个独一无二的哈希值(文件指纹: 根据文件的内容进行创建), 即使是两个文件内容只有1个比特的不相同,其哈希值也是不相同的。所以IPFS是基于文件内容进行寻址, 而不像传统的HTTP协议一样基于域名寻址。

IPFS在整个网络范围内去掉重复的文件, 并且为文件建立版本管理, 也就是说每一个文件的变更历史都将被记录(这一点类似版本控制工具git,svn等), 可以很容易个回到文件的历史版本查看数据。

当查询文件的时候, IPFS网络根据文件的哈希值(全网唯一)进行查找。 由于每个文件的哈希值全网唯一, 查询将很容易进行。

如果仅仅使用哈希值来区分文件的话,会给传播造成困难,因为哈希值不容易记忆,就像ip地址一样不容易记忆,于是人类发明的域名。IPFS利用IPNS将哈希值映射为容易记的名字。

每个节点除了存储自己需要的数据,还存储了一张哈希表, 用来记录文件存储所在的位置,用来进行文件的查询下载。

IPFS的架构

IPFS 协议栈

身份 S/Kademlia生成 对等身份信息生成

网络 任意传输层协议 ICE NET & NAT穿透

路由 分布式松散哈希表(DSHT) 定位对等点和存储对象需要的信息

交换 BitTorrent& BitSwap 管理区块如何分布

对象 Merkle-DAG 内容可寻址的不可篡改、去冗余的对象链接

文件 类似Git 版本控制的文件系统:blob,list, tree, commit

命名 具有SFS(Self-CertifiedFilesystems)IPNS:DAG对象命名可变

应用 在IPFS上运行的应用程序利用最近节点提供服务提供效率、降低成本

身份层和路由层

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

网络层

LibP2P可以支持任意传输层协议。

ICE NAT traversal框架整合STUN、TURN和其他类型的NAT协议,该框架可以让客户端利用各种NAT方式打通网络,从而完成NAT通信,这对于IPFS的p2p网络非常重要。

交换层

类似迅雷这样的BT工具,IPFS团队把BitTorrent进行了创新,叫作Bitswap,它增加了信用和帐单体系来激励节点去分享,用户在发送给其他节点数据可以增加信用值,从其他节点接受数据降低信用值。如果用户只去接收数据而不分享数据,信用分会越来越低而被其他节点忽略掉。

对象层和文件层

共同管理IPFS上80%的数据结构。

大部分数据对象都是以MerkleDag的结构存在,这为内容寻址和去重提供了便利。

文件层是一个新的数据结构,和DAG并列,采用Git一样的数据结构来支持版本快照。

命名层

具有自我验证的特性(当其他用户获取该对象时,使用指纹公钥进行验签,即验证所用的公钥是否与NodeId匹配,这验证了用户发布对象的真实性,同时也获取到了可变状态),并且加入了IPNS这个巧妙的设计来使得加密后的DAG对象名可定义,增强可阅读性。

应用层

IPFS核心价值就在于上面运行的应用程序,可以利用它类似CDN的功能,在成本很低的带宽下,去获得想要的数据,从而提升整个应用程序的效率。

IPFS家族

IPFS项目其实很大,并不是一个东西,IPFS是由很多模块组成,每一个模块现在都已经独立成项目了,并且有自己的主页。

协议实验室的主页:https://protocol.ai/projects/

在协议实验室的主页上面,可以找到目前的五个项目,来简单看一下IPFS家族成员:

2d3ee13348aa4c139783ebfbe47a39ec8540d892


Filecoin

IPFS只是一个协议, 并不是挖矿软件本身。Filecoin系统才是挖矿软件本身, 代币名字是 FIL。Filecoin使用了IPFS 协议来运行系统。

FIL代币总共有20亿枚。分配方案,总共有四个部分组成:

70%作为挖矿的回报:像比特币一样根据挖矿的进度逐步分发

15%预留Protocol Labs:作为研发费用, 6年逐步解禁

10%分配给ICO投资者: 根据挖矿进度, 逐步解禁

5%预留给Filecoin基金会: 作为长期社区建设, 网络管理等费用, 6年逐步解禁

私募时间:2017.07.21-2017.7.24

成本:0.75美元

行权期:1-3年,折扣额0-30%

参与人数:150+人

募集金额:0.52亿美元

公募时间:2017.08.07-2017.09.07

成本:1-5美元

行权期:1-3年,折扣额0-30%

参与人数:2100+人

募集资金:2.05亿美元

Filecoin与挖矿市场

Filecoin存储市场(Filecoin Storage Market)

数据存储市场所需要贡献的就是硬盘存储空间,越多的硬盘空间,挖矿能力就越高,存储市场采用的工作量证明是PoS(Power of Storage)证明,根据存储的数据大小来按比例分配FIL

Filecoin数据检索市场(Filecoin's Retrieval Market)

数据检索市场贡献带宽,根据访问数据的流量来分配FIL

Filecoin场景

用户场景:

1.用户提交数据存储订单(PUT)给Filecoin系统

2.用户提价数据检索订单(GET)给Filecoin系统

3.如果上述订单达成,用户支付FIL以获取相应的服务

存储矿工场景:

1.在区块链上注册自己硬盘空间,注册完成后硬盘空间将被记录到区块链的配置表里面

2.接受订单,用户提交的存储订单(PUT)

3.订单交易达成后,双方对交易进行签名,矿工完成数据存储,交易完成后该交易被记录到区块

4.用户获取到对应的支付

检索矿工场景:

1.接受订单,用户提交数据查询订单(GET)

2.交易达成后,双方对交易进行签名,矿工把数据发送给用户,该交易提交到区块

Filecoin证明

数据持有性证明(Provable Data Possession ,PDP):用户发送数据给矿工进行存储,矿工证明数据已经被自己存储,用户可以重复检查矿工是否还在存储自己的数据

可检索证明(Proof-of-Retrievability,PoRet):和PDP过程比较类似,证明矿工存储的数据是可以用来查询的

存储证明(Proof-of-Storage ,PoS):利用存储空间进行的证明。工作量证明的一种,Filecoin上一篇论文使用了这个名字,新的论文则升级为PoRep

复制证明(Proof-of-Replication,PoRep):新的 PoS(Proof-of-Storage),PoRep可以保证每份数据的存储都是独立的,可以防止女巫攻击,外源攻击和生成攻击

工作量证明(Proof-of-Work,PoW):证明者向检验者证明自己花费了一定的资源,PoW被用在加密货币,拜占庭共识和其他各种区块链系统。BTC使用的就是这种类型的证明,依赖巨量的哈希计算和能源消耗来建立共识和保证btc网络的安全性

空间证明(Proof-of-Space,PoSpace):Filecoin提出的概念,存储量的证明,PoSpace是PoW的一种,不同的是PoW使用的计算资源,而PoSpace使用的是存储资源

时空证明(Proof-of-Spacetime,PoSt):时空证明,矿工证明自己花费了spacetime资源,即:一定时间内的存储空间的使用,PoSt是基于PoReps实现的

Libp2p

IPFS团队将点对点(peer-to-peer)网络的网络层从IPFS工程里面分离出来,形成一个独立的项目,这就是libp2p。该项目不仅可以供IPFS使用,也可以提供其它项目使用,作为一个p2p工程的底层协议存在。

主要功能:

发现节点

连接节点

发现数据

传输数据

07aa620d083a29967f99f02929c30a154771639c

IPLD

IPLD定义了基于内容寻址的统一数据结构类型。它是一个转换器,可以把现有的异构的数据结构(基于内容寻址)统一成一种格式,方便不同系统之间的数据交换和互操作。

通过哈希进行内容寻址的技术已经广泛应用于各种分布式系统。从加密货币的区块链到备份代码的每一次提交,再到各种web内容,他们背后的逻辑几乎是相同的,然后由于数据结构的不兼容,造成了这些数据无法互相操作。IPLD作为中间层统一了这些异构的数据结构,使得不同的数据可以进行数据交换。

IPLD的组成:

CID(Self-describingcontent-addressed identifiers for distributed systems):基于内容寻址的自我描述标识

IPLDtree:基于 JSON、Protobuf和路径导航的跨协议的数据模型

IPLD Resolvers: IPLD转换器,可以添加新的协议到IPLD里面

Multiformats

Multiformats是一系列协议的集合,它在现有协议基础上对值(值:通常是具有某一项表达意义的)进行自我描述改造,即从值上就可以知道该值是如何产生的。

当前multiformats协议里面包含以下协议。

multihash- self-describing hashes

multiaddr- self-describing network addresses

multibase- self-describing base encodings

multicodec - self-describingserialization

multistream- self-describing stream network protocols

multigram(WIP) - self-describing packet network protocols

通常情况下我们使用的哈希计算方法都是某一种实现方式,比如sha1,sha2-256等。哈希计算在软件工程里面几乎随处可见,特别是区块链项,multiformats将所有的哈希值计算统一成同样的格式,为系统开发带来很多好处

以multihash为例:

升级后的哈希值的结构为:

<hash-func-type><digest-length><digest-value>

<哈希函数类型><摘要长度><摘要值>

有一个使用sha2-256函数生成的哈希值(如下),其长度为32(16进制0x20):

41dd7b6443542e75701aa98a0c235951a28a0d851b11564d20022ab11d2589a8

规定sha2-256的代表数字为12(16进制),于是得出来新的哈希值:

122041dd7b6443542e75701aa98a0c235951a28a0d851b11564d20022ab11d2589a8

新的哈希值具有自我描述性质,它说明了自己是怎么来的

IPFS应用及意义

可以为内容创作带来一定的自由

代表应用:

Akasha( https://blog.akasha.world )是一个基于以太坊和IPFS的社交博客创作平台,用户创作的博客内容通过一个IPFS网络进行发布,而非中心服务器。

同时,用户和以太坊钱包账户进行绑定,用户可以对优质内容进行ETH打赏,内容创作者能以此赚取ETH,如同人脑挖矿一样。它没有太多监管的限制,也没有中间商抽成,内容收益直接归创作者所有。

可以降低存储和带宽成本

代表应用:

Dtube(https://d.tube)是一个搭建在Steemit上的去中心化视频播放平台,其用户上传的视频文件都经过IPFS协议进行存储,具有唯一标识。相较于传统视频网站,它降低了同资源冗余程度,同时大大节约了海量用户在播放视频时所产生的带宽成本。

可以与区块链完美结合

代表应用:

EOS引以为傲的是可以支持百万级别TPS的并发量,其中除了DPOS共识机制的功劳之外,还归功于其底层存储设计是采取IPFS来解决大型数据的传输效率。

EOS将自己打包好的区块数据通过IPLD进行异构处理,统一成一种便于内容寻址的数据结构类型,并挂载到IPFS的link上,让IPFS网络承担存储和P2P检索的逻辑,而不消耗EOS区块链系统本身太多的计算资源。


原文发布时间为:2018-04-18

本文作者:朱清

本文来自云栖社区合作伙伴“中生代技术”,了解相关信息可以关注“中生代技术”。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
15天前
|
运维 持续交付 开发工具
深入浅出:GitOps在微服务架构中的应用
【10月更文挑战第26天】本文深入探讨了GitOps在微服务架构中的应用,介绍了其核心理念、自动化部署流程和增强的可观测性。通过实例展示了GitOps如何简化服务部署、配置管理和故障恢复,并推荐了一些实用工具和开发技巧。
|
6天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
6天前
|
网络协议 数据挖掘 5G
适用于金融和交易应用的低延迟网络:技术、架构与应用
适用于金融和交易应用的低延迟网络:技术、架构与应用
30 5
|
7天前
|
Go 数据处理 API
Go语言在微服务架构中的应用与优势
本文摘要采用问答形式,以期提供更直接的信息获取方式。 Q1: 为什么选择Go语言进行微服务开发? A1: Go语言的并发模型、简洁的语法和高效的编译速度使其成为微服务架构的理想选择。 Q2: Go语言在微服务架构中有哪些优势? A2: 主要优势包括高性能、高并发处理能力、简洁的代码和强大的标准库。 Q3: 文章将如何展示Go语言在微服务中的应用? A3: 通过对比其他语言和展示Go语言在实际项目中的应用案例,来说明其在微服务架构中的优势。
|
5天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
5天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
13天前
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
51 1
|
15天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
51 1
|
18天前
|
前端开发 API UED
深入理解微前端架构:构建灵活、高效的前端应用
【10月更文挑战第23天】微前端架构是一种将前端应用分解为多个小型、独立、可复用的服务的方法。每个服务独立开发和部署,但共同提供一致的用户体验。本文探讨了微前端架构的核心概念、优势及实施方法,包括定义服务边界、建立通信机制、共享UI组件库和版本控制等。通过实际案例和职业心得,帮助读者更好地理解和应用微前端架构。