ipfs区块链存储
什么是区块链



安装IPFS
安装IPFS主程序: https://blog.csdn.net/omaidb/article/details/107941175
IPFS常用命令
基本命令
| 参数 | 解释 |
|---|---|
| init | 初始化IPFS本地配置 |
| add | 添加一个文件到IPFS |
| cat | 展示IPFS数据 |
| get | 下载IPFS对象 |
| ls | 从一个对象中列出链接 |
| refs | 从一个对象中列出链接哈希 |
数据结构命令
| 参数 | 解释 |
|---|---|
| block | 从数据存储中的原始块交互 |
| object | 与原始DAG节点交互 |
高级命令
| 参数 | 解释 |
|---|---|
| daemon | 运行ipfs的守护进程 |
| mount | 挂载一个IPFS只读的挂载点 |
| name | 发布并解析IPFS名字 |
| key | 创建并列出IPFS名字密钥对 |
| pin | 将对象锁定到本地存储 |
网络展示
| 参数 | 解释 |
|---|---|
| id | 展示IPFS节点信息 |
| bootstrap | 添加或删除引导文件 |
| swarm | 管理P2P网络连接 |
工具命令
| 参数 | 解释 |
|---|---|
| config | 管理配置 |
| version | 展示IPFS版本信息 |
| update | 下载并应用go-ipfs更新 |
| commands | 列出所有可用命令 |
# 更新ipfs版本
ipfs update install latest
# 查看所有ipfs命令
ipfs commands

状态查看命令
# 显示节点的带宽使用情况,包括上传和下载的数据量
ipfs stats bw

# 显示节点存储库(repo)的相关统计信息,如存储使用量和对象数量等
ipfs stats repo

# 显示与 Bitswap 协议相关的统计信息,包括数据块交换和网络流量情况
ipfs stats bitswap

# 显示 DHT(分布式哈希表)的统计信息,包括路由表大小和查询次数等
ipfs stats dht

# # 返回有关节点的(重新)提供者系统的统计信息。
ipfs stats provide

IPFS基本使用示例:
ipfs config:用于配置 IPFS 节点的各种设置,例如网络端口、路由协议和数据存储位置等。ipfs version:显示已安装的 IPFS 版本信息。ipfs help:显示可用命令列表及其用法说明。
IPFS初始化
# # 初始化一个新的 IPFS 仓库
## 自动创建~/.ipfs 目录,用于保存配置文件和数据存储区域
ipfs init
## --profile=lowpower 节能模式运行,省电但效率低
ipfs init --profile=lowpower
# 执行完初始化命令后,会生成一个秘钥对并产生对应的节点id.即ipfs init 下方的peer identity
peer identity: 12D3KooWKwagJEtGiwQLRReNqHj5naRsXmD3MWdUWQnV2BcnVAd3
# 节点的id用来标识和连接一个节点,每个节点的id是独一无二的.
在服务器上运行ipfs
# 如果服务器上运行,则应使用server配置文件初始化IPFS 。这可以防止IPFS在尝试发现本地节点时创建大量数据中心内部流量:
ipfs init --profile server
# 生成一个用于 IPFS 群集的加密密钥--非必需
ipfs-swarm-key-gen > ~/.ipfs/swarm.key
# 将所有连到我们私有节点的其它节点都断开--非必需
ipfs bootstrap rm --all
# 添加其中一台节点的地址到另一台节点的bootstrap列表中
ipfs bootstrap add /ip4/172.16.0.113/tcp/4001/ipfs/${Peer ID(对等节点标识符)}
## 示例
ipfs bootstrap add /ip4/172.16.0.113/tcp/4001/ipfs/QmV7Thb3mjuWa1xDK5UrgtG7SSYFt4PSyvo6CjcnA5gZAg
IPFS配置
# 输出配置文件内容
ipfs config show
# 打开 $EDITOR 编辑器以编辑配置文件
ipfs config edit
# 应用配置文件中的配置文件
ipfs config profile
# 使用指定的 <file> 文件替换配置文件
ipfs config replace <file>
修改IPFS配置
# 在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:
# cd到ipfs配置目录
cd ~/.ipfs
# 查看该目录下的文件
ls
# 得到的结果如下
# api config datastore_spec keystore version
# blocks datastore gateway repo.lock

# 编辑配置文件
vim config
#将Addresses节点下的"API": "/ip4/127.0.0.1/tcp/5001"改为
"API": "/ip4/0.0.0.0/tcp/5001"
打开本地webui控制台
http://localhost:5001/webui
# 或
http://127.0.0.1:5001/webui
启动IPFS守护进程
# 新建一个会话
screen -R ipfs
# 启动守护进程
## 实测并不后台运行,会阻塞终端,所以要用screen
ipfs daemon
# 开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:
# •API服务,默认在5001端口,可以通过 http://localhost:5001/webui[3] 进行访问,界面如:
# •网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。
# ipfs 也提供了官方的网关服务:https://ipfs.io/,[4] 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi[5] (需要访问外国网站)来访问刚刚上传到ipfs 的文件。

查看IPFS网络
如果您已连接到IPFS网络,则在运行时应该能够看到对等方的IPFS地址:
# 列出当前节点连接的所有对等节点(peers)
ipfs swarm peers

# 查看当前节点的身份信息
## 查看第一行Peer ID
ipfs id

将文件添加到IPFS
# 创建一个txt文件
echo "ipfs文件上传测试" > ipfs文件上传测试.txt
# 将txt文件添加到 IPFS 中,并返回唯一的加密哈希值
ipfs add ipfs文件上传测试.txt
## 此时文件仅仅只是上传到本地的IPFS节点中,如果需要把文件同步到网络,就需要开启daemon服务才同步到网络
# 当它文件添加到节点时,会为文件生成唯一的hash: QmPiRCRWGGGkKzm5mqRxq5u2N713ES1XSjPV3WASKFMWGC

1.第一次添加文件
# 查看ipfs文件pin列表
ipfs pin ls
# 查看示范文件内容
cat tmp.txt
# 添加示范文件到ipfs
ipfs add tmp.txt
# 根据tmp.txt的hash查看文件是否钉住
ipfs pin ls hash
# 查看ipfs上的tmp.txt文件内容
ipfs cat hash
第1次add的tmp.txt文件的hash是Qmaj4BdgjHVtLvs1K3kYCbptPohyHMp8Mc8dJACC9Lp4bf


2.修改文件后第二次添加

tmp.txt文件修改后,第2次add的tmp.txt文件的hash是QmYfMvnujGaCggxNvnoRvJrcHZ6TU9KpKNwku9Z1nWaDi1

由此可见:每次修改文件,都会产生一个新的文件hash。
在ipfs中,这是两个完全不同的文件。

IPFS查看文件
# IPFS查看文件
ipfs cat 文件的hash

在浏览器本地访问IPFS链接:
http://127.0.0.1:8080/ipfs/QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP 来访问。
通过IPFS网关访问上传的文件
| IPFS域名 | CID |
|---|---|
| https://ipfs.io/ipfs/ | bafybeicrjwtkwruqdlemanz3vojebx42qrwoqda5yytnfcpftrz4ihfsha |
通过下方链接访问刚才上传的PDF电子书目录。
https://ipfs.io/ipfs/bafybeicrjwtkwruqdlemanz3vojebx42qrwoqda5yytnfcpftrz4ihfsha

将目录添加到IPFS
# 将cn字体目录添加到IPFS
## 上传目录时要使用-r 参数
## -r: 递归地添加目录中的文件
## -Q: 以静默模式运行,仅返回生成的根哈希,而不显示其他输出
## -n: 显示每个添加的文件的哈希值
ipfs add -r cn字体

IPFS查看目录
# 查看目录
## -v 选项表示“详细模式”,它将显示每个对象的详细信息,包括文件名、大小、哈希值和类型
ipfs ls -v <the-hash-here>
ipfs ls <the-hash-here>/dirname

PIN固定文件
PIN功能将指定 CID 固定在本地节点上,以确保它不会被自动垃圾回收。
Pining–把文件钉住,防止常用或不使用文件被“回收”.
Pinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache机制来处理文件, 如果文件在一段时间内没有被使用,文件会被回收。 Pinning 的作用就是把文件钉住,确保文件在本地不被回收。 如果是重要的文件,就可以使用 Pinning来 ·防止文件被删除·。
# 将对象固定到本地节点
ipfs pin add <the-hash-here>
# 查看文件
ipfs ls <the-hash-here>
文件块 的 5 种 Pin 状态
https://www.jianshu.com/p/4d3844ee4eab
-
Recursive状态:文件块树被递归添加到pin中,根文件块的状态是Recursive。这意味着,文件及其所有子目录和子文件都被pin,以确保它们一直保留在网络中。这种状态可以通过ipfs pin ls --type=recursive命令来查询。 -
Direct状态:只有目标文件块添加到pin中,子孙块不做处理,目标文件块的状态就是Direct。这种状态可以通过ipfs pin ls --type=direct命令来查询。 -
Indirect状态:文件块树被递归添加到pin中,根文件块的状态是Recursive,非根文件块的状态是Indirect。这种状态可以通过ipfs pin ls --type=indirect命令来查询。 -
Internal状态:IPFS使用文件块来保存pinner状态,这些文件块的状态就是Internal。这种状态通常不需要用户了解,因为它们是IPFS内部使用的。 -
NotPinned状态:文件块没有被pin,并且在垃圾回收(GC)时会被删除。这种状态可以通过ipfs pin ls --type=not-pinned命令来查询。
需要注意的是,以上状态并不是互斥的。
例如,一个文件块可以同时具有Recursive和Indirect状态。此外,状态的变化可能会在不同的节点之间异步更新,因此状态可能在不同的节点之间存在延迟。
# 查看pin列表
ipfs pin ls

手动PIN(钉住)一个文件
# 手动钉住一个文件
ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7

查询某个hash是否被pin
# 下面这个是被pin的
ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
recursive意思是文件已被PIN(钉住)

这个是没有被PIN的文件示例:
ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
# 没有被PIN的文件回显
Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned
列出在本地节点上递归固定的所有内容
# 已固定到本地存储的所有对象的列表
ipfs pin ls --type=all
# 列出在本地节点上递归固定的所有内容
ipfs pin ls --type recursive

手动取消PIN(钉住)
# 删除固定对象pin状态,-r参数是递归删除pin状态
## ipfs pin rm <the-hash-here>
ipfs pin rm -r 文件hash

垃圾回收
执行垃圾回收清理未被固定或未被引用的对象,没有钉住的文件会被删除。
释放与这些未固定或未引用的对象相关联的磁盘空间。
# 执行垃圾回收
ipfs repo gc

使用IPNS绑定节点名
文件传统路径格式:固定的https://ipfs.io/ipfs/固定路径字符串/文件名
每次 add 都会返回不同的哈希,这和传统的固定路径完全不同。
IPNS将多个IPFS哈希值映射到一个可变的、易记的字符串名称上。这个名称可以被用作引用一个特定版本的IPFS内容,而不需要知道其哈希值。
IPNS名称是公钥的哈希,私钥则用来发布签名的名称。 当发布或解析名称时,默认情况下总是使用发布者自身的节点ID,也就是节点 公钥的哈希。
如果您想要引用多个文件或目录,最好使用一个顶层的目录,将所有文件和子目录都包含在其中。
无论修改哪个文件,只需要重新映射该目录第hash即可,外部访问时的hash地址和文件绝对路径不会变化。
IPNS默认有效期是24小时,要保持地址不变,每24小时要发布一次。
0.查看IPFS节点的密钥对
# 查看IPFS节点有哪些密钥对
ipfs key list

# 查看密钥对详情
ipfs key list -l
默认值:self

k51qzi5uqu5dgzbpn7kfzn4hsyp1gddc0eqlfq6x2fatlq441cuek0ykrv54ri是这个公钥的IPFS哈希值,后面将固定使用这个哈希值。
1.创建目录及目录下文件
# 创建目录
mkdir doc
# 创建子文件1
echo "1.第一次添加文件1测试" > doc/test1.txt
# 创建子文件2
echo "1.第一次添加文件2测试" > doc/test2.txt


2.添加目录到IPFS
# 将doc目录添加到ipfs中
## 上传目录时要使用-r 参数
## -r: 递归地添加目录中的文件
## -Q: 以静默模式运行,仅返回生成的根哈希,而不显示其他输出
## -n: 显示每个添加的文件的哈希值
ipfs add -r doc/
添加目录到IPFS后复制目录的hash。

3.将目录hash发布到节点
# 将目录hash发布到节点
ipfs name publish 目录hash

4.查看目录下的文件内容
ipfs cat /ipns/节点hash/test1.txt

| ipfs | cat | /ipns/ | IPNS名称哈希值 | /文件名 |
|---|---|---|---|---|
| ipfs | cat | /ipns/ | k51qzi5uqu5dgzbpn7kfzn4hsyp1gddc0eqlfq6x2fatlq441cuek0ykrv54ri | /test1.txt |
| ipfs | cat | /ipns/ | k51qzi5uqu5dgzbpn7kfzn4hsyp1gddc0eqlfq6x2fatlq441cuek0ykrv54ri | /test2.txt |
5.修改目录下的文件内容
使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。
每次修改文件后 add 都会返回不同的哈希,修改前的旧访问地址就没访问了,所以我们需要通过 ipns 来绑定节点名来实现固定地址访问。
使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。
# 修改test1.txt文件
echo "1.第一次添加文件1测试;2.第2次修改文件1测试" > doc/test1.txt
# 修改test2.txt文件
echo "1.第一次添加文件2测试;2.第2次修改文件2测试" > doc/test2.txt

5.1 将修改后的目录添加到IPFS
# 将修改后的目录添加到IPFS
## 上传目录时要使用-r 参数
## -r: 递归地添加目录中的文件
## -Q: 以静默模式运行,仅返回生成的根哈希,而不显示其他输出
## -n: 显示每个添加的文件的哈希值
ipfs add -r doc

目录add后的hash值是QmV8y6qauLHd3LprUmtHKEtP3zcrcdriG7oAba9bCxK9MN
5.2 pin住目录
# 将doc目录pin住
ipfs pin add 目录hash
5.3 发布
-
命令中的
QmV8y6qauLHd3LprUmtHKEtP3zcrcdriG7oAba9bCxK9MN是doc目录的hash。 -
命令提示中的
k51qzi5uqu5dgzbpn7kfzn4hsyp1gddc0eqlfq6x2fatlq441cuek0ykrv54ri是当前节点id(大家可以回看一个前面ipfs init的输出)。
# 把修改后的目录发布到节点,使用下面的命令:
# ipfs name publish 文件目录hash
ipfs name publish QmV8y6qauLHd3LprUmtHKEtP3zcrcdriG7oAba9bCxK9MN

发布之后就可以使用http://127.0.0.1:8080/ipns/k51qzi5uqu5dgzbpn7kfzn4hsyp1gddc0eqlfq6x2fatlq441cuek0ykrv54ri
或
https://ipfs.io/ipns/k51qzi5uqu5dgzbpn7kfzn4hsyp1gddc0eqlfq6x2fatlq441cuek0ykrv54ri 来访问doc目录的内容
# 修改文件后记得重新发布一下
ipfs name publish 修改后文件哈希
5.4 查看ipns发布的文件
# 查看文件
ipfs cat /ipns/公钥hash/文件名

6.查询节点id指向的hash
# 查询节点指向的哈希
ipfs name resolve
# 有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。

7.多个站点更新,生成新秘钥对,使用新key发布:
# 生成新的密钥对
ipfs key gen --type=rsa --size=2048 mykey
# QmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
# 使用新密钥发布
ipfs name publish --key=mykey hashxxx
DNS 解析
IPFS 允许用户使用现有的域名系统,这样就能用一个好记的地址来访问文件了,比如:
# 通过域名解析
ipfs cat /ipns/域名/文件名
只需要在 DNS 解析加入一条 TXT 记录:
| 记录类型 | 主机记录 | 记录值 |
|---|---|---|
| TXT | ipfs | dnslink=/ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R |
从IPFS下载文件到本地磁盘
# 下载文件并输出文件名为foo2
ipfs get <the-hash-here> -o foo2
# 对比两个文件
diff foo foo2
从IPFS中获取对象
ipfs object get <the-hash-here>
ipfs object get <the-hash-here>/foo2
ipfs object --help
查找对象引用
它可以用来列出给定哈希值所引用的所有直接子节点和链接对象的哈希值,或者递归地列出所有子节点和链接对象的哈希值。
# 查找引用对象
ipfs refs <the-hash-here>
ipfs refs -r <the-hash-here>
ipfs refs --help
备份ipfs本地数据
如果要切换电脑,可以自行备份下~/.ipfs目录即可
799

被折叠的 条评论
为什么被折叠?



