IPFS基础-基础操作

本文主要是综合的介绍IPFS的命令行使用方式,掌握对文件的基本操作,同时从整体上对IPFS有一个初步的了解。

IPFS初始化

初始化

首次使用IPFS时,需要执行该命令

1
2
# 初始化IPFS仓库,会在~/.ipfs目录中生成初始化文件,
ipfs init

该命令执行后,会被周围的公共节点发现该节点,如果不想被发现,或者在私有服务器使用IPFS,可以执行如下命令:

1
ipfs init --profile server

初始化文件说明

~/.ipfs中,会生成如下几个文件:

  1. blocks:本地仓库存储的CID文件块链接目录
  2. keystore:密钥对文件存储目录
  3. datastore:LevelDB数据文件目录
  4. config:配置文件(非目录),json格式
  5. version:文件,记录当前IPFS的版本号

IPFS存储文件目录设置

在环境变量中,设置$IPFS_PATH,docker镜像的默认地址设置为了:/data/ipfs/,其余默认一般为:~/.ipfs

config配置文件说明

配置文件无疑是当前最关心的内容,后续可根据需要来调整配置,具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
{
"API": { //节点API配置
"HTTPHeaders": {}
},
"Addresses": { //节点网络通信multiaddress配置
"API": "/ip4/0.0.0.0/tcp/5001",
"Announce": [],
"Gateway": "/ip4/0.0.0.0/tcp/8080",
"NoAnnounce": [],
"Swarm": [
"/ip4/0.0.0.0/tcp/4001",
"/ip6/::/tcp/4001",
"/ip4/0.0.0.0/udp/4001/quic",
"/ip6/::/udp/4001/quic"
]
},
"AutoNAT": {},
"Bootstrap": [ //中继节点multiaddress配置
"/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
"/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
"/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
"/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
"/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
"/ip4/104.131.131.82/udp/4001/quic/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"
],
"Datastore": { //存储配置
"BloomFilterSize": 0,
"GCPeriod": "1h",
"HashOnRead": false,
"Spec": {
"mounts": [
{
"child": {
"path": "blocks",
"shardFunc": "/repo/flatfs/shard/v1/next-to-last/2",
"sync": true,
"type": "flatfs"
},
"mountpoint": "/blocks",
"prefix": "flatfs.datastore",
"type": "measure"
},
{
"child": {
"compression": "none",
"path": "datastore",
"type": "levelds"
},
"mountpoint": "/",
"prefix": "leveldb.datastore",
"type": "measure"
}
],
"type": "mount"
},
"StorageGCWatermark": 90,
"StorageMax": "10GB"
},
"Discovery": { //LibP2P Discovery配置
"MDNS": {
"Enabled": true,
"Interval": 10
}
},
"Experimental": { //实验功能开关配置
"FilestoreEnabled": false,
"GraphsyncEnabled": false,
"Libp2pStreamMounting": false,
"P2pHttpProxy": false,
"ShardingEnabled": false,
"StrategicProviding": false,
"UrlstoreEnabled": false
},
"Gateway": { //HTTP 网关配置
"APICommands": [],
"HTTPHeaders": {
"Access-Control-Allow-Headers": [
"X-Requested-With",
"Range",
"User-Agent"
],
"Access-Control-Allow-Methods": [
"GET"
],
"Access-Control-Allow-Origin": [
"*"
]
},
"NoDNSLink": false,
"NoFetch": false,
"PathPrefixes": [],
"PublicGateways": null,
"RootRedirect": "",
"Writable": false
},
"Identity": { //节点身份信息
"PeerID": "12D3KooWSVzdPE1nXHAh9CyqAayFA8psJ9n6DwTkByiD8gWnm9b1",
"PrivKey": "CAESQMQL3NrWkdjsQ++yxdWvlnCSaltDpYTKRA4+CRZhibgQ9+Hd9lslOXRd0pF4dqCtOIMHMpgtbTVaqba5bfOqYeQ="
},
"Ipns": { //Ipns配置
"RecordLifetime": "",
"RepublishPeriod": "",
"ResolveCacheSize": 128
},
"Mounts": { //文件系统挂载配置
"FuseAllowOther": false,
"IPFS": "/ipfs",
"IPNS": "/ipns"
},
"Peering": {
"Peers": null
},
"Pinning": {
"RemoteServices": {}
},
"Plugins": {
"Plugins": null
},
"Provider": {
"Strategy": ""
},
"Pubsub": {
"DisableSigning": false,
"Router": ""
},
"Reprovider": {
"Interval": "12h",
"Strategy": "all"
},
"Routing": {
"Type": "dht"
},
"Swarm": { //P2P Swarm配置
"AddrFilters": null,
"ConnMgr": {
"GracePeriod": "20s",
"HighWater": 900,
"LowWater": 600,
"Type": "basic"
},
"DisableBandwidthMetrics": false,
"DisableNatPortMap": false,
"EnableAutoRelay": false,
"EnableRelayHop": false,
"Transports": {
"Multiplexers": {},
"Network": {},
"Security": {}
}
}
}

加入IPFS网络环境

接入网络

1
ipfs daemon

通过该命令,可以将本机的IPFS连接到公网的IPFS网络,同时启动了HTTP网关服务,方便后续HTTP WEB交互

查看对等方IPFS节点信息

1
ipfs swarm peers

执行后,可以看到有大量节点地址

与IPFS进行交互

添加文件

1
2
echo "hello jason" > test.txt
ipfs add test.txt

此时控制台返回结果:added QmcMR7dqXvUxgCXpwmKHyeu4mbwGAfvd5zoa7fY4UYmtPP test.txt
表示test.txt文件在IPFS的hash地址(CID)为:QmcMR7dqXvUxgCXpwmKHyeu4mbwGAfvd5zoa7fY4UYmtPP

读取文件

1
ipfs cat QmcMR7dqXvUxgCXpwmKHyeu4mbwGAfvd5zoa7fY4UYmtPP

读出的内容和test.txt中完全一致:hello jason

验证内容唯一性

只要文件内容不变,则CID不变

写入文件的名称和目录信息

1
ipfs add -w test.txt

返回两个CID,具体输出结果为:

1
2
added QmcMR7dqXvUxgCXpwmKHyeu4mbwGAfvd5zoa7fY4UYmtPP test.txt
added QmY8utLB2d9KKpjaR3mhTngqYc1grAZDnTaXgMfMzUsXGT

其中第一条问文件内容的CID;第二条指向的是一个目录(即 IPFS Wrapped),记录了文件内容的文件内容的CID、文件名、文件大小、

读取IPFS Wrapped获取文件信息

1
ipfs ls -v QmY8utLB2d9KKpjaR3mhTngqYc1grAZDnTaXgMfMzUsXGT

输出结果为:

1
2
Hash                                           Size Name
QmcMR7dqXvUxgCXpwmKHyeu4mbwGAfvd5zoa7fY4UYmtPP 12 test.txt

IPFS Wrapped的CID为目录,因此只能用ls命令,不能用cat命令,-v是将字段描述展示出来。

通过父目录来获取文件内容

1
ipfs cat QmY8utLB2d9KKpjaR3mhTngqYc1grAZDnTaXgMfMzUsXGT/test.txt

地址就是那个IPFS Wrapped的CID

查看哪些节点存储了指定文件

这里通过test.txt的CID来查看有哪些节点存储了这个文件

1
ipfs dht findprovs QmcMR7dqXvUxgCXpwmKHyeu4mbwGAfvd5zoa7fY4UYmtPP

输出结果:

1
12D3KooWSVzdPE1nXHAh9CyqAayFA8psJ9n6DwTkByiD8gWnm9b1

可以看出,输出的是本机的节点地址,也就是当前只有本机节点存储了这个文件

与HTTP Web交互

前提要求

1
2
# 一定要先启动守护进程
ipfs daemon

从本地HTTP网关中获取IPFS数据

在浏览器地址中输入如下内容,地址可以是localhost,也可以是远端的指定地址。默认是8080端口为web端口,我用的是自己的docker镜像,将端口映射为了8081

1
http://localhost:8081/ipfs/QmcMR7dqXvUxgCXpwmKHyeu4mbwGAfvd5zoa7fY4UYmtPP

页面输出的就是test.txt的内容:hello jason

从公共HTTP网关获取IPFS数据

1
2
http://ipfs.io/ipfs/QmcMR7dqXvUxgCXpwmKHyeu4mbwGAfvd5zoa7fY4UYmtPP
http://ipfs.infura.io/ipfs/QmcMR7dqXvUxgCXpwmKHyeu4mbwGAfvd5zoa7fY4UYmtPP

基于IPFS的特点,既然我的IPFS节点已经和公共网络的连接上了,那在别的公共节点上,也应该能通过CID读取到我的test.txt内容,也就是说,以上两个链接也能访问到test.txt的内容。

IPFS Web控制台

IPFS自带一个web控制台,界面很简单,能够满足基础操作,端口号默认为5001,具体如下浏览器访问:

1
http://localhost:5001/webui

在启动ipfs daemon的情况下,默认的IPFS是无法远程访问web控制台的,或者不允许跨域请求,因此需要在节点上配置:

1
2
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://xx.xx.xx.xx:5001", "http://localhost:3000", "http://127.0.0.1:5001", "https://webui.ipfs.io"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST"]'

具体IP和端口号需要自己根据实际情况调整。
若依旧无法访问,检查下自己的接口是不是被防火墙拦截了,以下是我启动后的一张图示:

在线调试工具

ipfs官方提供了一个线上环境,不用部署IPFS即可操作相关命令,线上环境地址:https://ipfs.docs.apiary.io

总结

本文只讲了IPFS的基础命令,而IPFS还有大量高级命令,需要自己根据官方文档逐步去了解。相信在此处,对IPFS的应用已经有了一定的基础。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2017-2023 Jason
  • Visitors: | Views:

谢谢打赏~

微信