IPFS使用入门: 从安装到基本用法
在冰雪中的玫瑰
发表于 2022-12-18 20:38:51
131
0
0
要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。
+ B+ E9 O0 g: w6 J/ {
对于Mac OS X 及 Linux 平台,使用一下命令进行安装:& Y* \7 @1 _9 `* h9 |+ k3 z/ D( N
$ tar xvfz go-ipfs.tar.gz5 S# B) a& K+ ^1 @( R
- }0 t/ _& |4 [) S8 d% z4 ^
$ cd go-ipfs2 _/ g( p* r& O7 A$ ?2 l
$ ./install.sh* O; V; L6 _& G
上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。
0 F& x" L" e* {; h* k( @+ K
在Windows平台也是类似,把ipfs.exe移动到环境变量%PATH%指定的目录下。( o1 K# l* J( E/ s, [- L) V' Y
- J5 W. |0 x; h% V& }# ]2 n( V
IPFS 基本用法
, }3 I% ?$ [/ E
IPFS初始化
! f7 u6 R' E8 d! Z% a
安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化/ F; I# `4 C ~
> ipfs init
+ x3 c% t2 i3 O
initializing ipfs node at /Users/Emmett/.ipfs
: N! T5 T. R/ c" N# `$ y
generating 2048-bit RSA keypair...done
peer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva1 U3 R( l) \! P- @3 e
1 o- v7 @# g2 t) M1 q
to get started, enter:5 E% U5 N8 c' T( F* R
- W9 M- {/ }' D, N* w6 O
ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
7 p7 G1 a2 H; W: T2 F: H, x+ F6 N
上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:
生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。
9 N! h# S9 }7 y, j
节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。
, V2 @. @" J& S+ H: q
在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。2 h6 a+ `$ J% Y, x4 v
. N3 A7 M# Q7 g9 W" `
如同步文件数据块放在.ipfs/blocks 目录,秘钥在.ipfs/keystore 目录,ipfs配置文件为:.ipfs/config。
IPFS 配置修改
在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:
5 ?# Q2 k! t* P
cd ~/.ipfs
export EDITOR=/usr/bin/vim ^& `/ ]3 D, y. N8 V- T3 ^; ?
5 a4 N" B! p& O; Y! w
ipfs config edit/ N* Y- u& v6 @
7 C9 u8 r2 s4 {9 D5 k' ?: y
或者直接编辑 ~/.ipfs/config 文件。
6 Z9 P" n- {( z% N- b
上传文件到IPFS
! x+ c6 ]% W2 ^$ w
我们先创建一个upchain.pro.txt文件,可以使用如下方式:! |# T. V: h* e7 X& _; c
> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt; y9 F0 z% m9 j8 F. i$ ?, f; S
ipfs 使用add 命令来添加内容到节点中, 在命令行输入:
) o `4 `* [) p; g4 O% x$ p# y% T
> ipfs add upchain.pro.txt
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt' b0 d- g* E* P# p5 @& E
2 X- r5 O4 j) a+ C2 Y8 `
43 B / 43 B [=====================================================] 100%( ^, t) v6 P8 N5 o4 p9 j
* N: t$ R6 l& C* Q6 Y4 v
当它文件添加到节点时,会为文件生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 查看文件的内容:# H7 E9 A3 @- l
> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
8 N4 @) k- [) e& v
注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:2 [- i5 h) ?2 @0 j9 t& n
> ipfs daemon
Initializing daemon...! K* J# ~1 B A# j, f) z
go-ipfs version: 0.4.18-
8 _+ D7 r& X! F# B* Y
Repo version: 7) M6 ~% a' V' A
System version: amd64/darwin# j! j" @, u% D
! F1 d0 R0 A8 U' e4 t) Y$ J
Golang version: go1.11.1; Z2 ~' \+ {9 f% i
Swarm listening on /ip4/127.0.0.1/tcp/40015 @: ^! ]2 k( T5 I
Swarm listening on /ip4/192.168.8.105/tcp/4001
! Y# R# Y* Z# i5 m0 r9 f
Swarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/40019 s) s( L2 D/ u1 ^- {9 i
/ y5 K" }2 z b0 r
Swarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
4 O) o) O4 I& E( }6 j
Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001, n1 v( a7 Q% P- B
, r$ ~% Y2 Q- c1 E* U
Swarm listening on /p2p-circuit6 o) Y: e1 N& U4 R
1 [+ ?1 c& j7 B5 Y
Swarm announcing /ip4/127.0.0.1/tcp/4001) T9 L1 o7 u/ T2 c: S
Swarm announcing /ip4/192.168.8.105/tcp/4001( b1 o1 s; I" i, m
, c# Z2 f! P$ {% \. E9 y" W8 A) b
Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/40010 W i- M2 B# E! w
6 U8 n# j4 D: d; D; i- A v
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
Swarm announcing /ip6/::1/tcp/4001$ W9 ]9 A8 G9 V/ i& U6 \+ ?
Swarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
7 U( q* n, l' e3 X w. ]
API server listening on /ip4/127.0.0.1/tcp/50010 T1 m `: |* G1 {- a3 |, y
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/80803 t! \5 M& a' h D
. _ L1 j( j1 B% ?4 v+ l1 _
Daemon is ready/ U3 ^8 r" q6 ~/ z$ v, K- i5 C
开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:! z8 Q5 _- C% v M, X
9 K; P% W8 J& @
API服务,默认在5001端口,可以通过 http://localhost:5001/webui 进行访问,界面如:6 f3 Q' X' {6 i/ f$ S! Q
3 u' U5 v! z' ~) _3 s+ R8 \
这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。
) A: i$ x. r W/ e5 r& |6 z
网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。
ipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。
1 M5 u& D: v; a3 O) X* D4 g6 x
上传目录到IPFS4 Q+ f, x" o; m4 o; @" o
我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。- z' a6 I" q# Q
> mkdir upchain
. {6 ~9 K! x; }6 Q; w- M& i; r+ O
> mv upchain.pro.txt upchain1 y. M: c0 p1 u
7 u! U) J" B3 k/ F0 }2 _
上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下:
> ipfs add -r upchain4 g3 D; i( \% p+ p" m
# Q7 O$ r) ?9 j& |; ~
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt! k5 C9 S6 _/ S9 g" H
added QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain4 \% Q* L- n0 F7 g4 b( h
j( _! g1 z r9 H& q
43 B / 43 B [===========================================================================] 100.00%2 \! v, ~. h0 s* n4 p- g9 ?
j* @' O/ k# X5 Q0 [6 A) G
在上传时文件夹,文件夹也会生成一个对应的hash,可以通过hash后接文件名来进行访问, 如:% b" Z0 }& n. o% H! |
( o7 k8 m, T. M5 d
>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt
5 ] W; C" K) A4 I; x
3 U& C4 d1 g; A
在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。0 m a4 I: X6 c7 M" ^4 P+ G
) N$ Z* ]% ?, Q3 V
通过上传目录的方式,可以把整个静态网站的根目录上传到IPFS网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:
2 R" ?6 u$ w$ X
https://ipfs.io/ipfs/QmaFWgfpRNz ... uCphq2ua/index.html5 m: r% ]' k0 f7 o( c, W
' t- ]0 o/ \9 x1 p
使用IPNS解决文件更新问题
因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。
" I# C: J- m' w
例如把upchain.pro.txt发布到节点,使用下面的命令:
> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi% w8 L# p( {2 q/ k7 H! j8 p
: K) p3 i$ @0 j9 _. X
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的内容,如图:7 t. x' B7 @/ O
其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。
现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”
8 ^8 A4 C& g. `
> echo "创办人:Tiny熊" >> upchain.pro.txt
> ipfs add upchain.pro.txt. o# ~6 R2 j! w5 I: n }& R
added QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt' f: B \3 M& l5 e' |3 H
63 B / 63 B [=============================================================] 100.00%
8 p& f4 O, d! x2 V {
重新发布一下:
> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S- r+ g4 o' J0 n0 x# L
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
6 t; w9 _. ~3 P( f2 M* {4 O
再次访问 http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva (这个链接和上面的链接一样)可以看到内容更新了。% q8 N* S! a' l1 h7 r1 s% v- X
0 ~: [3 r7 Y1 d3 ?# j
如果我们要查询 节点id 指向的hash 可以使用 ipfs name resolve 进行查询: d h0 E* p: Y' L
> ipfs name resolve, o: Y U/ ]" q# a* I
/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5$ Y9 K, ?' m, O& p( T1 z
有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。
如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:
: x* R% d9 m6 Z4 P4 z# m
> ipfs key gen --type=rsa --size=2048 mykey
8 q( D+ ?; E, u. M5 N+ m4 ]
QmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
> ipfs name publish --key=mykey hashxxx7 C+ l" h" G& }) l% D- M) L! e6 e
+ J* P) h8 `2 U0 d2 _9 N
Pinning
+ B) h9 g1 c0 o/ | K! \7 l! m
Pinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。
4 ^* m- o+ r( V( Z
当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),
0 W/ y, v+ I; L( t% T
IPFS 提供了pin命令进行Pinning操作, 比如我们查询下某一个hash 是否被pin:! Z9 G/ E+ A* c# R
" Y# u# U8 m2 Y! V' o7 m
> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive) C8 O9 J1 y" b8 h1 v7 g# ^- A
# g+ L: d' R+ N4 Q
> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK71 y' V* R5 v2 i; {3 f9 D
Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned6 y4 f$ m$ C r3 Y/ q
可以使用 pin add 手动钉住一个文件,如:
> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7/ T \8 e, G( o3 |
, g0 K9 _! N7 i& E% j
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively
如果要删除pin的状态,使用pin rm , 如:8 o- s2 z$ @$ a
> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
6 F+ ]" u0 X$ G) H
unpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
pin rm 的参数 -r 表示递归的删除pin 状态,对于没有pin住的文件, 如果执行GC操作 ipfs repo gc 文件会被删除。
成为第一个吐槽的人