Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
IPFS 安装  v. l) k# ^# ~" d: f

' C3 g% w1 I% `1 N8 s: }要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。
; C1 G8 O) ~- U% k4 l1 J' @7 p
* o% L% `3 C4 n9 w8 b5 U对于Mac OS X 及 Linux 平台,使用一下命令进行安装:
2 r2 K3 t" l7 W( h% t
' t; n2 X: E. z6 ^! n4 n* f/ E' L$ tar xvfz go-ipfs.tar.gz
7 @1 ]0 V( t; l0 K, i; B$ R) ?" o. l& g9 @
$ cd go-ipfs! `1 p  `) v4 f' Z
% J: E. w1 P6 X  e
$ ./install.sh8 F/ F$ Z' p/ V! x
+ n' |8 A4 A! L! {  M+ j
上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。
, h6 D; G, Z$ H7 \  F- O$ w/ a) U+ J: M" v2 \" v
在Windows平台也是类似,把ipfs.exe移动到环境变量%PATH%指定的目录下。4 A- R; g4 ^& n2 G& H

3 v: w+ t( v8 F5 x) ZIPFS 基本用法& A' G* [9 J1 {( W0 `, z# s5 k

% X" T% u* U. S* c/ |" eIPFS初始化1 o# }5 u  O( r/ I

: N. o" _( C9 Q/ u- I7 c安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化
- X1 S) x6 p, e0 k$ O; u* `# g9 i3 P- _; Y
> ipfs init0 _. N. |% J! G5 `$ u
6 W1 z' @( H/ P+ N6 Q
initializing ipfs node at /Users/Emmett/.ipfs& M0 L+ C" |- \! c& m
( p2 q# ^) P6 n2 p
generating 2048-bit RSA keypair...done) M9 W/ e8 p0 Z
8 T# ]" l- D+ c9 K# t
peer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva, U; T2 M# r8 d% x) V
, P1 J3 E0 H  q5 M6 y1 s2 Y: t
to get started, enter:
2 v) _& x! ^! T2 A$ Q; Y6 s+ |
. Y6 T& }3 Z! Q4 v+ d2 P3 [' L  ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme3 G3 ^" K7 i1 l9 B
7 T# y. b. _/ j( X& s% f" j; q( K
上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:9 c: e+ T; z* _9 N& W
) G1 d, n; E. P) [; ^8 _# n
生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。7 w4 r1 W- n( x) U7 p$ v9 k- z8 V

" G* |8 m0 r% X2 V节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。
6 |0 F% w5 ^; Q0 A: o% L
; T. M6 A$ M# G: c' ^1 \在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。0 h$ a, t* {0 @5 t5 i- e% M

- w( a! A: \: Y1 z3 X1 Q如同步文件数据块放在.ipfs/blocks 目录,秘钥在.ipfs/keystore 目录,ipfs配置文件为:.ipfs/config。
9 L; u  Q9 a4 \8 ~& W6 J, x
& v0 X. N  P# S. A  {- ]3 VIPFS 配置修改
# \7 s2 b) ]7 D+ j/ @" n0 Q$ q' b5 }0 T" a
在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:
, g1 [1 S9 s/ {# i4 d% f2 O( _* x5 o$ C2 ~9 O/ y- J8 o4 l# j! L
cd ~/.ipfs
2 k( i3 x* g" g  \& I# w
# Y9 O. m3 R# j* B0 Y: v6 _8 Y. Iexport EDITOR=/usr/bin/vim
8 i1 r# @! B4 R2 Y, }! S9 v# ~
" D  ]5 M* |% s2 g" ~ipfs config edit; M. V1 u! p# B

7 a# F- x* W; ~+ t4 m* K3 o或者直接编辑 ~/.ipfs/config 文件。
2 T  E( A9 x! N4 O8 `* a# ]2 w+ e% O5 ~
上传文件到IPFS$ z' B  n7 i6 g
5 `. l, r: s6 T9 w+ c, S/ m
我们先创建一个upchain.pro.txt文件,可以使用如下方式:
& ?# s! M% X- z7 [( _) r/ W& F" h: i- Q) \% y2 K8 J
> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt; W: H$ z% k  S
2 M! L* J/ h- G; z. n
ipfs 使用add 命令来添加内容到节点中,  在命令行输入:
+ [9 P# v- q) Z( L8 O  k- `
3 w2 J- |# T1 i* {) X> ipfs add upchain.pro.txt0 ]$ q$ Q/ J2 {9 e! \
* ]5 Z5 a( z! f0 @% n
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt
0 {, q  _3 A" |3 n) A) C
; x+ J6 X- \7 z! ]7 L  P* [43 B / 43 B [=====================================================] 100%  w9 n2 i5 |0 d% H0 F* H
9 ]4 r; W$ ~9 t+ O. {& W8 \; y
当它文件添加到节点时,会为文件生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 查看文件的内容:% P6 A( W3 n& ^9 Z
% h9 F" x* A3 K! D' c
> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
8 `, T4 t+ H  S" `: |5 A5 E
. f+ W) M, o8 {. K: b3 ~0 A4 B
# P2 ]6 X& y% _, D4 x% y$ P4 m注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:
/ n( ?) G: X# x2 B9 O
) F' |7 m' Q7 k> ipfs daemon
( c# }2 r. n* l6 {1 [! Y' o  ~& G2 q; c
Initializing daemon...
5 M; d8 X5 `! M" U0 v
( G& {) u# g& Pgo-ipfs version: 0.4.18-3 E" ?# r: \7 c# r' {# ^- t& D
  I1 k  k; U( X- t4 c  x1 o
Repo version: 79 ^; a6 x( W! k8 t, c

4 u8 q: _; u3 O- B; PSystem version: amd64/darwin/ {) A" f' x" G' W
1 [5 J( J+ f, E3 E7 b9 q$ q0 v) `
Golang version: go1.11.18 v1 ]6 N9 J; k) j; H- f

/ i# O! p8 k- s! vSwarm listening on /ip4/127.0.0.1/tcp/4001
- n( B9 D2 @% D& m$ E" j, ~: {) X
Swarm listening on /ip4/192.168.8.105/tcp/4001
, V  w/ Z+ T! @9 o) v* ]) _% [" Z0 u1 O; ~
Swarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/40010 T; {/ e3 T# T* C% {) S, S
7 f& E3 Z2 G, O' i3 p
Swarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/40010 G; X$ H" V* h2 G: y
2 T9 Z6 T/ F( s6 Y* O1 p9 w) h
Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/40012 e! r  K0 I6 c

/ f+ A- k% N3 e) O$ s+ u2 JSwarm listening on /ip6/::1/tcp/4001
- L+ S- _& U0 K) d$ v% _$ {: d- S. T/ l" S0 N( |: t( c4 d0 b
Swarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/40017 S* [" B1 r& B% P# _+ A

' w5 g: E3 t" Z! B# gSwarm listening on /p2p-circuit
1 Z  |0 X8 l5 o0 A+ R
4 z  h! I) a9 t" M) X% j, N: dSwarm announcing /ip4/127.0.0.1/tcp/4001& \- I2 M, N7 m0 n
* k9 h' M* ]8 t* o" b5 j
Swarm announcing /ip4/192.168.8.105/tcp/4001
* p2 o' u/ F: A+ _3 J) e/ R# t, w: w
Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001& P  B0 W: b' g2 d. [2 Q  t

; l/ X5 X' E0 P# p% T% V' D5 t9 S- GSwarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
  L5 V5 ], ]2 {: I1 \: s- Q7 P* I% `  K- \/ Y: v2 @
Swarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/40012 _/ A" C% r. t. k" r" e5 l

( z+ D, c: l' I' d' JSwarm announcing /ip6/::1/tcp/40011 |; N) ^9 a- q+ t, [) x: V1 `

0 M' z+ V$ I* gSwarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
( e* q8 r  o6 A; C6 l0 [- x3 D, I& I! d$ @5 m1 V) `+ d- g- n6 d
API server listening on /ip4/127.0.0.1/tcp/5001! ?$ h5 E& p0 Q( e8 w
" [. l# o5 S, i* |
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080$ N; q+ ~/ W' x- U6 s" N
! u& ^, J, {) ?
Daemon is ready$ B9 o- x( h& K* v( V+ d6 Y4 ^
' Z, A4 k' ~" Q' E5 v: `
开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:
  D* I( v! ^2 O+ g$ q- Y4 d; }1 d+ D( e7 `2 l) o, l% d
API服务,默认在5001端口,可以通过 http://localhost:5001/webui 进行访问,界面如:/ F7 ?+ V/ o  O" e% B
6 ^9 l7 S9 W( |: h
这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。
' A; t( T' @( q! o8 T3 c7 D( J$ r: E5 z: A$ a9 B7 E$ D
网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。% |9 B$ I" }' b0 o2 L1 P* X+ ^
+ a; x- l. v: m  k
ipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。# h. q. L  v& L" Y6 `
& m  d& V( ~# W2 x( p
上传目录到IPFS
) S) D$ O% f4 m3 Q1 B
- K6 w/ [# ~+ d) m3 W5 l" Y3 F# f7 B我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。
* p: q* o& }  \  [+ Z7 N0 Y8 Y5 B' t& d3 n8 j, R# K
> mkdir upchain8 k0 ]# I. H+ x4 \. J, `1 j7 o& L

( @1 ?6 D/ S- V9 A; D7 ]% K> mv upchain.pro.txt  upchain3 q3 I9 C! o' [8 d' m' X' I

5 o) S: i3 U" P3 r% U  V上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下:6 q) S8 N( Z$ _% |0 y9 a

! o4 Z1 u) [6 S. u& j+ m  m+ G, x> ipfs add -r upchain
- W2 \/ h8 Y) _0 M  `/ l
0 Y+ `& Z: ~6 \3 padded QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt9 n3 S$ }+ ^1 b4 d" U  q

) ?3 Y) q" i7 y8 jadded QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain* D0 s9 i! [! ?5 |( l+ P

! X& }7 g4 K) y4 J0 k. H43 B / 43 B [===========================================================================] 100.00%
7 l: z1 s9 n. [/ l  k( q2 W- D: \$ m& B* F* k& Q4 b$ e# b' U
在上传时文件夹,文件夹也会生成一个对应的hash,可以通过hash后接文件名来进行访问, 如:
5 _1 q6 }, |7 E& g
/ |! p* V3 U# l2 l>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt
) M; t$ j3 }7 n) [
' m3 ~/ D7 i; B- g3 _5 B: r0 R- b, B* b4 V5 _0 \
在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。9 D/ D0 g9 W* S
! j* I% N8 D: E  N& O1 H
通过上传目录的方式,可以把整个静态网站的根目录上传到IPFS网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:0 H& [0 U8 Y! ?- o8 @1 H+ @

$ j" w* }+ l( F  b& d5 shttps://ipfs.io/ipfs/QmaFWgfpRNz ... uCphq2ua/index.html
( Z8 t* o$ F. \) f* L2 L" W6 @, c) E
6 M2 C+ Q+ O. A6 v2 Y使用IPNS解决文件更新问题
. ?( D& \6 {/ e1 z" t9 h( Q% G1 ~- N6 x. G% {; \
因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。
! Y2 ^/ u5 m1 D& Q
: Y) a1 k5 [# L0 J; @9 F) L" N7 k例如把upchain.pro.txt发布到节点,使用下面的命令:
: X6 A5 m$ t! L8 V4 Z: L1 ~: D' j5 v
> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
1 |# q' `8 u& U6 G6 D, N# l- j) ^
. a& @! ~' R+ d. r% O7 u; l; \Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
1 a! ]$ Q2 H: p3 w( d& U- t4 k7 I
8 U( B' N$ L* l2 j  A, P% m, f命令中的QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi是upchain.pro.txt的hash, 命令提示中的QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva是当前节点id(大家可以回看一个前面ipfs init 的输出)。
$ u* i* R9 D  X3 h9 R
% p: P7 n! U1 z; A$ {; A& V; ^发布之后就可以使用http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva 或 https://ipfs.io/ipns/QmYM36s4ut2 ... VvmDU7xKUiVeswBuTva 来访问upchain.pro.txt的内容,如图:
; b/ W2 U2 p/ d6 q3 u, ^+ R. r- b, P& j$ Q' `8 A
其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。
' W( M! b3 U1 t& m3 C
' y! L6 R, k5 l' u$ p现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”
: i3 U9 V! L' Z4 Y
( s: Q5 v( Z$ Y- T0 |" O> echo "创办人:Tiny熊" >>  upchain.pro.txt
4 Y$ E$ {: a# g2 \8 C! ], b; _% F3 ]6 c# I2 C1 y9 O9 K  N
> ipfs add upchain.pro.txt
% x; G8 k; a8 v1 V8 N* B/ u+ k0 l4 Z8 w' a7 S8 [
added QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt4 e* X. }6 I+ R6 s* m

" L1 \- L3 y) j7 v63 B / 63 B [=============================================================] 100.00%+ a5 a; X; r0 G' Y
  ?# p5 J5 H. `' m5 b- w3 l
重新发布一下:* C2 l1 X7 f6 y7 b, _
' r. ~/ a, f4 W* G1 k
> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
! l7 u! @/ A- L& o5 g! ?
7 N' [' r; c# R- T1 P+ j, ePublished to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
$ U( L) [+ i5 O/ J' B. S' ]5 K8 ^" T2 Z1 O: _( N4 o
再次访问 http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva (这个链接和上面的链接一样)可以看到内容更新了。
- f( K* E2 Y* M. M* S. D
6 w( w$ E, S1 ~; q2 w; H' P如果我们要查询 节点id 指向的hash 可以使用 ipfs name resolve  进行查询:
- M( s& U4 u# L1 n( S, D! e6 E$ k) k' r! S  B- K7 Y# \. |7 K
> ipfs name resolve
/ `& y! ]7 U9 Y) D: i, O( P
) O: ^% f+ d/ A' T/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5; B* e' z1 W; _2 D, G# {3 C

: x  T6 b# u, o  e! X+ C$ L有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。
  L1 M* z, F$ [9 `; w+ \
' `3 m, z% S6 @% y0 X如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:: h; R% e; `- L  y- j7 B2 M' y

$ C9 l; P+ p1 I$ U> ipfs key gen --type=rsa --size=2048 mykey
& n8 T% J, K3 c8 |! C% Y# T
) K5 m: P* }0 }/ v% U4 U2 S/ XQmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
  u) N: ^6 v% ^* }3 P) C& i" `" \! D- M6 d
> ipfs name publish --key=mykey  hashxxx% l& L! Q# |9 P( P) i$ u  {
& `( w  y4 ^' r2 P+ r
Pinning- B, l7 ^# f; u3 @! B- v

# f& X! j7 s) K3 i: JPinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。! m8 ]* G+ W9 ?# k

: F, H/ @9 f$ |: j当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),- ?7 d5 _4 E5 R. c

, n8 v# ]; L5 A0 E, M/ DIPFS 提供了pin命令进行Pinning操作, 比如我们查询下某一个hash 是否被pin:
3 I; ^: V$ a! b; O- o; T2 l8 F# m* o9 Y3 i1 q) l& U# o
> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S( t" r/ n# M/ Q6 F- \5 O

( s% H5 Y- L2 S# cQmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive: X  e, c0 K7 e) I1 T. p& {! w- D
' a/ c* w6 }: J% Y  o; Y
> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7+ b7 m% I4 w$ P, G* e2 R
$ {" c6 q/ ]2 u+ x5 T/ b
Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned; r' m; b0 E: y( V+ r4 h
0 O6 f8 ^4 e0 r- p
可以使用 pin add 手动钉住一个文件,如:
" O" i4 X. q1 s; c$ U; D! }; w- Q; M( ?8 [1 ^4 a4 f# m: p
> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
$ F) t; _7 S$ j- @1 V3 @2 M" @0 A0 I- C$ m3 w9 c8 {
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively
: P, b4 Y+ N! S9 X9 w; i* Z9 E  W( J
如果要删除pin的状态,使用pin rm , 如:+ V4 V7 I1 m  N' ]/ Z. z# O1 y7 j
: Q. |& ?3 ?2 q5 I! |
> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
+ |3 A. D9 g# a' |( ?
! ?& }+ U. N; b2 @9 w2 }5 V( y' ?unpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
, i2 W- Q0 b0 w/ {, ?* i
, m3 e8 s6 a7 u, K1 wpin rm 的参数 -r 表示递归的删除pin 状态,对于没有pin住的文件, 如果执行GC操作 ipfs repo gc 文件会被删除。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    2