IPFS使用入门: 从安装到基本用法
在冰雪中的玫瑰
发表于 2022-12-18 20:38:51
119
0
0
7 n/ \$ W* v. C/ X# n
要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。
对于Mac OS X 及 Linux 平台,使用一下命令进行安装:
5 S* D( F' d+ O; f% H3 h. ] p" V
$ tar xvfz go-ipfs.tar.gz" }7 f/ g0 C, k
$ cd go-ipfs
* _3 n# P# B' S
$ ./install.sh
上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。+ {5 _: @; y5 ], J9 r( h
在Windows平台也是类似,把ipfs.exe移动到环境变量%PATH%指定的目录下。
9 }7 J4 G O! l$ T! j6 I
IPFS 基本用法
IPFS初始化; Y$ K$ P" X# e. S( G& A0 `. s
+ ^6 ~! n! ^, G* z) R
安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化7 K# r8 a2 t0 |4 }' t
> ipfs init8 T) d; o: _$ o# y; q' {* E
) {# ]1 V7 p& a+ A6 Z
initializing ipfs node at /Users/Emmett/.ipfs6 s/ M. d2 f6 S; g6 W7 Z
* w" m! H8 i0 O+ \" f
generating 2048-bit RSA keypair...done
0 X4 T( v9 r. }7 G/ L' g. u
peer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva' O5 H3 i& h! s2 i9 u
to get started, enter:/ O8 [$ B9 t L- D' @! V" d: Q
: X' l1 _6 Z6 v) W% \6 V7 a
ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:
生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。$ s7 U9 g# s7 B8 g8 M
3 _4 T/ Y2 T: M# G0 D1 [
节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。& h! T s" E. s' K
6 z- O& G0 J% [( M$ o
在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。4 `8 W& y& o* A6 \) W. u. ~0 `8 G
. ?# K: }6 W( `) {8 A# ?
如同步文件数据块放在.ipfs/blocks 目录,秘钥在.ipfs/keystore 目录,ipfs配置文件为:.ipfs/config。, F. I& O4 k/ r6 c6 a! C! \4 k
IPFS 配置修改& |. h/ A1 A. l' ?# a6 [
# d3 {0 @/ M6 [8 [3 W! l9 D
在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:
2 N# ~) c6 w1 D4 G* N& K
cd ~/.ipfs
export EDITOR=/usr/bin/vim
ipfs config edit( H1 m. j/ x* S
或者直接编辑 ~/.ipfs/config 文件。5 U; k# y1 H4 V3 {# Q
上传文件到IPFS
6 }8 s7 f, F) Q$ G* k2 G
我们先创建一个upchain.pro.txt文件,可以使用如下方式: F a8 L9 ]; Y/ J
> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt& G, f$ c( x9 l
1 \& U9 x5 m0 z# o
ipfs 使用add 命令来添加内容到节点中, 在命令行输入:
3 W! Q7 R! I3 _3 u( i! [, D
> ipfs add upchain.pro.txt% r% m& \+ T8 `7 F, A
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt
43 B / 43 B [=====================================================] 100%
当它文件添加到节点时,会为文件生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 查看文件的内容: N$ o6 g9 U" R' [! D0 l
> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
2 J8 G' x" ?! p$ Z4 ^
注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:) X9 G! N( D4 e. C, B1 I& X
8 n$ r Z6 i4 i" f h
> ipfs daemon
& M/ A# K3 H, R* P6 S
Initializing daemon...
go-ipfs version: 0.4.18-8 N: I1 L. G+ {8 @- o( A( s
1 a" k$ p- b) k- B" j8 t# |! d& _ r
Repo version: 7: w# i4 R* t5 Q' R% v9 q& U' U
8 z! C# C# L7 V+ I
System version: amd64/darwin1 \$ L3 l. C* K9 h$ @' g2 [
! u* f+ F4 @6 X# F
Golang version: go1.11.10 l7 T( L' z w" j% _3 F
Swarm listening on /ip4/127.0.0.1/tcp/4001
# U" ]: R, |+ z
Swarm listening on /ip4/192.168.8.105/tcp/4001
$ [& |) }% h: N: K: Z, T: `0 S
Swarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001
Swarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/40016 a# }) J" v4 \' [) B
Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/40014 m( S* b- T; S
7 s; N# X3 A; ~* g3 o! r4 F7 K
Swarm listening on /ip6/::1/tcp/4001- n4 b1 P2 V9 R2 c* O! ?0 o* ^0 X
8 v7 |1 E5 C* z+ @
Swarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
1 n# C4 E! g) \( ^
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001, t/ \. E2 X5 `$ `' _( w7 O
" m6 U( r* }1 x$ {: U$ q9 h8 H! m
Swarm announcing /ip4/192.168.8.105/tcp/4001 Y3 A) K" E0 \! p8 R4 `
Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001
Swarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001+ C/ t% i6 l' M; D
5 ^7 {* b% z& N3 [3 e. n& K: L8 i
Swarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
/ q s3 h, l T. I3 }
Swarm announcing /ip6/::1/tcp/4001
Swarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001; F9 F5 ^) P7 [' P& h; `
, q& Y- F6 e2 z; ]4 }5 L9 X" D
API server listening on /ip4/127.0.0.1/tcp/5001
* {- a0 W; C8 Q; e5 O* Z
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
, W3 T: g& o/ m. g9 T! q% X
Daemon is ready
开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:
" p @- p" q: x
API服务,默认在5001端口,可以通过 http://localhost:5001/webui 进行访问,界面如:4 d$ \, z! B- U f8 Y8 _
: l( Y: @5 L' L# f) U) Z' ^) b
这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。
, f7 R: \- z" w; t7 {5 y
网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。/ I+ h4 A' d9 {
+ \; M( S. m( g' E/ [+ ^* w
ipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。5 H X; U8 X9 ^5 f" t
3 r; v! `5 @( s- ?4 s" G2 x
上传目录到IPFS$ ~4 k J- c# {3 ]/ t
, R0 q7 o( t8 s) Z
我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。
> mkdir upchain
> mv upchain.pro.txt upchain0 N) G: @% ^4 `' U$ ]
上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下: E% z2 I3 L, P1 n- |4 Q0 N6 h* u. j
> ipfs add -r upchain
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt
added QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain
9 f K8 M& Q" N
43 B / 43 B [===========================================================================] 100.00%
" g# f4 M! f0 B8 x6 |7 V3 l; y) X" d% P
在上传时文件夹,文件夹也会生成一个对应的hash,可以通过hash后接文件名来进行访问, 如:
2 O b. p: m( u1 M v9 o
>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt
在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。
! m* T9 \6 V* x* \
通过上传目录的方式,可以把整个静态网站的根目录上传到IPFS网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:' l: ^) M% u) E3 W6 x% m7 j
https://ipfs.io/ipfs/QmaFWgfpRNz ... uCphq2ua/index.html1 [' g- `$ ~0 E. m) X
使用IPNS解决文件更新问题
因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。
例如把upchain.pro.txt发布到节点,使用下面的命令:3 t7 E& p1 I* z( k* p/ d
> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi$ `0 m% a* b. j" p% X( U, `& C
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
1 S+ ?) j) j0 m3 w: n( C3 ~3 ~
命令中的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的内容,如图:/ q* ~/ m! Z# f' R0 H
3 K/ B% t b! B9 x* f7 u* U
其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。' G4 | J! r! R8 p0 ]
现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”
> echo "创办人:Tiny熊" >> upchain.pro.txt- ?8 p5 f8 i* R, Z, r) s; C# `
( z |* m8 U9 K* R; @7 m7 s5 p
> ipfs add upchain.pro.txt3 @0 c& l+ `; a5 o2 p
- L, W; m a4 H9 s
added QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt! N$ A Y! A' m
63 B / 63 B [=============================================================] 100.00%
重新发布一下:5 r: |) }& u" k& P
> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S8 u( b& }0 @' L' f, x
再次访问 http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva (这个链接和上面的链接一样)可以看到内容更新了。# K B; A# Y1 P& j8 C2 Z
' h) S% y ~# J: j5 O" P# M
如果我们要查询 节点id 指向的hash 可以使用 ipfs name resolve 进行查询:2 _# Y% H! W( s7 c3 K6 ~2 d7 g
> ipfs name resolve- {1 f# i8 g( G5 J2 V% `3 a
/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5
有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。+ T: Y' _6 t# e) M3 a! d+ X; q0 X, W
* m! t1 E+ {, g6 y) o
如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:
> ipfs key gen --type=rsa --size=2048 mykey
QmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
> ipfs name publish --key=mykey hashxxx q0 j9 l& L! W# q1 n' K/ v
Pinning
Pinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。 u5 O! J& t9 F, i
当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),
IPFS 提供了pin命令进行Pinning操作, 比如我们查询下某一个hash 是否被pin:& `' A! B* M; X8 _& i
: w- r2 _5 `9 j. F2 ~
> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S U- N1 t- L( c, Q
QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive
9 B# `& h3 X' S5 i7 }
> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned( @+ G, Y+ G' A$ q( p N# z( j, m
! ~1 P" F2 m9 V% w
可以使用 pin add 手动钉住一个文件,如:
3 X( a2 [8 C% u- l3 T
> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 C( X/ m3 q# i, F9 P1 M. s j! o8 D
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively% D6 _0 M+ X6 p+ |, G7 o
如果要删除pin的状态,使用pin rm , 如:5 c& ^9 G- v9 ?* {1 ^
> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
$ X) c% R' ^2 s6 e D/ U; w. ]
unpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7# u9 l5 W9 {9 Q9 g d3 m- ]
4 g: o1 C8 e- D: L
pin rm 的参数 -r 表示递归的删除pin 状态,对于没有pin住的文件, 如果执行GC操作 ipfs repo gc 文件会被删除。
成为第一个吐槽的人