IPFS理论及其操作


参考博客:
https://blog.csdn.net/SweeNeil/article/details/82762553

理论部分

IPFS(星际文件系统),是一个分布式文件系统协议。IPFS协议定义了文件在分布式系统中如何存储、索引、传输。IPFS的目标是通过一个文件系统将网络中的所有的设备连接在起来。

IPFS基础原理

简介

1.基于内容寻址,而非基于域名寻址。文件具有唯一存在的唯一性,一个文件加入到IPFS的网络,基于计算对内容赋予一个唯一加密的哈希值。
2.提供文件的历史版本控制器(如git),并且让多个节点使用保存不同版本的文件;
3.IPFS的网络运行着一条区块链,即用来存储互联网文件的哈希值表,每次有网络访问,即要在链上查询该内容(文件)的地址;
4.通过使用代币(FileCoin)的激励作用,让各节点有动力去存储数据。FileCoin是一个由加密货币驱动的存储网络。矿工通过为网络提供开放的硬盘空间获得FileCoin,而用户则用FileCoin来支付在去中心化网络中存储加密文件的费用。

工作机制

IPFS为每一个文件分配一个独一无二的hash值,这个方式使得IPFS可以支持基于文件内容寻址。IPFS在整个网络范围内去掉重复的文件,并且为每一个文件建立版本管理。当查询文件的时候,IPFS网络根据文件的hash值进行查找。为了让用户更好的记文件存放的hash,IPFS利用IPNS将hash值映射一个比较容易记忆的IPNS名字,每个节点除了存储自己需要的数据,还需要存储一张hash表,用来记录文件存储的位置,进行文件的查询下载。

实验部分——IPFS环境搭建

实验环境:Windows10 + VirtualBox + Ubuntu16.04.6

1
sudo apt-get update

刷新存储库索引

1
sudo apt-get install golang-go -y

安装软件包
下载IPFS,wget是一个网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议。
在这里插入图片描述

1
ipfs version

查看ipfs的版本

1
ipfs init

创建ipfs节点
查看是否安装完成:
在这里插入图片描述

IPFS常用命令

1.查看本地节点初始目录中的文件
在这里插入图片描述
2.查看本地已经存储的所有文件

1
ipfs pin ls

在这里插入图片描述
3.查看可以看到的所有的可用命令

1
ipfs commands

在这里插入图片描述
启动服务器节点

1
ipfs daemon

在这里插入图片描述
在浏览器中输入:http://localhost:5001/webui
看到IPFS UI界面说明节点服务器启动成功。
在这里插入图片描述
查看节点信息:
图形化界面中查看:
在这里插入图片描述
终端中查看:

1
ipfs id

在这里插入图片描述
在IPFS网络中添加文件信息:
1.添加文本文件(首先要确保有test.txt文件)

1
ipfs add test.txt

在这里插入图片描述
生成的哈希值就是该文件在网络中的地址(CID为base58格式)。
检查该文件:
在这里插入图片描述
从上图可知,这个CID值的HASH值不是我们想要的HASH值,这是由于原本的hash太长了,一堆数字读起来不容易,所以需要再进行编码,压缩其长度,且容易被传播,为此,IPFS采用了Base58这种编码。在这里插入图片描述
IPFS现在的multihash值,都是以1220开头的,按照Base58的算法,算出来的结果都是以Qm开头的。
IPFS如何计算文件hash?
IPFS采用了SHA2-256算法,对任意长度的内容,生成的hash值长度固定,都是32个字节。在Linux下,直接用sha256sum可以计算SHA2-256格式的HASH值。虽然目前用的是SHA-256,但是可以支持多种HASH算法,可以升级算法,但是不会有大的架构改动。于是,IPFS采用了multihash这种简单的HASH表示方法,支持多种HASH算法。如果未来修改算法,用的仍然是multihash,保证了表达方式的持续性。
multihash是一种自识别hash。multihash多重哈希遵循TLV模式(type-length-value)。其实就是一个字符串,由三部分组成:HASH算法编码、HASH值得长度(字节数)、HASH值。
SHA2-256的编码为Ox12,其HASH摘要长度为32字节(十六进制数为0x20)。把1220加到前面所得HASH至的开头。例如本例文件的multihash编码(十六进制)。
在这里插入图片描述
简化总结为:原始数据添加元数据封装为IPFS文件—>计算SHA2-256—>封装成multihash—>转化为Base58。
2.下载视频文件

1
2
sudo pip3 install you-get
you-get 视频的网页链接

在这里插入图片描述
将主目录下查看该视频文件,将该视频文件添加到IPFS网络中,检查该文件:
在这里插入图片描述
在这里插入图片描述
为什么这个文件会有links呢?主要归结于IPFS如何存储并共享文件
IPFS上的文件都存储在IPFS对象中,每个对象最多可以存储256KB的数据,也可以包含连接其他IPFS对象的链接。那么超过256KB的文件怎么办呢?比如一个图片或者一个视频,这些大型文件会被分割成数个IPFS对象。每一个对象都是256KB。之后系统会生成一个空白IPFS对象与包含这个文件的其他所有IPFS对象链接。IPFS的数据结果非常简单但却非常强大。这一结构使我们可以把它作为文件系统来使用。这是一个包含了一些文件的简单索引结构,可以将其转成IPFS对象,每一个文件和索引都生成一个IPFS对象。一旦一个文件加入了网络就不能被修改了,这是一个不能篡改的数据存储库,非常类似于区块链。
在这里插入图片描述
3.下载照片文件

1
you-get  照片的网页链接

在这里插入图片描述
将其添加到IPFS网络,检查该文件:
在这里插入图片描述
在这里插入图片描述
以上过程为IPFS的环境搭建以及文件上传过程。下一步计划验证各种类型文件的共享。

IPFS的缺点

IPFS面临最大的问题就是保持文件在线,网络上的每个节点都保存了其下载过的文件的缓存,如果有其他人需要该文件,这些节点就可以与其分享。但如果某个文件存储在4个节点上,而这4个节点都不在线,那么就无人能够获取这个文件了。
解决方案:
1.奖励那些存储并时刻在线的人;
2.主动把文件分布存储。
以保证网络上总会有一定数据的节点在线。

IPFS指令学习

基本命令:
init ——初始化IPFS本地配置
Add ——添加一个文件到IPFS
cat —— 展示IPFS对象数据
get —— 下载IPFS对象
ls —— 从一个对象中列出链接
refs —— 从一个对象中列出链接哈希
数据结构命令:
block —— 与数据存储中的原始块交互
object —— 与原始DAG节点交互
高级命令:
daemon —— 开启一个开始运行的后台进程
mount —— 挂载一个IPFS只读的挂载点
name —— 发布并解析IPFS名字
key —— 创建并列出IPFS名字密钥对
pin —— 将对象锁定到本地存储
网络命令:
id —— 展示IPFS节点信息
bootstrap —— 添加或删除引导文件
swarm —— 管理p2p网络连接
工具命令:
config —— 管理配置
version —— 展示IPFS版本信息
update —— 下载并应用go-ipfs更新
commands —— 列出所有可用命令