简介
星际文件系统(InterPlanetary File System,缩写IPFS)是一个旨在创建持久且分布式存储和共享文件的网络传输协议。它是一种 内容可寻址
的 对等超媒体分发
协议。在IPFS网络中的节点将构成一个分布式文件系统。它是一个开放源代码项目,自2014年开始由Protocol Labs在开源社区的帮助下发展。其最初由Juan Benet设计。
项目概况
目前已在 Github 开源,https://github.com/ipfs。Go 语言及 JS 语言版本已经实现,Go作为主力语言,是标准参考。目前社区活跃:过去一个月,项目每周平均大概会解决40个左右的PR。
以 Go 语言版本为例,项目已经实现了以下组件:
项目意义
-
HTTP 是低效且昂贵的
-
HTTP
协议每次从一个服务器下载单个文件,而分布式协议,比如P2P
协议,同时从多个源头获取文件的分片,效率大幅提升。以视频传输为例,有论文指出,P2P 可以节省 60% 带宽。 - IPFS 具备分布式及无重复文件的特性,解决以上问题。
-
-
互联网创造的价值每天都在湮灭
- 据统计,一个网页的生命周期平均只有100天,到处充斥着404
- IPFS 保存文档的每个历史版本并且可以轻松建立弹性的镜像数据
-
中心化抹杀了公众机会
- 互联网是人类史上关于公平和创新的重大工具,但是中心化对这是很大威胁
- IPFS 致力于构造一个开放、扁平的网络空间
-
网络应用过度依赖主干网
- 一旦主干网因为自然灾害或人为因素宕机,应用都会挂掉
- IPFS 多样化的弹性网络可以不依赖于主干网运转
项目目标
干掉 HTTP。
IPFS aims to replace HTTP and
build a better web for all of us.
原理与使用
工作原理
- 当你向 IPFS 上传一个文档的时候,文档被切分成块(bolcks),每个块都有自己单独的唯一地签名标识,这个标识称为加密HASH(cryptographic hash)。
- IPFS将在全网检索是否有重复内容,有的话删除重复部分
- 每个网络节点可以只存储自己感兴趣的文档内容,并且维护一个索引,标识是谁存储了什么文档。
- 在查找文档时,实质上是查找一个加密HASH背后对应的内容
- IPFS 提供一个分布式命名系统
IPNS
,使得可以为文件命名,而不是只能用 HASH
IPFS 与 区块链
IPFS 可以解决海量文件存储的问题,这正好解决了区块链的一个痛点。用户可以把 IPFS 上不变的、永久的访问链接打包到区块链的交易中去。
使用 IPFS
目前,IPFS 已经在 MAC OS / LINUX / WINDOWS 三大平台有了实现版本。当前实现主要是 CMD 命令操作为主。下面以 Windows 平台为例简单介绍其使用方法。
初始化
执行 ipfs init
命令。初始化会在本地生成基础配置,包括 节点标识
,私钥信息
,以及一些网络基础配置,可以通过 ipfs id
查看。
另外,这个命令也会在用户文件夹创建一些基础文件。
启动服务
执行 ipfs daemon
命令。让本地节点接入 IPFS 网络。从命令执行输出可以看出,默认是在本机的 4001
端口进行基于TCP的监听。
节点发现
执行 ipfs swarm peers
命令。会列出当前网络上发现的邻节点。显示结构为
<访问方式>/ipfs/<节点公钥HASH>
Hello World
IPFS 网络在创建时,默认放了一张猫咪图片 cat.jpg
。因此我们可以尝试去下载它,这有点类似于代码世界的 Hello world!
。
文件上传与下载
执行 ipfs add <filename>
命令,可以上传文件。
执行 ipfs get <hash>
命令,可以下载文件。
从示例可以看到,文件在 IPFS 上,以 HASH 直接标识,其值为 QmaAN3Uhj7f6fXzFpWMSid9sjW66Pq51cgCwrxDjSnYfxK
。
Web端
关键技术
文件分块
以刚才上传的文件 QmaAN3Uhj7f6fXzFpWMSid9sjW66Pq51cgCwrxDjSnYfxK
为例,执行 ipfs ls <HASH>
命令,可以看到文件分块情况。这个原大小约 1M 的文件被分成了4个文件块,并且每个块又有自己的HASH。这是因为 IPFS 的存储粒度为 256KB
。这块父块与子块间的关系,在 IPFS 里面采用 DAG
算法组织起来。
此时,我们执行文件块大小查看命令可以看到,子文件块由于存储了实际数据,因此为数据大小。父文件块由于已经被切割,实际内部只包含一些索引信息,大小只有 0.2KB。