IPFS使用入门: 从安装到基本用法
在冰雪中的玫瑰
发表于 2022-12-18 20:38:51
108
0
0
要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。
对于Mac OS X 及 Linux 平台,使用一下命令进行安装:
$ tar xvfz go-ipfs.tar.gz
) ?" o. l& g9 @
$ cd go-ipfs! `1 p `) v4 f' Z
% J: E. w1 P6 X e
$ ./install.sh8 F/ F$ Z' p/ V! x
+ n' |8 A4 A! L! { M+ j
上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。
/ a) U+ J: M" v2 \" v
在Windows平台也是类似,把ipfs.exe移动到环境变量%PATH%指定的目录下。4 A- R; g4 ^& n2 G& H
IPFS 基本用法& A' G* [9 J1 {( W0 `, z# s5 k
IPFS初始化1 o# }5 u O( r/ I
安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化
* `# g9 i3 P- _; Y
> ipfs init0 _. N. |% J! G5 `$ u
6 W1 z' @( H/ P+ N6 Q
initializing ipfs node at /Users/Emmett/.ipfs& M0 L+ C" |- \! c& m
( p2 q# ^) P6 n2 p
generating 2048-bit RSA keypair...done) M9 W/ e8 p0 Z
8 T# ]" l- D+ c9 K# t
peer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva, U; T2 M# r8 d% x) V
, P1 J3 E0 H q5 M6 y1 s2 Y: t
to get started, enter:
ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme3 G3 ^" K7 i1 l9 B
7 T# y. b. _/ j( X& s% f" j; q( K
上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:9 c: e+ T; z* _9 N& W
) G1 d, n; E. P) [; ^8 _# n
生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。7 w4 r1 W- n( x) U7 p$ v9 k- z8 V
节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。
在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。0 h$ a, t* {0 @5 t5 i- e% M
如同步文件数据块放在.ipfs/blocks 目录,秘钥在.ipfs/keystore 目录,ipfs配置文件为:.ipfs/config。
IPFS 配置修改
/ @" n0 Q$ q' b5 }0 T" a
在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:
$ C2 ~9 O/ y- J8 o4 l# j! L
cd ~/.ipfs
export EDITOR=/usr/bin/vim
ipfs config edit; M. V1 u! p# B
或者直接编辑 ~/.ipfs/config 文件。
* a# ]2 w+ e% O5 ~
上传文件到IPFS$ z' B n7 i6 g
5 `. l, r: s6 T9 w+ c, S/ m
我们先创建一个upchain.pro.txt文件,可以使用如下方式:
" h: i- Q) \% y2 K8 J
> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt; W: H$ z% k S
2 M! L* J/ h- G; z. n
ipfs 使用add 命令来添加内容到节点中, 在命令行输入:
> ipfs add upchain.pro.txt0 ]$ q$ Q/ J2 {9 e! \
* ]5 Z5 a( z! f0 @% n
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt
43 B / 43 B [=====================================================] 100% w9 n2 i5 |0 d% H0 F* H
9 ]4 r; W$ ~9 t+ O. {& W8 \; y
当它文件添加到节点时,会为文件生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 查看文件的内容:% P6 A( W3 n& ^9 Z
% h9 F" x* A3 K! D' c
> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:
> ipfs daemon
' o ~& G2 q; c
Initializing daemon...
go-ipfs version: 0.4.18-3 E" ?# r: \7 c# r' {# ^- t& D
I1 k k; U( X- t4 c x1 o
Repo version: 79 ^; a6 x( W! k8 t, c
System version: amd64/darwin/ {) A" f' x" G' W
1 [5 J( J+ f, E3 E7 b9 q$ q0 v) `
Golang version: go1.11.18 v1 ]6 N9 J; k) j; H- f
Swarm listening on /ip4/127.0.0.1/tcp/4001
& m$ E" j, ~: {) X
Swarm listening on /ip4/192.168.8.105/tcp/4001
) _% [" Z0 u1 O; ~
Swarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/40010 T; {/ e3 T# T* C% {) S, S
7 f& E3 Z2 G, O' i3 p
Swarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/40010 G; X$ H" V* h2 G: y
2 T9 Z6 T/ F( s6 Y* O1 p9 w) h
Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/40012 e! r K0 I6 c
Swarm listening on /ip6/::1/tcp/4001
. T/ l" S0 N( |: t( c4 d0 b
Swarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/40017 S* [" B1 r& B% P# _+ A
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001& \- I2 M, N7 m0 n
* k9 h' M* ]8 t* o" b5 j
Swarm announcing /ip4/192.168.8.105/tcp/4001
3 J) e/ R# t, w: w
Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001& P B0 W: b' g2 d. [2 Q t
Swarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
: s- Q7 P* I% ` K- \/ Y: v2 @
Swarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/40012 _/ A" C% r. t. k" r" e5 l
Swarm announcing /ip6/::1/tcp/40011 |; N) ^9 a- q+ t, [) x: V1 `
Swarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
& I! d$ @5 m1 V) `+ d- g- n6 d
API server listening on /ip4/127.0.0.1/tcp/5001! ?$ h5 E& p0 Q( e8 w
" [. l# o5 S, i* |
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080$ N; q+ ~/ W' x- U6 s" N
! u& ^, J, {) ?
Daemon is ready$ B9 o- x( h& K* v( V+ d6 Y4 ^
' Z, A4 k' ~" Q' E5 v: `
开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:
1 d+ D( e7 `2 l) o, l% d
API服务,默认在5001端口,可以通过 http://localhost:5001/webui 进行访问,界面如:/ F7 ?+ V/ o O" e% B
6 ^9 l7 S9 W( |: h
这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。
$ r: E5 z: A$ a9 B7 E$ D
网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。% |9 B$ I" }' b0 o2 L1 P* X+ ^
+ a; x- l. v: m k
ipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。# h. q. L v& L" Y6 `
& m d& V( ~# W2 x( p
上传目录到IPFS
我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。
5 B' t& d3 n8 j, R# K
> mkdir upchain8 k0 ]# I. H+ x4 \. J, `1 j7 o& L
> mv upchain.pro.txt upchain3 q3 I9 C! o' [8 d' m' X' I
上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下:6 q) S8 N( Z$ _% |0 y9 a
> ipfs add -r upchain
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt9 n3 S$ }+ ^1 b4 d" U q
added QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain* D0 s9 i! [! ?5 |( l+ P
43 B / 43 B [===========================================================================] 100.00%
2 W- D: \$ m& B* F* k& Q4 b$ e# b' U
在上传时文件夹,文件夹也会生成一个对应的hash,可以通过hash后接文件名来进行访问, 如:
>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt
: r0 R- b, B* b4 V5 _0 \
在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。9 D/ D0 g9 W* S
! j* I% N8 D: E N& O1 H
通过上传目录的方式,可以把整个静态网站的根目录上传到IPFS网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:0 H& [0 U8 Y! ?- o8 @1 H+ @
https://ipfs.io/ipfs/QmaFWgfpRNz ... uCphq2ua/index.html
使用IPNS解决文件更新问题
( Q% G1 ~- N6 x. G% {; \
因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。
例如把upchain.pro.txt发布到节点,使用下面的命令:
4 Z: L1 ~: D' j5 v
> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
命令中的QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi是upchain.pro.txt的hash, 命令提示中的QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva是当前节点id(大家可以回看一个前面ipfs init 的输出)。
发布之后就可以使用http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva 或 https://ipfs.io/ipns/QmYM36s4ut2 ... VvmDU7xKUiVeswBuTva 来访问upchain.pro.txt的内容,如图:
- b, P& j$ Q' `8 A
其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。
现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”
> echo "创办人:Tiny熊" >> upchain.pro.txt
3 ]6 c# I2 C1 y9 O9 K N
> ipfs add upchain.pro.txt
0 l4 Z8 w' a7 S8 [
added QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt4 e* X. }6 I+ R6 s* m
63 B / 63 B [=============================================================] 100.00%+ a5 a; X; r0 G' Y
?# p5 J5 H. `' m5 b- w3 l
重新发布一下:* C2 l1 X7 f6 y7 b, _
' r. ~/ a, f4 W* G1 k
> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
8 ^" T2 Z1 O: _( N4 o
再次访问 http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva (这个链接和上面的链接一样)可以看到内容更新了。
如果我们要查询 节点id 指向的hash 可以使用 ipfs name resolve 进行查询:
6 E$ k) k' r! S B- K7 Y# \. |7 K
> ipfs name resolve
/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5; B* e' z1 W; _2 D, G# {3 C
有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。
如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:: h; R% e; `- L y- j7 B2 M' y
> ipfs key gen --type=rsa --size=2048 mykey
QmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
3 P) C& i" `" \! D- M6 d
> ipfs name publish --key=mykey hashxxx% l& L! Q# |9 P( P) i$ u {
& `( w y4 ^' r2 P+ r
Pinning- B, l7 ^# f; u3 @! B- v
Pinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。! m8 ]* G+ W9 ?# k
当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),- ?7 d5 _4 E5 R. c
IPFS 提供了pin命令进行Pinning操作, 比如我们查询下某一个hash 是否被pin:
2 l8 F# m* o9 Y3 i1 q) l& U# o
> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S( t" r/ n# M/ Q6 F- \5 O
QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive: X e, c0 K7 e) I1 T. p& {! w- D
' a/ c* w6 }: J% Y o; Y
> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7+ b7 m% I4 w$ P, G* e2 R
$ {" c6 q/ ]2 u+ x5 T/ b
Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned; r' m; b0 E: y( V+ r4 h
0 O6 f8 ^4 e0 r- p
可以使用 pin add 手动钉住一个文件,如:
- Q; M( ?8 [1 ^4 a4 f# m: p
> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
- C$ m3 w9 c8 {
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively
; i* Z9 E W( J
如果要删除pin的状态,使用pin rm , 如:+ V4 V7 I1 m N' ]/ Z. z# O1 y7 j
: Q. |& ?3 ?2 q5 I! |
> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
unpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
pin rm 的参数 -r 表示递归的删除pin 状态,对于没有pin住的文件, 如果执行GC操作 ipfs repo gc 文件会被删除。
成为第一个吐槽的人