IPFS使用入门: 从安装到基本用法
在冰雪中的玫瑰
发表于 2022-12-18 20:38:51
165
0
0
要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。3 V1 @6 E" u# ]+ h
4 i. X2 u4 w% _" {9 u$ a+ B
对于Mac OS X 及 Linux 平台,使用一下命令进行安装:; U: I( E% v$ |; s/ Y% F' U
6 K1 n, |' y7 x# V9 R4 |, n# B
$ tar xvfz go-ipfs.tar.gz, m/ L3 d( _. I% g8 v9 n2 D: m
$ cd go-ipfs# x, P5 M S N( b% l
" _7 ?5 Y! Z# Q
$ ./install.sh( E5 _9 ~& v- B+ }( F( Z( A
上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。
$ Z, P& @, `+ w6 @( \4 q
在Windows平台也是类似,把ipfs.exe移动到环境变量%PATH%指定的目录下。# w7 p- O" R! a {0 U# ^ g: Y
5 L# K" ^4 r$ ~1 O6 e: Y5 N
IPFS 基本用法
0 i k* J H, s/ A [5 i
IPFS初始化* j. Y+ f8 t3 {5 r1 F3 D' N
安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化% T. Y Q+ P5 T4 O" b: y- A2 R+ V& O* e3 C' {
. p- o- V* s& {, N0 b4 `# K
> ipfs init9 [+ E5 z, j1 p3 f7 B0 |
initializing ipfs node at /Users/Emmett/.ipfs9 v7 s* h: ~" P( z- w/ y6 x7 C6 ~
generating 2048-bit RSA keypair...done
peer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva" L2 i+ Y: i2 N1 H/ k5 j; N
) k* t& H4 y8 g, z/ F: `0 y
to get started, enter:( j( s" R$ ~& d3 P& g4 A
ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
) ^, R% _1 J f3 E/ w5 o) N' i: A. @
上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:1 O1 h" _+ V. X" B+ Z
3 y7 r& n9 K* x9 i1 _
生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。
! Y: J; t1 ^0 {
节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。
在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。$ a/ b; {- K. q
如同步文件数据块放在.ipfs/blocks 目录,秘钥在.ipfs/keystore 目录,ipfs配置文件为:.ipfs/config。0 v" t. j& v2 C* z* Q: N
: _$ K' b6 s# M6 B/ b' ^1 s0 _
IPFS 配置修改8 B- O* W% u. c0 v! x% H
' R3 m+ l" ?# j8 b, d7 O* B$ \
在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:6 }. p$ d5 S& K2 ]7 O" A7 b
cd ~/.ipfs
export EDITOR=/usr/bin/vim) [; |; |8 _# e: T; _
5 e) i! q' a. i0 L; W% k
ipfs config edit" m( f" K. V! L# g
. U6 v d2 F* S% [) T
或者直接编辑 ~/.ipfs/config 文件。6 p6 T7 U- M- J) t& R
上传文件到IPFS9 z# w# u, i4 ^( p. u
& i; d+ p" k2 e# h6 I
我们先创建一个upchain.pro.txt文件,可以使用如下方式:2 g# V' f% ~( r. O" F( d
> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt# j6 e" H: @- Z' k n, g
" l& B( a; E, ~( O9 U
ipfs 使用add 命令来添加内容到节点中, 在命令行输入:+ M0 p) h, R; J
+ p- U) N: \. {0 i+ m1 V2 q
> ipfs add upchain.pro.txt
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt
' w3 I. W' e0 }* e7 N8 f" A
43 B / 43 B [=====================================================] 100%
当它文件添加到节点时,会为文件生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 查看文件的内容:0 n4 R; u/ }) q. _% _' Q6 w2 D: |
5 M- i! j8 T$ U8 W6 h
> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi. |( y% `- ]: H. G% B& u
+ w: e( }9 N- t1 [/ o
/ r8 E8 q9 D7 T7 T1 _
注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:- M- H8 d6 _' ^2 P. g
> ipfs daemon
* w$ s0 f( e# X. t2 {) a: V# H
Initializing daemon...
4 C+ W' b! e2 Y" Q
go-ipfs version: 0.4.18-& o8 ?! I: K8 w2 v2 x+ F
Repo version: 7! u' r0 c. M$ t7 Z, `
System version: amd64/darwin
, H" M% B) \2 o, W9 t! i
Golang version: go1.11.1# h, F1 D3 e8 z: }8 q6 D" H4 h
Swarm listening on /ip4/127.0.0.1/tcp/4001$ i0 a. f% {4 v. e" ]% S* d6 R9 s
Swarm listening on /ip4/192.168.8.105/tcp/40013 l) {% Y( U( |& M- k. x- B4 l
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/4001
Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
; ]( x, e" c; H! W0 X6 p3 C
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/40011 }9 {& l5 ^9 c9 h: x8 p! q
2 V, @+ L2 z. l* x
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
( J" D' X. l7 B: h( n b# R
Swarm announcing /ip4/192.168.8.105/tcp/4001
5 |3 F0 s2 G! S6 M
Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/40013 j9 ^: G& A, g
Swarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
Swarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
( O. X3 q; G+ N: {/ @. q
Swarm announcing /ip6/::1/tcp/4001
" a) a* x" ]. V
Swarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001( b7 S: \, I% |1 v3 a
API server listening on /ip4/127.0.0.1/tcp/5001+ M7 w2 D D* `, `" H# A
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/80809 U" p- m( Y! G) a/ {
9 v5 \3 _6 {3 z2 H0 b! ]9 f
Daemon is ready0 U4 N4 `- f1 B9 M$ s6 I
开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:2 S. q4 R# y6 H! V. H
! G7 ~( ~1 o. z( w; ?4 Q0 s
API服务,默认在5001端口,可以通过 http://localhost:5001/webui 进行访问,界面如:5 p' u4 H% Q- p, ]* E
这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。! x" t' f4 p! N) N0 B* i
网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。* h' U6 l3 m/ R2 y
+ N1 S: S: E z2 Q R# s
ipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。
- g/ l- f$ s% [) f0 i a! R- I
上传目录到IPFS9 K1 B7 z7 s$ C8 u# n' m
我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。
( s' g8 S7 x3 C% p& f
> mkdir upchain# |6 t8 o0 j( I& E
> mv upchain.pro.txt upchain
上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下:- I! ]/ E# l- |
> ipfs add -r upchain1 Q" i( y8 Y5 e; p9 r8 p
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt
added QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain
43 B / 43 B [===========================================================================] 100.00%$ E& V. D& ], f: }9 m8 X
0 C% e2 l4 I) Q$ X5 Q
在上传时文件夹,文件夹也会生成一个对应的hash,可以通过hash后接文件名来进行访问, 如:+ ]: b2 ?2 B, L0 b' |! C
, p' L7 J) G5 E- `; E; {, o5 f+ D
>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt
# b+ w& F/ ^8 t
- f" Z8 X+ L. X
在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。
- g: e. Y8 C0 b/ E1 q
通过上传目录的方式,可以把整个静态网站的根目录上传到IPFS网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:7 b6 D# E0 P2 v
8 h Y! Y( t- W, q
https://ipfs.io/ipfs/QmaFWgfpRNz ... uCphq2ua/index.html
0 D$ Y- j5 @2 Q" P% U3 D/ ^
使用IPNS解决文件更新问题 a% t7 G3 R! U
因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。
例如把upchain.pro.txt发布到节点,使用下面的命令:2 U, q) p6 M8 {/ x6 B
> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
5 `1 ^" F# H3 R+ Y& H
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi8 J7 Z# U; C7 _ s2 _
# Q/ P0 L% ~) s4 v# {
命令中的QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi是upchain.pro.txt的hash, 命令提示中的QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva是当前节点id(大家可以回看一个前面ipfs init 的输出)。' d7 H5 E+ w3 O# e1 U: Y+ H6 Z
发布之后就可以使用http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva 或 https://ipfs.io/ipns/QmYM36s4ut2 ... VvmDU7xKUiVeswBuTva 来访问upchain.pro.txt的内容,如图:9 v9 z+ ] p0 W% k
其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。 F: c( _) T: Y, ~7 o5 A9 n& G
& k. d: C( P+ D
现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”
3 U" q4 P9 w. `% J1 T6 Y* X8 n3 p
> echo "创办人:Tiny熊" >> upchain.pro.txt1 f( K' ]1 E5 r: k
> ipfs add upchain.pro.txt
added QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt
! B. e; ~1 x* w% `
63 B / 63 B [=============================================================] 100.00%4 r7 i/ L# p/ @- K/ E4 `# j
( E$ E/ o! ]2 o% K9 ^
重新发布一下:
6 d2 v( E9 Y# e p1 _
> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
, l9 ~6 G' Z* X5 }# D
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
9 c! C9 A) \4 _) z+ X1 P
再次访问 http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva (这个链接和上面的链接一样)可以看到内容更新了。% J+ Q: c0 f! h! ?5 n$ d: }; u3 P
. a4 w* U% y/ c2 H
如果我们要查询 节点id 指向的hash 可以使用 ipfs name resolve 进行查询:
; @9 [2 x4 B/ G$ I) r8 E( g5 l' T
> ipfs name resolve1 {+ I+ h2 d: z# w; ]! Z
/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5
T% ?% A1 g; c2 X
有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。
2 e' o; A7 ^' Y- e! q$ x4 \5 m8 d
如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:4 |" ?( r5 a- m
, Y" a- i6 @% y% G% i9 ~! p
> ipfs key gen --type=rsa --size=2048 mykey
QmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
' c8 j: J# m* s/ R! ?/ o
> ipfs name publish --key=mykey hashxxx
; D" _9 I6 N: k0 E' T' Y. u. H
Pinning
& D% q( {& Q. S- L) `
Pinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。
4 J) ]$ Q4 J; @7 L8 }5 _7 ~! f- j
当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),- s/ L% s) n- c* Q2 W6 c) @# C$ I
3 U1 T, t* v3 q$ P* z/ ~0 r8 F% ?
IPFS 提供了pin命令进行Pinning操作, 比如我们查询下某一个hash 是否被pin:
> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S5 W3 v$ s1 d8 O) |$ w+ ?9 q! _
9 L( h& d9 n9 i, X1 @! X' r
QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive) \/ y4 O" r' m1 B6 }4 \/ ]9 S
* L3 M7 k. M! R2 g# w
> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned
2 q) ^) c( j0 T' Q7 N. ^4 d7 Y( u
可以使用 pin add 手动钉住一个文件,如:
> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
4 Q U# U7 [6 K V
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively. L+ ~7 \% }/ ]; f) C, H$ |
. w. w. x' k& v) j: g$ A7 `
如果要删除pin的状态,使用pin rm , 如:) X9 \2 s: Z( p0 G+ K2 P
> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
unpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7; T, `& Z) f0 t r8 {. N' i6 P/ T
; _3 V9 Q# k: b$ }2 X6 J+ P
pin rm 的参数 -r 表示递归的删除pin 状态,对于没有pin住的文件, 如果执行GC操作 ipfs repo gc 文件会被删除。
成为第一个吐槽的人