Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
IPFS 安装# i5 w/ U7 w! ]- O

3 [$ K( R+ u8 w5 c& o: D要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。* D" Z% o  A9 M% U' |$ C8 H
1 C0 l6 e) }$ L
对于Mac OS X 及 Linux 平台,使用一下命令进行安装:+ Q2 e1 o6 e0 @- ]$ Z

( [7 {9 p9 ]4 d0 U4 Y5 I# v& O. c$ tar xvfz go-ipfs.tar.gz
( o. D9 D0 D; ]0 R  u
" p( I4 N9 ~/ N$ l$ cd go-ipfs8 [8 \! y6 }; F

: ]! ~7 w5 K$ M7 v( R$ ./install.sh
$ k7 _( n9 m# e6 W+ u
( y9 Q$ b. ?1 \+ `# D- U8 _上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。
; b! F8 I/ T% o# n2 C/ H( I9 r) t7 W
/ _; `2 f8 B. _在Windows平台也是类似,把ipfs.exe移动到环境变量%PATH%指定的目录下。
- X; R: q; |2 b  P8 ?; [9 v6 T- U6 h- T- C5 c
IPFS 基本用法
6 n* n( V* g6 z/ c. q& d
& h1 `9 g4 C6 z" f4 ^IPFS初始化
3 ]3 U; e! y$ e/ u& k. B. X# Q  B2 G: R) I7 \8 I
安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化
, l4 y6 k$ ~. v3 v4 p( h9 q/ ?- O1 S1 M' J6 d% V- x5 `) W" u
> ipfs init' m% a. [+ `" P6 {) i
) h' ]/ r  W- ]/ O9 ^1 O
initializing ipfs node at /Users/Emmett/.ipfs! k9 t, K6 G4 ?5 ~2 q. `

" X" F2 w' \9 n! `2 T+ p0 R" \generating 2048-bit RSA keypair...done6 W4 ^, X* \- L4 @" [

7 ^9 \) y9 w( T! y+ e6 Apeer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva# M+ K! e( h' }" e8 H7 w
  n: P8 p9 v5 k8 X/ H0 S
to get started, enter:
0 @4 F: u4 O  ^% R( @/ a4 F
1 |5 A; f& h" Q, v: C& M7 D4 F  ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
, ~% z9 z/ C5 l7 T* U# Q" ^6 l" M9 c- l
上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:
. |+ J5 F7 P% B" f7 I, {1 L7 E; g, U+ V, a1 m7 r
生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。
( P( i: v/ D4 K0 N. \1 J
* N6 G) ^- ^( y2 [, c: S节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。
( n- ?( L# J+ J3 J# [$ ~% k& K  h; R7 M  B; r0 T3 f2 W0 R
在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。; |) h; Q" ~4 U/ k+ p0 `

" {: |( k$ e7 w! y$ K7 o如同步文件数据块放在.ipfs/blocks 目录,秘钥在.ipfs/keystore 目录,ipfs配置文件为:.ipfs/config。* n0 H2 j8 k4 x7 X1 S  R1 s

; _, z' F: }& j) nIPFS 配置修改
& m4 A& c; `: K$ H+ p% [1 u' ^
9 R) w# p+ R8 U3 z在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:
" \# H) C& R3 w% O
' R: J& D5 h6 O5 h! x% L2 K  kcd ~/.ipfs( @" v, Y5 p8 h8 Y
1 j3 w: ~' Y4 a
export EDITOR=/usr/bin/vim$ l6 }- \$ A* `5 s( K4 o0 `) _7 E+ ]
; }+ n. H; C2 E% ]6 X
ipfs config edit  H8 I; Z( F; P* A8 N
& d" Q( F  G$ u: o6 \/ k
或者直接编辑 ~/.ipfs/config 文件。! J  c' {" ~" e8 f5 t% m. l

4 N4 x9 j" r; W! m上传文件到IPFS7 X5 U. y) M2 X  i% k: ~
' {3 |2 I- S4 y  @7 b0 z- M8 ^9 S
我们先创建一个upchain.pro.txt文件,可以使用如下方式:
8 v/ v# ?+ \( q) n) i. \; i6 d. E7 J6 R7 V, G
> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt) Q" A: n# E3 [# K- ^

% Y* v+ v; r4 v! U& Y+ }. u  N& yipfs 使用add 命令来添加内容到节点中,  在命令行输入:+ X% Q" s  q/ q! {& r9 t

9 H, S% R& ~+ e4 _> ipfs add upchain.pro.txt( L5 {5 |- {9 `7 F' ?& m. B2 l
- l; X+ H3 }" @3 @7 g- P& _) W+ ]
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt
5 c' Z& }+ l& ?( Q  M1 ]
( T$ {$ \% w9 F  S' u43 B / 43 B [=====================================================] 100%8 o( x+ X! t+ c1 r
  ^0 W. d+ U  r
当它文件添加到节点时,会为文件生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 查看文件的内容:, ~5 }" J- v8 `: y: \
. z7 X( q) u" @
> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
- _* a! {* F: g2 ?8 I  X7 A/ o5 F* s* f  r# i; I
* h+ }1 Q7 l! q! [
注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:
. c' I+ \4 l3 e! L! B9 W# z' W' @' k8 F- c: n9 E2 K, [, U+ j
> ipfs daemon. O. K% P( m5 Y8 J
  ]  Z# d6 ?3 I/ c% q( g. b
Initializing daemon...
/ P+ Z7 G3 j" W! t: n9 b* u) h! z. T; ~3 ?( @# E  R( v" n5 V: E$ Q& ]
go-ipfs version: 0.4.18-$ Z6 L2 m- [: B( r& H+ P) ~8 i
0 @2 P* p2 a* K
Repo version: 7! Z: B4 _0 f, v% H$ z- I+ x

: ^# G4 m1 Z9 y3 T$ USystem version: amd64/darwin( k9 r) y& I  a8 Y! ]
: m9 q7 A0 S$ L: ^- H) F
Golang version: go1.11.1* ~5 T1 [! E: v, ~2 A3 ^7 e, c  m7 I) q
+ S5 Z! m% b) d+ ^8 R
Swarm listening on /ip4/127.0.0.1/tcp/4001/ L" |+ _# [; U$ @# o' f1 D

) E# t) g+ t& Q% y* q3 Z1 DSwarm listening on /ip4/192.168.8.105/tcp/4001; X' N$ \) D# r8 i8 \: [
# [( E* P; N% c2 H
Swarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001
2 Y) w; a8 p& s. t& i0 G
/ x3 j3 Y& A; r+ }2 a, mSwarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001* P  w/ u) q: }1 R; ^4 }, U

* b! `- N' [! q0 F' K& }Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
* A7 f6 S& x3 P& Y( ]0 d7 n- B/ N* n4 U2 G3 j3 C( U8 h- I
Swarm listening on /ip6/::1/tcp/4001
' h6 J! U4 x- ^' ]5 \/ l! ]/ q. r- z3 U
Swarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
1 q8 W7 \( j- C; {( L7 R# d2 b  @: l, P9 D+ l
Swarm listening on /p2p-circuit, c: G1 y9 k7 S) E* {8 J5 [

1 m  Y% i6 y$ O2 c- Z5 SSwarm announcing /ip4/127.0.0.1/tcp/4001/ X  E5 X( ~6 _1 V3 X
7 A$ |- U2 p+ R* l# o1 e* N1 j
Swarm announcing /ip4/192.168.8.105/tcp/4001' o3 n0 V- o$ v3 j8 `- {

2 r5 h1 ~+ B" h! c7 w7 T$ F3 @Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001# ]4 W$ |5 E& F$ \

# @) ^' t. X! H) _6 `; H) uSwarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/40010 k" M' L* K6 z3 P2 g& e9 W: `
3 g& p, o5 |' R! u
Swarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001% u7 M6 P; F4 T2 v0 e( X5 N
, `5 Z1 P6 @# J4 s- }+ W5 V
Swarm announcing /ip6/::1/tcp/40016 _7 }. ^3 v+ g- \! ?. {

& o7 V- @8 X( e3 BSwarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
, \" W' Q3 ^! V. U/ A: z$ v0 C
API server listening on /ip4/127.0.0.1/tcp/5001
" e& D$ n- G1 m: P. d, \1 d  g1 O( b5 a3 J6 W6 G( }7 [8 Y1 N
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
- w6 }  k2 Q& K- s$ W
; c; g8 H+ f, l$ PDaemon is ready
: G( s: R* D9 k. Y2 e: o  A# }2 ^2 y- Y- a  C; [
开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:! `, g& R- K& O9 ?+ N, q' ^% |- A
# V0 E3 k3 p: Y3 M
API服务,默认在5001端口,可以通过 http://localhost:5001/webui 进行访问,界面如:
4 C: `/ j4 A  G3 b( a$ Y- j' X- a6 ~" ?; w
这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。) G- l" r+ l2 K
0 I* {% b2 b' a3 p' W
网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。3 N! h, S5 a1 T
: ^" k& Y) R0 W4 B$ J, q4 ?) e3 C: |
ipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。
7 E# o0 Z( I5 I! X4 n8 s3 G; ?) u; _) Q& T+ f
上传目录到IPFS3 \1 S( \+ @  ?- l6 Z/ s

2 ~) ^9 @, f. ^1 l! e我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。: p4 l# s" r( ?* U1 X4 U
& y0 ^1 O6 a. G  m
> mkdir upchain
) N( s$ @( M6 [; u0 u! Z% D8 B2 V, Q- q1 Y  O6 d* y9 i2 d
> mv upchain.pro.txt  upchain! `+ l% C( G+ A+ a% K) p

: y( F9 O/ ]' q上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下:$ _7 G5 J9 r. R, e: _
# w) j7 A3 m* U# D# m% W- l6 w
> ipfs add -r upchain8 C! Q: U: Z- _4 F6 [
4 L  l% @7 S' ^3 n* g; g
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt) C8 c$ t3 i/ j) S3 ^" d) z7 j
0 Y# u. n7 d  k
added QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain
3 E; m: h/ ~# g, W9 O2 b* p# f% x8 I  [; A# d# S" b* Z
43 B / 43 B [===========================================================================] 100.00%
" S/ f' G' M5 v7 i; V( _
/ v! I4 Z. Q2 p+ H% o1 f! F8 |在上传时文件夹,文件夹也会生成一个对应的hash,可以通过hash后接文件名来进行访问, 如:
5 M: A% r: e+ H; {4 m  k- R$ U6 B0 @
6 s1 t5 a  z( Q& U! ^>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt
- C5 ~. D9 T$ p% a4 p( P: ^7 i  L
  a8 X# v, s3 J* T, \
' L1 `8 |& m1 Q9 S; x4 w4 Q在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。9 s; m5 K, H8 h" N
; s7 ^( t3 B$ ^- g. r
通过上传目录的方式,可以把整个静态网站的根目录上传到IPFS网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:3 c8 h2 N0 B% L1 H7 Q

. p6 y$ K6 H2 n0 k: Yhttps://ipfs.io/ipfs/QmaFWgfpRNz ... uCphq2ua/index.html7 h2 y! T0 d" ?. a. ?4 ^2 D

+ |) n4 g# f. U/ m  }' @使用IPNS解决文件更新问题3 E  z. l5 ]7 q
" B) X+ p, x, K- l
因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。
* |8 t1 c$ ~# H! s! k3 x
5 n( D7 ^/ U+ E' Q& e例如把upchain.pro.txt发布到节点,使用下面的命令:
2 N2 {7 P+ j4 a& T3 z) X  k( k9 V7 ~4 c" B9 t
> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, i" ~) A9 R/ @( X& x3 d9 p

) P: ^1 }# b* b" O/ N8 f- K9 Q9 _Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi# ~% T% }, J- t: Q
3 |( J# y8 M# N$ u
命令中的QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi是upchain.pro.txt的hash, 命令提示中的QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva是当前节点id(大家可以回看一个前面ipfs init 的输出)。
2 R0 V1 \# e; @4 B- m; X1 A2 W$ Z6 f& {: C. f* R/ T) |
发布之后就可以使用http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva 或 https://ipfs.io/ipns/QmYM36s4ut2 ... VvmDU7xKUiVeswBuTva 来访问upchain.pro.txt的内容,如图:
$ K" I& `$ {$ G+ h  P0 x+ \) u3 N- }4 _' _$ @
其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。. k; c7 k0 S, N3 v1 n1 D
7 ~) D/ Z2 b- t3 U& }$ Y
现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”% d' m; M4 w. y7 N

1 I" F; W1 d* K* C, d( q> echo "创办人:Tiny熊" >>  upchain.pro.txt
  I5 l7 `5 `" y1 S$ y
2 s# b" _4 }2 o> ipfs add upchain.pro.txt2 n. B: ]$ m* `% M& m4 {  c

4 B* o: V- u  S# C8 F5 R. J# J+ qadded QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt6 l! Q+ e1 D2 l1 w* U6 U: y

+ L0 n% O8 l4 D! \# I7 _63 B / 63 B [=============================================================] 100.00%3 J: |, d: H. L/ [# b; U

8 X6 @4 |( U: P8 I重新发布一下:8 ]8 K2 _  u# l/ O

- s/ r- Z( r6 x( C> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
* f# i2 o- ~. D% @! k1 d! L" ^5 v* d5 j8 a$ w
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S  U8 |% |) T. K( ^

' c/ r. o$ ^3 I3 _0 z再次访问 http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva (这个链接和上面的链接一样)可以看到内容更新了。' Z& h/ b' Q$ a1 u9 }& a" D* K2 b

! J: T& G  M! h/ Y0 {) |8 D; S  B如果我们要查询 节点id 指向的hash 可以使用 ipfs name resolve  进行查询:
! s6 t0 Q% U! z: v4 _7 x3 M! U6 i  |! ~  |
> ipfs name resolve0 t  Y( C) |, }4 I

/ }! o0 P: E  {2 b/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5
) A9 e* p' d2 T- ], V' E7 @) Z" \$ M8 D: T: `/ w4 y7 ?! ~$ g
有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。
( l( f, Z. G& a% G' O  R
  s9 }: |; J% [如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:8 S, Y* I: _* X, v$ ^
9 W+ z9 n3 A) q5 O  z" Y
> ipfs key gen --type=rsa --size=2048 mykey
5 K7 T. W9 o8 i
2 D/ S+ F9 P! i" Y8 M6 \QmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
4 F) ]' y, B6 g% W2 J/ N, o6 |" m0 T
> ipfs name publish --key=mykey  hashxxx
4 v9 u) [% v7 Z4 _
( L; m$ z$ b% Q# J3 A; R4 \Pinning& F/ Z. a& h0 M# x' M

1 u# l, Z4 d' ]' b- L% O6 n/ Q* b2 sPinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。
$ y; M$ u, d  v  X! I' ]- H# A( E; I4 y
当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),2 R8 x  I# ?! q) I) X( r
* R  c( T$ ^2 r! `
IPFS 提供了pin命令进行Pinning操作, 比如我们查询下某一个hash 是否被pin:! [6 p4 S- A6 A7 s

/ O( n9 c' {% n" U8 E$ P" o> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S' g+ W# l4 H' W4 y/ i5 b6 N6 h
4 N: V* @) o; j2 g  t* G
QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive
6 A2 C9 ^  Q# c; B, h* ^+ _1 Q
% p% O* L6 Z  d6 @! o. ~; J* a> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK74 C+ @9 W6 k) N( s7 V, l
+ F( L0 u& A' M, [& {
Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned
# a, u  {' {# Y! T, }! _4 Q0 h) P4 Q# g: d( D1 e3 b% H
可以使用 pin add 手动钉住一个文件,如:
1 c) |( b5 g6 m7 J; @4 u
/ N1 Q4 j. t8 g6 v) r0 c1 z> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
! W! N$ k! s7 j# S7 \0 Z
. y/ b9 _: P9 O0 G9 Npinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively0 z; }2 `- \* o; f) g: C
* H. Z6 N* c+ N& E
如果要删除pin的状态,使用pin rm , 如:& A0 b; Z+ j$ F  e( F
+ I, z+ ?+ v) y# E' ?2 M( ?# j
> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' v& h% B5 a7 c7 A$ e

5 J- g+ Q0 m( ounpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
# Q/ \- f& x, y" C# v
# N. `& k: \% t5 d) s0 z* g. u* Jpin rm 的参数 -r 表示递归的删除pin 状态,对于没有pin住的文件, 如果执行GC操作 ipfs repo gc 文件会被删除。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    2