Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
IPFS 安装
5 ^) _  q6 {$ t" P
! u8 A/ D3 R& Y要使用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

& m" y- q. h: w8 |$ cd go-ipfs# x, P5 M  S  N( b% l
" _7 ?5 Y! Z# Q
$ ./install.sh( E5 _9 ~& v- B+ }( F( Z( A

2 ~  F& Y  ~; [8 L/ V- t上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。
( `0 t% y% ~0 ]$ 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 基本用法
# J7 k8 h9 D. I0 i  k* J  H, s/ A  [5 i
IPFS初始化* j. Y+ f8 t3 {5 r1 F3 D' N

1 {9 k5 T" ~+ q安装完成之后,要使用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 |

: r. V3 L* @; A9 p  linitializing ipfs node at /Users/Emmett/.ipfs9 v7 s* h: ~" P( z- w/ y6 x7 C6 ~

4 y3 f' P  `/ Agenerating 2048-bit RSA keypair...done
# A/ {( W7 m2 B* F
/ V: j' A1 b( C, v1 a% b/ @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

+ Y( A0 d9 o) o0 O: ^+ L  ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
8 T* ?/ J; R, o5 p2 T) ^, 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值。
* S# q" h! k, r4 \! Y: J; t1 ^0 {
节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。
4 ?: O' W9 t  m3 g6 |4 N7 V
$ d( H0 ^" b  }+ V1 I在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。$ a/ b; {- K. q

8 k, [1 x  G( f7 g/ y$ J如同步文件数据块放在.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

( w2 P& v$ w. O2 `3 q3 tcd ~/.ipfs
% k9 u  c" t, C3 _5 P2 w" A
% i3 S/ S) a/ e$ r! I# F# s2 w, A' Uexport 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

/ x% T$ n! K" [! A1 \5 P上传文件到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

) y) ~3 L% X4 v1 M9 ?( 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
7 s  Q+ y6 \% s: G
2 ~2 U% n; E" t3 @added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt
  O- E- ^- F. m" s* V8 |" P% ?' w3 I. W' e0 }* e7 N8 f" A
43 B / 43 B [=====================================================] 100%
* _. a% T$ @. k4 E$ u
1 W3 d3 k9 n) W( I: i1 Y当它文件添加到节点时,会为文件生成唯一的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

5 P2 h9 K3 z# d( q> ipfs daemon
  ?+ n/ _4 \2 {6 g3 s# V/ l0 S" U* w$ s0 f( e# X. t2 {) a: V# H
Initializing daemon...
/ u( M5 w) w: X: o' g% z2 N9 V7 a- O/ f4 C+ W' b! e2 Y" Q
go-ipfs version: 0.4.18-& o8 ?! I: K8 w2 v2 x+ F

" i) Z5 M/ ?. }3 y0 A- `Repo version: 7! u' r0 c. M$ t7 Z, `

8 X& ?, j: u( k6 tSystem version: amd64/darwin
9 o) @  |7 L9 J, A) c, H" M% B) \2 o, W9 t! i
Golang version: go1.11.1# h, F1 D3 e8 z: }8 q6 D" H4 h

- i' j$ s+ C" i, p3 HSwarm listening on /ip4/127.0.0.1/tcp/4001$ i0 a. f% {4 v. e" ]% S* d6 R9 s

6 ~! _+ n4 P& P$ s9 E* fSwarm listening on /ip4/192.168.8.105/tcp/40013 l) {% Y( U( |& M- k. x- B4 l

/ f1 K- {/ P% n4 d+ `Swarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001
9 t! w! Z, E- J; v" ]1 r9 n
5 J; ]' i" Z) i7 W" @Swarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
* d' g6 i$ w+ X  s
$ s. ?4 a: _1 u" fSwarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
) \( h* L: |( I6 K; ]( x, e" c; H! W0 X6 p3 C
Swarm listening on /ip6/::1/tcp/4001
8 c' @% h% O' H4 v. r% n, s
* o* i: d) [% V; n, \6 _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
. o. P1 w' z2 C9 Y' ~! U- g, q5 t
( @: ~. H4 Y2 _  I( T; ~Swarm announcing /ip4/127.0.0.1/tcp/4001
4 V! [% l5 x9 O5 }9 u' P8 r( J" D' X. l7 B: h( n  b# R
Swarm announcing /ip4/192.168.8.105/tcp/4001
2 Q% \. X& A" [% t5 |3 F0 s2 G! S6 M
Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/40013 j9 ^: G& A, g

! V/ D$ N- r' O; n, QSwarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
% H: y: |/ |% ~+ O! W' z
6 n; A; K1 W3 j( z. r1 a, aSwarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
: f  a7 N* T* P& I7 t! [! |( O. X3 q; G+ N: {/ @. q
Swarm announcing /ip6/::1/tcp/4001
4 N0 ]1 R: v/ I" a) a* x" ]. V
Swarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001( b7 S: \, I% |1 v3 a

! x! x/ e7 m% V3 X$ n2 u7 fAPI server listening on /ip4/127.0.0.1/tcp/5001+ M7 w2 D  D* `, `" H# A

+ {# c4 Y' _# s8 g  aGateway (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

, r! e/ g; t* J  E2 ]开启 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

" t; R' s2 p% V- b这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。! x" t' f4 p! N) N0 B* i

/ \' l& A' ~  y% ~6 _3 e网关服务,默认在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 的文件。
* r" N1 |. u: g: Y2 ?  R- g/ l- f$ s% [) f0 i  a! R- I
上传目录到IPFS9 K1 B7 z7 s$ C8 u# n' m

6 Y- J% [6 }5 f& W3 o1 F( Z/ h- j我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。
7 K4 F, L* Q% U2 z( s' g8 S7 x3 C% p& f
> mkdir upchain# |6 t8 o0 j( I& E

% _8 Y& m' O# ?+ w2 f5 m> mv upchain.pro.txt  upchain
4 R6 z- }' n/ ~! T) x, @) `
- q& @# B5 s8 x# r. @/ l上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下:- I! ]/ E# l- |

" b+ K. {$ ]3 l' U: H9 O8 e' J* {> ipfs add -r upchain1 Q" i( y8 Y5 e; p9 r8 p

" [' q8 [; _+ K1 }) i- Q# R' tadded QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt
) \7 T# X; E, `: s# m( m
( k; @* s" E' r" @5 ]5 ?, [# iadded QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain
6 B) m  Z4 n& X. T# L$ h# m
0 {5 C2 N: V0 e, e43 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
1 f3 P# T3 F  m# p# b+ w& F/ ^8 t
- f" Z8 X+ L. X
在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。
$ F5 f4 L9 ^& M$ ]& ~4 w- 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
- c7 r  ^* M& T/ T- ^1 b: V$ I0 D$ Y- j5 @2 Q" P% U3 D/ ^
使用IPNS解决文件更新问题  a% t7 G3 R! U

  U$ A" V9 U4 r/ }8 x! e# c. u. g因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。
# K2 [- T; b3 R0 p' X
4 J$ u8 I2 G  W& \+ J" q例如把upchain.pro.txt发布到节点,使用下面的命令:2 U, q) p6 M8 {/ x6 B

' W0 P6 x4 \4 i) Q3 T> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
% z$ r/ ^8 y6 l  x* r' |% O5 `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

4 W5 D0 }8 p* G" @* g9 Y发布之后就可以使用http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva 或 https://ipfs.io/ipns/QmYM36s4ut2 ... VvmDU7xKUiVeswBuTva 来访问upchain.pro.txt的内容,如图:9 v9 z+ ]  p0 W% k

' C/ ?0 _5 U8 C8 J! g* r. y% {其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。  F: c( _) T: Y, ~7 o5 A9 n& G
& k. d: C( P+ D
现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”
+ T/ L! D9 m  [) u7 Z- c3 U" q4 P9 w. `% J1 T6 Y* X8 n3 p
> echo "创办人:Tiny熊" >>  upchain.pro.txt1 f( K' ]1 E5 r: k

, g, [7 I7 E5 Q7 i. _: g' Y* ?> ipfs add upchain.pro.txt
0 U+ T7 y7 G( A2 x8 K7 d1 J! ]
$ j4 E9 R2 E! k+ [added QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt
7 R8 V. r+ F2 k5 z! 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 ^
重新发布一下:
. l9 @7 V$ Y* c" r6 d2 v( E9 Y# e  p1 _
> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
/ D0 w8 C6 x0 l# a, l9 ~6 G' Z* X5 }# D
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
8 E; R" x3 L0 Q9 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  进行查询:
. o% a* b* B; ]& E5 B, f) l9 P8 k9 ?) q; @9 [2 x4 B/ G$ I) r8 E( g5 l' T
> ipfs name resolve1 {+ I+ h2 d: z# w; ]! Z

/ K/ g9 }. V7 F$ {$ O! ~3 d/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5
9 j. ^: y/ i! c+ g9 V  T% ?% A1 g; c2 X
有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。
- T3 n, Q9 ]1 e* t2 L+ l2 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
- p- ]7 ?# j8 a" d" U
) C1 N8 f& _/ J' NQmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
7 k; P" W  E$ R, h# i2 c/ E' c8 j: J# m* s/ R! ?/ o
> ipfs name publish --key=mykey  hashxxx
. p2 z# W9 O8 ]* P& e3 f; v  J; D" _9 I6 N: k0 E' T' Y. u. H
Pinning
) ]% N- [' ]6 h& D% q( {& Q. S- L) `
Pinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。
6 ~6 b7 r0 x/ ~/ R& d5 Q4 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:
6 k; T7 {9 J) G
& j, t7 p% n& G( F9 |$ w2 a> 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
1 P" J0 a" ?, L
3 N( T- G6 }+ J. r  `1 D( @Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned
1 w3 N+ A: D, W. H1 ~' J2 q) ^) c( j0 T' Q7 N. ^4 d7 Y( u
可以使用 pin add 手动钉住一个文件,如:
) ?" u, m7 E4 A& W7 l# V5 m6 F
9 e5 \8 U9 {- ~  {& Z4 n> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
. M# {. K* `  z4 ?% @5 b4 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

1 n# i- y% \1 O1 ~! q) X3 {> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
* F9 e# ~$ H' B7 I! p% k
( J# Y8 r' _* X* Tunpinned 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 文件会被删除。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    2