IPFS基本使用

什么是区块链

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


安装IPFS

安装IPFS主程序: https://blog.csdn.net/omaidb/article/details/107941175


IPFS常用命令

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命令手册

  1. ipfs config:用于配置 IPFS 节点的各种设置,例如网络端口路由协议数据存储位置等。
  2. ipfs version:显示已安装的 IPFS 版本信息。
  3. 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不间断会话

# 新建一个会话
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

1addtmp.txt文件的hashQmaj4BdgjHVtLvs1K3kYCbptPohyHMp8Mc8dJACC9Lp4bf
在这里插入图片描述
在这里插入图片描述


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

在这里插入图片描述

tmp.txt文件修改后,第2addtmp.txt文件的hashQmYfMvnujGaCggxNvnoRvJrcHZ6TU9KpKNwku9Z1nWaDi1
在这里插入图片描述

由此可见每次修改文件,都会产生一个新的文件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–把文件钉住,防止常用不使用文件被“回收”.
PinningIPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,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

在这里插入图片描述

ipfscat/ipns/IPNS名称哈希值/文件名
ipfscat/ipns/k51qzi5uqu5dgzbpn7kfzn4hsyp1gddc0eqlfq6x2fatlq441cuek0ykrv54ri/test1.txt
ipfscat/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 发布
  • 命令中的QmV8y6qauLHd3LprUmtHKEtP3zcrcdriG7oAba9bCxK9MNdoc目录的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 记录:

记录类型主机记录记录值
TXTipfsdnslink=/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目录即可

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
IPFS (InterPlanetary File System) 是一个开源的分布式文件系统,它通过使用分布式哈希表来连接全球计算机网络,提供了一个去中心化的存储和共享文件的方式。你可以使用 Python 来与 IPFS 进行交互和操作。 在 Python 中,你可以使用 ipfshttpclient 库来连接并与 IPFS 节点进行通信。首先,你需要安装该库,可以使用以下命令来安装: ``` pip install ipfshttpclient ``` 安装完成后,你可以按照以下示例代码来使用 IPFS基本功能: ```python import ipfshttpclient # 连接到 IPFS 节点 client = ipfshttpclient.connect() # 添加文件到 IPFS res = client.add('path/to/file.txt') file_hash = res['Hash'] print(f'File uploaded, IPFS hash: {file_hash}') # 获取文件内容 content = client.cat(file_hash) print(f'File content: {content}') # 获取文件的信息 file_info = client.stat(file_hash) print(f'File size: {file_info["Size"]}') # 下载文件到本地 client.get(file_hash) # 关闭连接 client.close() ``` 以上代码演示了如何连接到 IPFS 节点、上传文件、获取文件内容和信息、下载文件等基本操作。你可以根据自己的需求进行扩展和调整。 请注意,在实际使用中,你需要确保 IPFS 节点正常运行并具备访问权限。另外,IPFS 是一个分布式系统,因此文件上传后并不能立即在全球范围内被访问到,需要等待网络中的节点完成传播和同步。 希望这能帮助到你!如果你有任何其他问题,请随时提问。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值