IPFS使用入门: 从安装到基本用法
在冰雪中的玫瑰
发表于 2022-12-18 20:38:51
166
0
0
6 j$ T/ M. O! ]0 J( ?5 Y" C6 ~
要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。/ C% S0 Z6 w+ Q& f) ^
对于Mac OS X 及 Linux 平台,使用一下命令进行安装:
$ tar xvfz go-ipfs.tar.gz2 {% g8 D/ |/ C4 B
, ]- |- X% {" @: C, [ u( y- W
$ cd go-ipfs) z2 ]; t& u6 s. `, B! p) h: z
) E/ X4 F8 P s( f: C4 T2 x
$ ./install.sh
; T7 d3 _( W: d, E4 R* `6 m
上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。
在Windows平台也是类似,把ipfs.exe移动到环境变量%PATH%指定的目录下。
IPFS 基本用法# n# ~8 w% O( g3 z9 \& o5 i
) p" I; F \1 G: R
IPFS初始化' X5 F( K( o( |; r1 ~7 L
安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化
- Y( g* V) j1 x: Q5 l. n- D9 Z
> ipfs init5 f4 p4 J7 U3 a9 M9 t
initializing ipfs node at /Users/Emmett/.ipfs
1 M1 O9 g" W* T- h. q; M% s
generating 2048-bit RSA keypair...done, z( f" o1 R( j. o8 Q( m- W5 C
5 }( w9 ^' o( i8 h$ j6 ]& e
peer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva# w5 k2 j# b/ I
7 h$ k4 P+ {% a# A
to get started, enter:) Q# q9 ^; j! w$ E7 S
ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
2 ?1 C# @+ r/ W* m
上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:
9 L5 ~5 j* U. |: u
生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。
1 y5 `) J: R4 l# w5 t
节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。
在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。
如同步文件数据块放在.ipfs/blocks 目录,秘钥在.ipfs/keystore 目录,ipfs配置文件为:.ipfs/config。
IPFS 配置修改
- b- z) x+ w0 v# ^& @! c* Q
在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:) `4 k6 K; ?" m0 p' W* x7 `4 v
. z0 Q: E% s1 j
cd ~/.ipfs
4 X) n: W, n2 M- H( A" l M% E
export EDITOR=/usr/bin/vim
( t# _2 Y6 ]8 h$ F [) ~
ipfs config edit
! y8 w+ p5 A, d& c2 ~$ H5 G6 c
或者直接编辑 ~/.ipfs/config 文件。' _% B* z* ^3 A8 W8 n
" p% d4 S: d8 @5 p0 a: g
上传文件到IPFS2 |' N; n+ n$ n) p7 H. Y
: E+ @# D; ~% Z7 s* D
我们先创建一个upchain.pro.txt文件,可以使用如下方式:
1 p& T) u; D* x w: N9 F
> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt# H9 g6 M0 O0 v* w, r
ipfs 使用add 命令来添加内容到节点中, 在命令行输入:5 R9 ]3 Z+ i! e v T9 h
> ipfs add upchain.pro.txt \+ i/ M& L; }$ W+ [8 ~
R7 ]; f. W% B/ |9 y6 q
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt
+ D; }9 G7 a2 S0 o4 x
43 B / 43 B [=====================================================] 100%0 }* ~; t. Z+ A$ x
8 Q* V/ Y/ Z2 y5 o& L) y% a
当它文件添加到节点时,会为文件生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 查看文件的内容:/ d' x$ c9 |0 P$ [8 J
: w6 N; k1 x/ Q2 E" \: Q
> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
( {$ U! \- k+ }1 W3 X( U
注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:
> ipfs daemon
Initializing daemon...
5 g+ \) g: N" G# Q3 f
go-ipfs version: 0.4.18-; w9 X1 c. T/ j. o
4 p7 l& K1 s6 R5 y4 Q0 F4 j
Repo version: 74 o# e3 }; Z/ z4 E
System version: amd64/darwin
- Y3 N. t% Q i5 S( R4 ?
Golang version: go1.11.1
Swarm listening on /ip4/127.0.0.1/tcp/4001; S B4 F4 b1 Q$ L4 n
/ ?$ r; g* y3 |
Swarm listening on /ip4/192.168.8.105/tcp/4001
5 I# }! K, t/ }, }. a5 Y2 {8 H
Swarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/40011 F: n! C( Q' A7 s0 f
( l, v9 U' U2 {' l8 m0 n
Swarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/40014 w4 u+ ^4 b/ ~+ S' B4 A( u, ^$ ]
Swarm listening on /ip6/::1/tcp/40017 ]# n/ h4 N2 q5 ^
. ?' v5 K8 X6 l) `6 u
Swarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
& | z8 T6 F' \4 @* Q" p, `
Swarm listening on /p2p-circuit* @4 y0 G% Y; ~" C X, C
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/192.168.8.105/tcp/4001
7 `+ D7 V% t' G2 F# c% W
Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001% Q2 I# w* M; k8 ]
Swarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001( l8 b* ]' m0 c' n
, g* n! Y2 @- \8 q2 r
Swarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001& n$ a4 |7 ^- ~8 P3 a
# R4 U0 M( l# m) N6 f3 D
Swarm announcing /ip6/::1/tcp/4001
8 B! c! m3 m6 K# j8 P+ E
Swarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080 q6 U: b5 R0 S
: K! k8 y/ s! x9 u1 U
Daemon is ready
0 n+ I4 r( y) J4 s3 R0 [
开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:/ V: G! O" V( M, E) H5 ~& t4 a& Y
j! S1 ]+ R. p( ]5 N/ @
API服务,默认在5001端口,可以通过 http://localhost:5001/webui 进行访问,界面如:
9 x! y. u! U- n! F
这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。
9 t; t" T4 N+ R4 Z f \" ?* ]
网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。
( O8 \9 }5 y, }! Y
ipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。. \" }2 F2 O- X3 c
上传目录到IPFS' e* b8 X& N8 V; g' j. R5 y
2 h1 Q. A8 K& o, A3 a9 Y7 p* [
我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。+ B3 h- ~* P6 A: b/ h7 ?
> mkdir upchain; Y; F; c- p% l3 ~
> mv upchain.pro.txt upchain
上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下:
> ipfs add -r upchain
9 J/ H8 K {+ P# ] q: v+ @
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt$ \- ^/ L# g) A. c6 R2 G
added QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain* p Q- S# f' j% j3 P
43 B / 43 B [===========================================================================] 100.00%
2 w. @/ ~1 T- C- P- L
在上传时文件夹,文件夹也会生成一个对应的hash,可以通过hash后接文件名来进行访问, 如:
$ L5 D u8 O* e4 u( F" a0 o& H
>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt5 {; E0 k9 j+ _6 O6 v4 s- n
) q( U _6 F0 A/ C. Q [
在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。
通过上传目录的方式,可以把整个静态网站的根目录上传到IPFS网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:/ ^3 T$ k( w( R) x$ X' m* E; g4 f
6 Q8 D* G3 A: R! m& C) W8 _: Z
https://ipfs.io/ipfs/QmaFWgfpRNz ... uCphq2ua/index.html
2 J9 g6 }/ z: ~2 T
使用IPNS解决文件更新问题
因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。( Q. X1 Y/ T, Z1 K3 ]8 D
% s2 | n" `; ^+ y7 |5 i
例如把upchain.pro.txt发布到节点,使用下面的命令:
> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi4 t3 H( i3 Y8 \, b: I: \) `
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi2 @0 E) c) }9 h
命令中的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的内容,如图:1 {, ?# j0 j3 q0 h# v
其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。
$ w5 U. f+ `, M! g) d
现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”
' J+ W& M1 U4 S1 p' F. g
> echo "创办人:Tiny熊" >> upchain.pro.txt
> ipfs add upchain.pro.txt0 ~: t7 d6 t/ T9 \! G
added QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt
63 B / 63 B [=============================================================] 100.00%/ u, q% n5 |1 T; G! j
1 n, W* ^! ~9 s5 z, {* ~# y, {
重新发布一下:' H! P; n) J$ z R: e
$ D7 D: d2 _0 m6 X& s$ q6 N/ [: q6 D
> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
& [' \* b# E! K: Y+ G+ t$ B3 W
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
0 ?& o) I" N' V; G' M( P ~
再次访问 http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva (这个链接和上面的链接一样)可以看到内容更新了。
如果我们要查询 节点id 指向的hash 可以使用 ipfs name resolve 进行查询:
> ipfs name resolve" n* I7 W% @0 P$ U8 Q2 s# ^
/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5$ ]9 v; R6 J# `( Y8 z
0 G, E1 `% J9 R
有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。: f8 a `* s7 |1 }
如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:
' e: X% E+ w% Q' Q+ Q- W6 u! s
> ipfs key gen --type=rsa --size=2048 mykey
. F; T' a, k/ r2 Y/ _
QmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg6 v$ h& I: F x6 M* W* ~+ y/ A
> ipfs name publish --key=mykey hashxxx9 m( N% e3 B7 G. a
Pinning
Pinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。; v. |& s+ j0 }# J6 k) v1 A% u
; b: p ?6 m' _, ^* Z( W* c
当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),2 }. i1 R$ P- U: O9 W
4 K, W/ {) s8 P4 I
IPFS 提供了pin命令进行Pinning操作, 比如我们查询下某一个hash 是否被pin:
> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S6 V6 @5 l. O n/ @8 H
* J t! S: F" a. O+ v A" a. x
QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive: M, l) \6 ^2 U, f9 |( |! r+ u
> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned
可以使用 pin add 手动钉住一个文件,如:
> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK71 O9 T& |- `6 N! Z8 ^; [) B
! u' U4 B- D9 z
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively+ O% M% q: Z: m! ?8 |# F" f. ]
$ Z- c! Y2 v) e9 t& E
如果要删除pin的状态,使用pin rm , 如:
> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7* Z" h/ y: I! S. K8 ?# }% L
unpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7& }: C0 }2 L. i% d; G a$ f5 `8 `6 q4 h
& T' @8 o- F0 _+ v' j! k$ D
pin rm 的参数 -r 表示递归的删除pin 状态,对于没有pin住的文件, 如果执行GC操作 ipfs repo gc 文件会被删除。
成为第一个吐槽的人