Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
IPFS 安装
5 g2 ~5 S7 ^1 j# P# _# Y+ N" a* w$ S! ]+ t% p, q& M6 l/ P& B" ?1 w
要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。0 m  C" |: d8 Y+ L
) g4 P% s1 }# B. u. P+ q
对于Mac OS X 及 Linux 平台,使用一下命令进行安装:' V8 y- z; e+ B3 o1 n: D: w$ t( S" ?

' p2 j) |2 ?8 o) F: O$ tar xvfz go-ipfs.tar.gz; Q2 ^+ C/ Y# v! g

. O. d% a7 q! g5 a) m' ~4 m7 g$ cd go-ipfs2 T7 @7 {; j* v& Z
* a: s& W% H* M- v# c
$ ./install.sh
& r" i( v0 f1 n- F* y% G) `% z6 b! Z
上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。) K7 r! |: }0 e3 h, e* w* _) H% ~. n

3 u# p+ N' W" p在Windows平台也是类似,把ipfs.exe移动到环境变量%PATH%指定的目录下。+ U  m* B; a, x" }6 l+ s
. t9 x9 O: j; a( e  ~5 U. {1 Y
IPFS 基本用法
+ o0 o+ {; }" \/ y" d- J2 {. k5 F0 @8 O; ~
IPFS初始化& b: A( y$ D2 g+ N! h& x" N

$ s2 k- \  i& _# B$ [/ S3 C安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化; Z* R8 w- o2 j* d! g, g% j
( g* C- w- y) D  |
> ipfs init
+ u+ S3 u3 B8 }! Q' P9 \0 H" J/ x! {) C# x' @
initializing ipfs node at /Users/Emmett/.ipfs5 Z0 o8 Z- I" n" K7 `
' w; A7 _: s9 n/ X0 x2 P. V, G8 F7 V
generating 2048-bit RSA keypair...done8 Y1 D' q  X8 b  I2 K! E. R

# C) c# Q# C& L/ ypeer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva( K4 t4 U9 H) M1 I; m

! e, w+ O, n4 f# E( l+ g; h. jto get started, enter:
4 [& L. J2 }5 G( G3 D( z1 L3 o) R" [1 e3 f: }5 B* X' v
  ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme7 @- t/ |3 N) u! A$ B8 }
" J9 h( d- K" [/ S4 }6 {
上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:2 l) r1 S1 F  S- P: v% n

# `3 M% F- ~! g) R4 K: f# e" J生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。
% n. g5 ^* [1 p0 g0 F$ j+ e  V# J6 V# C& I0 G' K
节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。
* z) D4 ?5 \1 I6 ?8 Q5 W( }8 k& Z, X+ M9 M8 S$ P
在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。
: B5 w0 _; P0 ~$ q
4 P# R+ [+ d0 _+ o  w4 ~: J5 C* Y, x如同步文件数据块放在.ipfs/blocks 目录,秘钥在.ipfs/keystore 目录,ipfs配置文件为:.ipfs/config。  D# z( d+ @8 J' ~& f; Z
6 i% D7 k6 m; t0 M" g! q6 Q
IPFS 配置修改2 K" o$ O# `0 K) T; @

" q  e+ I; P. X8 P3 F在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:
/ S# J6 u$ \5 Y  U' G1 {6 ]/ t' Z8 P  C
cd ~/.ipfs9 R+ i" X/ g2 S. W) F
; _, k( k, w5 o  a' l7 R
export EDITOR=/usr/bin/vim8 A6 s) b0 w% k! Y1 e% p$ r4 b+ R

: x9 M- N3 m% Q, U. `# Y4 U& |/ eipfs config edit% R: q9 C$ ^( E# t. |! k3 ?* E

% ]' F: q: Y6 W$ C0 y* Z1 j# F或者直接编辑 ~/.ipfs/config 文件。
; n) F  a( O- O* X' _7 a
1 j( J  ?  ^9 I上传文件到IPFS8 a- k' u9 b9 s( ~

  D7 |9 }6 v$ z- V  t/ I我们先创建一个upchain.pro.txt文件,可以使用如下方式:4 A5 [# y8 M  W
" m2 F2 o6 F& n$ y
> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt
5 f; |. W5 R1 u6 ^
3 p7 p2 u6 b2 K2 s0 e8 m$ A  tipfs 使用add 命令来添加内容到节点中,  在命令行输入:: n) ]9 U2 B6 U  R) N: W. J
2 Z+ I7 t9 [9 q4 E( U
> ipfs add upchain.pro.txt/ t- Z& j, }" t" i9 F7 V1 C
! a. k- Z, ]* M* p) z2 O
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt4 P* W3 P3 h& X) Y5 H3 n$ s* B
2 Y! m& L" B4 F" \
43 B / 43 B [=====================================================] 100%
# K& [% ~3 u6 B  N
" X3 c" x( Z! X+ l8 V, K3 l当它文件添加到节点时,会为文件生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 查看文件的内容:
' S( [- I8 C( i4 _5 m0 H5 b' R5 x7 O( C8 {$ B# O' m$ N4 ]7 @
> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi8 N4 \6 j! ]' w" ?* |: S

9 {* @3 V$ \; ]5 J0 T& u* Y4 k' C) ?0 I/ T1 G
注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:
5 Q  F6 a5 s# X) l4 Q  y$ o% V1 {0 N
> ipfs daemon
4 H: ]5 w  T1 S2 ~6 b3 g( D+ t- n0 ~: t0 B  C5 B
Initializing daemon...
5 E  _; @* j- y6 J1 ~6 Y5 {; ]8 K. A9 C
go-ipfs version: 0.4.18-1 D1 G: Q' ?$ V- _8 }# z
% r+ R: d- W) ]; x; L/ h& c
Repo version: 7
) \4 H" m5 d. X4 U0 F! y' D5 t7 c- o' I* q
System version: amd64/darwin, e7 m5 k8 c3 Y9 W0 F, r: z

9 _5 ]8 R3 I8 f) R$ ~6 @Golang version: go1.11.17 s3 M3 d3 `7 r
! u, c, o2 h6 ~5 d8 c
Swarm listening on /ip4/127.0.0.1/tcp/4001& f. l3 I( |+ Y7 j6 n
) o1 C+ \8 b/ o9 f
Swarm listening on /ip4/192.168.8.105/tcp/4001
) _. p7 f- }9 Y; u! f: Z
- Q6 ?: C! ]/ z, mSwarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001
7 ~1 h0 y/ v  Z: ]; P7 K& S7 R" E& R# k/ W7 d
Swarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001* U7 a1 n2 o; P" r; q/ E

$ a! M8 U; H4 @Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/40014 N. H& R1 d" h0 a
7 k: t4 K- d- K* z- z# H  `, h/ ?: s
Swarm listening on /ip6/::1/tcp/40011 N, N: u  \5 r- w) F) J
5 b; J. h0 {( t, l  B( N
Swarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001- A& I% r4 v5 d" V  @+ {5 G
* t9 ~7 ?0 w  Y$ B1 Y
Swarm listening on /p2p-circuit( r9 b) _; q3 C* ~  u5 v
0 L$ N) \3 m! @0 u) i2 b4 _
Swarm announcing /ip4/127.0.0.1/tcp/4001% ?1 _9 m9 L) Z- }2 l
& v/ b* c) ^* h7 S) S$ |/ a
Swarm announcing /ip4/192.168.8.105/tcp/4001
3 ?3 R0 i' m$ c' i5 W7 `" {; Z8 x5 S; f1 {
Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001
$ f( }( o  H3 P; i% P2 L" [) s
9 Z( d' M0 b9 R+ mSwarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001& @. S; e' `( w; x7 q

' J9 J9 c. z3 A: n# DSwarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
* `0 |# O! W0 M$ `5 e" b2 A: E; Y2 D4 _
Swarm announcing /ip6/::1/tcp/40011 r9 ?/ B9 E8 z% j% L

4 M  u' s# H# W6 v/ l% F6 kSwarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001* R( Z7 i% e& i" \6 @

2 B; ]1 N# ~% E7 |  ], IAPI server listening on /ip4/127.0.0.1/tcp/5001+ i! a& ]3 j! Q$ K
2 m( U: S; t, X8 r6 J
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
9 D: b  R& G8 @; W9 @1 k+ t4 f# t+ H8 [- ~
Daemon is ready5 D5 J2 ?% G9 K: k, b
0 `. m1 e. i3 ], Q, ^0 \4 L
开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:
% Q5 M' t" I) O$ F/ o& y! f5 q4 Y8 a! y0 m2 V, ?
API服务,默认在5001端口,可以通过 http://localhost:5001/webui 进行访问,界面如:* B8 l  A$ y! R- \( H

" u+ \! P/ k- j! E; ~2 x/ S这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。& M; D0 K, ?3 ^2 u+ C

% g% D7 T6 G3 [7 p6 f网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。
! }0 W6 V% x& [0 ^# v1 `. o' T, ?7 L( K, [) w! }8 `
ipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。
# ]" }1 _* Z; f0 r2 g# ]5 J" @4 y' E. W
上传目录到IPFS! `+ m3 v# H8 o6 m# Y) D5 Y
4 X* a$ I6 @9 {' @7 P: z
我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。
4 w6 w1 S3 Z5 `+ d6 Z, S8 \* g9 v2 Z6 W& S  R  m
> mkdir upchain& j( a/ d# \  a, A( U/ B

- N  ]" e5 M( b9 [- u0 R> mv upchain.pro.txt  upchain3 q' U% h: _- a( e+ `9 V, w

! p" }# k8 B+ w, ?上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下:
* c7 P, C, ~9 p, s, T# q0 ]8 m3 ~; W+ N6 ?! ^' A  m
> ipfs add -r upchain5 W" m  h+ Z& i
4 N# s: Q. H$ ]
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt) q. r# o7 Y7 R6 W- }6 d/ T4 P
4 Q7 j0 Q, z, n
added QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain
; U/ g4 E# [: J, f3 g0 t, r2 y8 p' @  q: G6 q
43 B / 43 B [===========================================================================] 100.00%5 |- I6 _: H0 \- b3 N

) N2 V% }/ P! D4 F$ ?在上传时文件夹,文件夹也会生成一个对应的hash,可以通过hash后接文件名来进行访问, 如:
" w8 ?% S0 N1 W2 a, L5 Z* i  j
' P# Q1 A% Q- O; [0 r; o>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt* P& Z6 L+ _) a+ }; r4 C
) ?% ?/ a( o2 j+ o3 W2 V* d
0 o4 f8 T  z+ ?: a" N0 s: `; F
在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。) ?5 P& U, Z4 u0 |
1 T, |1 ~8 e6 z3 c
通过上传目录的方式,可以把整个静态网站的根目录上传到IPFS网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:9 Q4 _' i: F5 H. a
7 l" q: ^$ R. u! Z- t% y, K  o
https://ipfs.io/ipfs/QmaFWgfpRNz ... uCphq2ua/index.html
, Z5 Z6 C% ?! R1 F- P: j
! E6 j% @3 ?& j* H* h使用IPNS解决文件更新问题9 Y2 e: j4 C0 {
  a1 k# O$ k" b- Z' F
因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。5 P5 h4 u7 W3 |* |5 P, _
: z0 ]2 d' e  F: b; z# R) x- O6 P
例如把upchain.pro.txt发布到节点,使用下面的命令:
( T+ f* q/ e- i! _- R5 x
7 Q8 n8 u% S3 |  G> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
* G% l* T3 c1 p; U: a# f
5 e$ R& Q, X9 z7 y4 P! BPublished to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
  Z6 v* F! S4 {/ y  n' v5 e0 ~7 I8 `% `1 F9 v
命令中的QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi是upchain.pro.txt的hash, 命令提示中的QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva是当前节点id(大家可以回看一个前面ipfs init 的输出)。8 e( g/ W- N: M* _* Z
) |' f- N7 Y' l# a# X+ `7 M
发布之后就可以使用http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva 或 https://ipfs.io/ipns/QmYM36s4ut2 ... VvmDU7xKUiVeswBuTva 来访问upchain.pro.txt的内容,如图:
1 A' @8 h3 d; n* r
0 D: Z* R& a8 z$ V5 I1 U其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。9 M. S- R0 E- F$ q2 e5 n5 j5 U( m/ Y
3 y: |1 _5 z1 v7 @: ~6 w
现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”0 t! X0 ^- N+ W  p, U) C3 x
; t/ X# h6 M8 e% q) m# b3 a9 E
> echo "创办人:Tiny熊" >>  upchain.pro.txt# o6 F; N/ C" I) t: ~; H% v& O
9 L: ^" o5 n% n/ k5 o: \
> ipfs add upchain.pro.txt
4 A! j1 \  A' L4 X! l" p$ t- D" y, K0 @# }: V6 p3 O
added QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt
+ P: `" W/ ]' ~% K: H, e
# s8 I1 U& b' Q; k$ l& _63 B / 63 B [=============================================================] 100.00%
! E1 t5 F% M$ y/ X3 r. x. u! Y1 N) c% }) A( F
重新发布一下:
& K3 v/ l5 X4 ~  y7 Q9 Z
8 |2 v  f1 D/ D> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S0 i) Q4 z3 S) w  i# g. r2 n: n3 Q) X

4 ]) C9 u* q( fPublished to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
3 y, {# P' \, Y5 W' ]9 B) n# k4 Z6 Q/ `6 D! ?
再次访问 http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva (这个链接和上面的链接一样)可以看到内容更新了。
+ d- |% q% f/ c! h9 G7 Q6 k
( v" Q- v8 Z( r' |如果我们要查询 节点id 指向的hash 可以使用 ipfs name resolve  进行查询:
8 ~7 V2 P+ g7 K7 R7 T$ \8 {$ i
7 @, D2 v9 s3 R8 ?> ipfs name resolve3 j( D: o" K" y- l, u2 U
9 l! R# s. }7 N& ]5 B
/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ57 o5 B/ Q, a4 u$ v$ `( ~) A  g

- Z2 t$ C% p/ ~有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。3 y* z+ S' p2 m7 }1 v0 F  z2 G
" V7 L( \0 o! k) }* E8 a
如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:% P) T9 q; A* h+ c
0 y4 u2 E( q' O1 u4 r& \- c2 d0 v
> ipfs key gen --type=rsa --size=2048 mykey
7 v5 J, d# q) y/ X; t$ u
& x' C0 [6 B9 C/ O" }3 BQmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg, X2 w1 `- Z* C) M# |# v
3 b% U) C9 ^9 i: P; k5 ]- Q1 {
> ipfs name publish --key=mykey  hashxxx
( X6 f& S) c/ h7 t, Q" O3 ~3 }
+ d6 L( N( B& L: ?5 WPinning
$ H5 n7 q" I& X
7 X% e5 q0 u* q% A" ~Pinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。, I3 F# h7 t3 @

" o" P/ W0 K- J0 ^: |4 G0 s当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),, C4 H1 c' }% A& Q9 V
! v& m; m% e4 z" m( C, o* J. _
IPFS 提供了pin命令进行Pinning操作, 比如我们查询下某一个hash 是否被pin:
5 i6 w7 |3 [8 S( K; h
2 P% V9 ~( W8 {! O% `2 e> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S+ f- L$ K* K) f$ @$ F( l1 ^' e( G
$ r9 ]( e6 I7 a% E+ @; ~/ ~* h  h
QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive
* u7 |- Z: U2 s5 D& ^9 Q8 f" U
; l  r2 p- A' c0 G) s9 j6 N> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7- u# ^- |1 ?% Q6 _8 W

# ^! Z( C* A/ z( j7 w: R' H5 G$ ^( lError: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned
$ |# i6 t* n% {( f) g' Y& ?* l9 P% a9 q; X1 g4 [1 x% e. f
可以使用 pin add 手动钉住一个文件,如:( o5 Y9 b& b2 b" E5 _# a' ^) s$ K
( z$ I  ~% }& r+ I9 ^
> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
8 `* S- o0 {- |8 g& W- \* M; x# J$ p7 |- Z7 U
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively
/ [! Y. b6 s* S1 L+ F' i
8 N; i5 u# L& Z5 \: x( P如果要删除pin的状态,使用pin rm , 如:- R" A, K& |5 r1 G
! b3 X1 }) [1 K" e. J
> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7: y( D( _: c: \7 L

" T9 r* |+ ~8 ~, A6 n3 _unpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' x( {, E0 [* k! G9 M& X& @: g

; i, L( Y, v' Y: J, w7 lpin rm 的参数 -r 表示递归的删除pin 状态,对于没有pin住的文件, 如果执行GC操作 ipfs repo gc 文件会被删除。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    2