Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
IPFS 安装
. J9 ]: f; m( Y2 y
8 [  ?5 Y0 W# E( e0 N要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。
/ F: v9 j( k! V; D+ B+ E9 O0 g: w6 J/ {
对于Mac OS X 及 Linux 平台,使用一下命令进行安装:& Y* \7 @1 _9 `* h9 |+ k3 z/ D( N

! i9 ]" H+ J: `$ 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

) x$ R8 P, T- r. T6 C$ ./install.sh* O; V; L6 _& G

- \) |4 b0 |% Z( @上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。
) g4 i2 J5 c' p3 b1 d+ D0 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 基本用法
1 u" X, [: D( z8 W, }3 I% ?$ [/ E
IPFS初始化
% }  O& l( {! K) {! f7 u6 R' E8 d! Z% a
安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化/ F; I# `4 C  ~

) @. r. {% k, b9 k> ipfs init
! r# ~) a' G. A9 T+ x3 c% t2 i3 O
initializing ipfs node at /Users/Emmett/.ipfs
0 Q. s' [7 a! b: N! T5 T. R/ c" N# `$ y
generating 2048-bit RSA keypair...done
1 L' V) Y# e) Z! Z
/ S+ q4 v* Q* n0 Gpeer 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
  c- P7 E0 _4 q( Z# m+ s7 p7 G1 a2 H; W: T2 F: H, x+ F6 N
上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:
; Z4 A% Y) n! I& k% S  ?( T
, A7 A) a- l5 c9 @9 f& D生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。
2 k. G, S( I! p8 J5 k9 ]+ S! F9 N! h# S9 }7 y, j
节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。
! [  S/ Z7 `# ~, 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。
& n8 c! r6 L/ w5 x* Q$ T; d
# o' `; ~2 g. ^7 O% q" B! y$ {IPFS 配置修改
5 d) u# @* }, R) Y
9 Y/ Z+ c+ Q8 U3 `/ W在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:
, B* A! S$ p9 v* ]2 N& |3 I5 ?# Q2 k! t* P
cd ~/.ipfs
1 G0 b, e1 }7 u: D
4 i/ v- C0 V8 ~, `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 文件。
! z2 c) g3 [9 I: O# i6 Z9 P" n- {( z% N- b
上传文件到IPFS
/ ~5 c; Q' N! F! x+ c6 ]% W2 ^$ w
我们先创建一个upchain.pro.txt文件,可以使用如下方式:! |# T. V: h* e7 X& _; c

- d; Q+ s  j/ R6 C> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt; y9 F0 z% m9 j8 F. i$ ?, f; S

1 Y- T3 o/ V: _. C2 C5 Tipfs 使用add 命令来添加内容到节点中,  在命令行输入:
8 K' E4 M+ ?% q0 D9 b) o  `4 `* [) p; g4 O% x$ p# y% T
> ipfs add upchain.pro.txt
# g! g1 H& v1 G
- {* Q3 q. h+ j" l- N! D; t9 ?7 Yadded 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

  U+ q8 o/ S5 f% h> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
4 t0 @6 C" s) L" g* ?# Q1 u2 T! M8 N4 @) k- [) e& v

, F4 Y, O/ W* V9 b& k注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:2 [- i5 h) ?2 @0 j9 t& n

' b( T( f# F! x2 @+ T> ipfs daemon
  o. ^( B* u; o3 A# C6 o* F
" [2 n2 |, D% u6 `4 u! ]Initializing daemon...! K* J# ~1 B  A# j, f) z

5 I  u# V, _6 v+ \9 g8 P4 [go-ipfs version: 0.4.18-
% N1 B( S3 p" R1 [8 G8 _+ D7 r& X! F# B* Y
Repo version: 7) M6 ~% a' V' A

3 S+ Y- n) @/ A! KSystem 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

1 X, j" ~4 R) n5 W2 sSwarm listening on /ip4/127.0.0.1/tcp/40015 @: ^! ]2 k( T5 I

0 }* T4 D: C& C& }2 h7 VSwarm listening on /ip4/192.168.8.105/tcp/4001
+ J$ s$ w/ d1 x+ [7 m! 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
, T! I& E! Q& U& v0 J/ Z4 O) o) O4 I& E( }6 j
Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
6 V4 i  \# z- `  B" [
4 M  `1 P# Y' J, S* R" ESwarm listening on /ip6/::1/tcp/4001
! {" |+ m5 ^% U% v
9 E$ m- s" G- \9 uSwarm 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

6 L4 b1 @+ y% a# k! e2 fSwarm 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
7 s/ R% d; B- Y% R  @) B9 e6 ?: K
* j9 R( `7 _# Y: p3 l* E( J1 \6 I, ASwarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
- \6 J' f8 f+ ?) Z
5 X+ }8 Z7 S2 z& HSwarm announcing /ip6/::1/tcp/4001$ W9 ]9 A8 G9 V/ i& U6 \+ ?

" \4 Q- c6 P: j+ mSwarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
  F+ U1 A' D+ ?7 U( q* n, l' e3 X  w. ]
API server listening on /ip4/127.0.0.1/tcp/50010 T1 m  `: |* G1 {- a3 |, y

& r/ O: \7 U3 s! f% o. tGateway (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

) ^; |  I( E, b7 T* ^+ E开启 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版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。
3 d  o) O  I( C7 v/ v) A: i$ x. r  W/ e5 r& |6 z
网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。
. q# h% p% p9 B& x  B
. w; C; n6 c! d: Jipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。
/ \% {! T; ], @" W1 _! z3 e1 M5 u& D: v; a3 O) X* D4 g6 x
上传目录到IPFS4 Q+ f, x" o; m4 o; @" o

  Y5 J* v8 q( Q$ v# L. N我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。- z' a6 I" q# Q

3 k$ ~& v+ E- N1 k: N( r$ P> mkdir upchain
4 b& p# Y  t& T/ e; K+ E3 E. {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 ,如下:
- C* ]3 f5 I& \
4 @# @! O" S1 K* ]6 w> 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

# U4 e, x+ P  Q9 [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
1 y- m! o$ `$ Z5 U2 q5 ]  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网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:
  Y3 n% y- L) L2 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解决文件更新问题
) G, h) U" ~& G, a! H: X  z
, E5 {  ~. N5 L$ U5 E- c因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。
4 H6 `+ V; i/ T/ ]/ e2 [" I# C: J- m' w
例如把upchain.pro.txt发布到节点,使用下面的命令:
: h, A$ B) W3 f. Y1 h/ p$ d+ ]. q
7 o2 Q4 Y- U9 `6 t> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi% w8 L# p( {2 q/ k7 H! j8 p
: K) p3 i$ @0 j9 _. X
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
; ]: {9 @9 I0 Y  j. }! n1 D9 A2 |
+ V) ]+ I' @4 w& c( y% N6 A- g命令中的QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi是upchain.pro.txt的hash, 命令提示中的QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva是当前节点id(大家可以回看一个前面ipfs init 的输出)。
& m; Z$ L* ^8 h* D
' S/ m- b" V  Q发布之后就可以使用http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva 或 https://ipfs.io/ipns/QmYM36s4ut2 ... VvmDU7xKUiVeswBuTva 来访问upchain.pro.txt的内容,如图:7 t. x' B7 @/ O

) [, t% W$ A; G) V5 D其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。
! e+ u- ~1 W# D0 S
7 i* [% S, A5 o  d, d4 T/ A# c现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”
' y4 R) ^8 q* h/ p8 ^8 A4 C& g. `
> echo "创办人:Tiny熊" >>  upchain.pro.txt
" i! H4 j+ m9 y0 Y
7 b; r- f" O+ B> ipfs add upchain.pro.txt. o# ~6 R2 j! w5 I: n  }& R

; @3 F( n0 C. Eadded QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt' f: B  \3 M& l5 e' |3 H

  A! z( N0 d; D( p" O63 B / 63 B [=============================================================] 100.00%
8 }1 R$ r, e/ ^' U) ]) y" Y8 p& f4 O, d! x2 V  {
重新发布一下:
9 F% ?- {& ?) \
/ ^: F  x! r4 C> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S- r+ g4 o' J0 n0 x# L

' L+ a% B& u$ VPublished to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
! L' ]5 K3 _6 z2 m* T6 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

4 z% R& O1 e  `: o1 Q> ipfs name resolve, o: Y  U/ ]" q# a* I

3 M, e, @  y+ ?# v& C" S' f1 y; L5 t1 W/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5$ Y9 K, ?' m, O& p( T1 z

' x! q- L3 |( O' v- S! r有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。
& d8 o1 q' m" c' n  [+ [) o
, C& w- _2 Y3 [; z- R' |, I如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:
  U0 o6 L& F3 _* J: x* R% d9 m6 Z4 P4 z# m
> ipfs key gen --type=rsa --size=2048 mykey
( O( p1 n" K4 _, `% q2 n2 Y8 q( D+ ?; E, u. M5 N+ m4 ]
QmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
4 U5 K5 Q- B: n3 l- |% Y; P' ?1 ~
% j( z; H4 L! i& d' x- G& f% y$ F> 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
! n& `/ O% T# H! v+ B) h9 g1 c0 o/ |  K! \7 l! m
Pinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。
; u- z: e$ B/ V( `4 ^* m- o+ r( V( Z
当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),
" S+ d/ r" t6 x% ^7 y7 t. t0 f, \  D+ ^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
! F, R1 `# A3 z, A2 q( y, @
7 ~* }& t# R5 ]9 ^. Y! oQmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S 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

1 Q# Y4 `, s2 d' L1 EError: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned6 y4 f$ m$ C  r3 Y/ q

/ `0 e7 |  N) d& Q可以使用 pin add 手动钉住一个文件,如:
% s! I3 `# p! _& X
+ R# {8 i6 i1 R9 h" r> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7/ T  \8 e, G( o3 |
, g0 K9 _! N7 i& E% j
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively
9 i: N& b" J& U0 t+ U) T5 S
2 w# q  a  i- @( N) H  e: p! g; t如果要删除pin的状态,使用pin rm , 如:8 o- s2 z$ @$ a

/ A. `2 f% G% |; G> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
  P$ a( f: V8 r! }- g6 F+ ]" u0 X$ G) H
unpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
! _2 Q; p0 U5 E0 W* J1 _9 x
2 D0 @3 \8 }$ u9 W0 |7 xpin rm 的参数 -r 表示递归的删除pin 状态,对于没有pin住的文件, 如果执行GC操作 ipfs repo gc 文件会被删除。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

在冰雪中的玫瑰 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2