Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
IPFS 安装
1 X) n/ K* r7 k& A
4 g- k4 c& Z) n* O4 S0 R要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。
5 ~+ t- D/ ?3 X8 J, g7 ]8 s/ C- z+ a  F$ `% y# N6 G. P
对于Mac OS X 及 Linux 平台,使用一下命令进行安装:
/ F8 Z3 u1 V: N  J# p9 k
5 T  H: o- z9 U$ K6 t0 e  h$ tar xvfz go-ipfs.tar.gz
7 f; A- z! }. b7 o" h# H- S4 p. t7 S
  m/ b7 ]# {8 U$ z- \! e0 H8 \, K$ cd go-ipfs( d  k' Z3 \% h3 ?1 f( {! {
; {, A4 d, w% M
$ ./install.sh9 R: u5 ]) _' x6 }) n; r! U# P  p8 j

! R1 p3 Z) [+ h上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。
- |) ]! q3 m; ^0 m3 {
6 e4 d+ {2 S# N7 u* I, z在Windows平台也是类似,把ipfs.exe移动到环境变量%PATH%指定的目录下。
+ M1 q/ h. Q# h: q! q, m# U* L2 _2 Z8 w" @1 x  V
IPFS 基本用法
) f( ?  p: N* E
. F$ ]: d2 y) ^/ ~- [: q' ~$ I5 iIPFS初始化
% Y: B5 A2 F  r, R( }5 @. k0 @
2 x: U4 N/ g; d) E9 {( Q2 F安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化" k! U* @: b5 u' d

# D2 L; ^$ M8 v% I% P; }9 H> ipfs init
; d8 W# X" w1 l; F
3 @) L; k2 U- |, P7 `initializing ipfs node at /Users/Emmett/.ipfs+ z& @) W7 a7 x+ O. a4 ?: n
$ l5 g3 c) a4 V/ k
generating 2048-bit RSA keypair...done
0 [- F7 R% f  W+ r  J: v8 i( M
5 c6 P/ L, c9 j! J/ epeer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva+ ^4 v% y6 E& ^! a
2 F9 {) |. @3 Z
to get started, enter:! V2 B: Y8 b( n2 b8 x

1 M' W# b. b6 k: t% q" V  ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
8 X6 C) H7 Q" j6 |+ R; \+ j2 O  m
! W5 u) C. A2 e( P" I0 y  n上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:" t+ V6 `7 `' r+ g* \& D+ v8 v) s

7 Y/ f3 o4 j* D$ _/ S生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。
! _6 @4 u5 g5 f. e9 C, S6 q% }! h
, }/ @" a& z1 [9 z" W4 L节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。1 V( Q6 B# I( C- z# j, O1 l2 U
; X  U0 z  `! K  C6 U+ Z( I
在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。2 x( B# [4 O5 t, f7 Z
! F  y' o* N" c8 ]' u
如同步文件数据块放在.ipfs/blocks 目录,秘钥在.ipfs/keystore 目录,ipfs配置文件为:.ipfs/config。) b: L+ _) {# v. @; H" q6 E) R  e; G
& ^/ L0 x, o1 O  C
IPFS 配置修改
) W" I" ^5 ?' |2 g3 P) A  U$ t% M3 |0 `! u6 I- N) @
在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:5 f# n: y- X! F/ b+ k6 W5 b
' a9 u5 H; d! k4 b3 G; g9 f. O
cd ~/.ipfs; m1 P/ R" m5 }% r7 A  k' Z
$ A1 T: Z/ R0 _' o# [. D
export EDITOR=/usr/bin/vim
: f" n0 Y+ k/ c" l6 _4 [3 Q
, `- [4 I+ \& |; p0 {ipfs config edit
( v5 M: R1 z, w! M' b! L8 ?1 o& Z7 ?6 E6 u8 n1 j6 O: K3 }9 d# ~! q
或者直接编辑 ~/.ipfs/config 文件。
9 B$ ^9 _0 X6 c. y, c! ~$ p) l! F) O& y* ~- I
上传文件到IPFS: n; q' C! ]6 B6 I* k, R* L

* W" e+ c* J* W- g0 S# A7 D/ K我们先创建一个upchain.pro.txt文件,可以使用如下方式:
) S/ L* D' ]6 W' [) \3 E+ x4 q3 F' ~( O. s. b1 p8 P* M8 b
> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt
$ w1 D; H3 d" ]8 X8 j0 e. ]
7 b& U1 H1 C9 L3 D5 F1 k% S2 [ipfs 使用add 命令来添加内容到节点中,  在命令行输入:% z& W  n( Q# L( V2 |. `  G& o, V% q

0 |2 \. P/ ?4 X> ipfs add upchain.pro.txt
7 J4 l; _! h$ z% r
+ L/ q: b' R/ ]$ o7 Yadded QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt
# Y6 S& E' t9 v5 N8 a! B( F" o8 {0 |* a$ I' c  s! \' b
43 B / 43 B [=====================================================] 100%
9 ?2 G0 ?& f) ~) n" J: m  _  G. E) N5 K
当它文件添加到节点时,会为文件生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 查看文件的内容:
/ ~! z. U* `% R/ c8 E
% l4 A4 E; S0 Z> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
- [; f" J7 ~* A& P+ K/ O3 M4 X
/ R! i6 R8 p( [; a! x% g+ I) J. J+ V+ T( X5 E: c& z
注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:# L: g( I9 k! [) G
. H# G) o- X; ^
> ipfs daemon
) r. v" j5 _$ f) f
# r" j3 u! V- h; W: f8 o* iInitializing daemon...2 o, U$ T5 t6 r: E+ T) _1 |5 m  K
! l7 l7 ^- L; ]$ k  L. h
go-ipfs version: 0.4.18-
. G7 C$ U3 o, W7 W; k" D- _' N+ k# X+ Z- T: O
Repo version: 7
. y% ^# v9 G4 s1 y
$ w* H" \. K- N* t! i; ]5 xSystem version: amd64/darwin
* ]0 V9 y! y# v: C. ^$ K% C) l- L7 s/ a7 y6 R; [4 _9 @/ N* l0 j
Golang version: go1.11.1
0 e; Y' w- X7 I; Y
) e# D/ z" J! ~5 hSwarm listening on /ip4/127.0.0.1/tcp/4001
/ p$ b7 O2 X: g! a9 d% ~+ \+ `) r; U3 u
Swarm listening on /ip4/192.168.8.105/tcp/40015 i6 ^7 i4 P; k5 g
. ]* o0 r" ]( q' B7 |* a
Swarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/40014 ]  J! Y$ p6 k& G" T- h
5 u) M+ g1 T, X. C3 l$ n& }8 o
Swarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
# `8 b2 F" E- K) n, X5 b4 g4 U  d  Y* V# D5 m
Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
  q( t; L4 X* d3 N0 |
: F" ~" A0 _9 g3 JSwarm listening on /ip6/::1/tcp/4001! b, E" J( Z7 q& S6 Q8 Q! Y
4 u5 P$ c. k% P
Swarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
' @) h4 I8 l9 z5 Q/ ?6 T" x: g# x6 Y
Swarm listening on /p2p-circuit- |9 j" b5 G$ c  R5 h4 S0 Q; U
' w2 \  r. a7 ]+ Z- E! I2 b
Swarm announcing /ip4/127.0.0.1/tcp/40017 G9 `- W$ O' S/ a7 K
0 M1 M4 J5 ~. Q& ]
Swarm announcing /ip4/192.168.8.105/tcp/4001
: e' [! @. A( h* E
6 n6 i- b( l5 kSwarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001! g7 U$ Q- S9 S6 |8 i- w1 T0 q
1 h/ w' b5 V/ y8 P9 ?2 g8 t
Swarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
+ r8 S4 B; q1 r; f  ?$ [" E! p; U
Swarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
; A0 E+ j" [3 k' ?! z0 C- `3 n' }% U) Y8 X( t# T! o- `
Swarm announcing /ip6/::1/tcp/4001
$ q$ t0 I, f/ ^& J9 e: U/ [% g3 h
; m, @9 E( D+ g5 C: L4 u* F6 `Swarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/40015 x8 L7 x  z" D

; }( g, B: }+ s. j3 {& FAPI server listening on /ip4/127.0.0.1/tcp/5001
" d- a3 ]% J- j% S! ~- Q4 e
9 L- ^2 H8 t: B& sGateway (readonly) server listening on /ip4/127.0.0.1/tcp/80809 O% ^/ e  S. D2 d0 i- o* i9 O
) l; l9 O' V$ f! I! h6 c* F: u
Daemon is ready! \: D9 d- p0 f

% \4 ~, s& F; k+ p开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:, l5 x! C. q& E
9 q) r/ b% Z2 p8 j2 ^& K4 m
API服务,默认在5001端口,可以通过 http://localhost:5001/webui 进行访问,界面如:5 s3 M( ^6 j/ l1 s3 I3 o8 w
- b" @" W) D& B3 x8 N9 t( @
这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。
! Y$ Z6 Z5 g" e7 M0 B& @' G) q1 C: Z- I2 x
网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。2 k) I# o; x$ _% p& A- z8 r

0 l$ z% ]* J7 m  u) I) Oipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。2 |' A% C2 x" P2 f0 J# e9 S

3 w9 U7 t, M/ X9 w1 D% @! X- V% |上传目录到IPFS* H, c3 f8 Q' w' j2 q) L# a6 r/ g6 b, L
: }% C# p. j+ n( k/ Z  M
我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。
" o  {$ g$ m! [" g7 Y  `4 u6 R1 r/ v: t5 d, l5 U  U& J' Q  }0 B# e' y" B
> mkdir upchain) O0 Z0 _- I+ [7 t
/ ~6 C4 R8 E/ R7 E
> mv upchain.pro.txt  upchain
" ^: k$ T/ U: {% M' x$ j0 |
+ }$ b5 u& r% f. h上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下:
. h; e; i0 P  u3 R, ]3 Q% `* c  F% x* F9 y" q5 z
> ipfs add -r upchain1 f' o' R1 r7 Y
1 N6 G, E* q  O# x) [# }$ a
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt2 v9 s% i$ f6 X

& S+ d$ S/ X8 K# q2 D) Y; _4 Uadded QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain' S3 [$ Z8 m! K8 ~0 o) j

* C% M) Q. u8 t" `0 a( z! j3 m43 B / 43 B [===========================================================================] 100.00%5 Y, V7 W/ j8 A3 H4 _. f
- Q0 g0 W: A* j8 s! J8 u4 _5 Q: D
在上传时文件夹,文件夹也会生成一个对应的hash,可以通过hash后接文件名来进行访问, 如:, j) S6 `9 g# y( R- `1 F

8 [- N: e5 c# N% z, R1 U+ `>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt9 X. w5 D8 v8 u4 ^

+ Y$ O5 u2 j5 L6 P/ V# h- M0 q
( z( k8 l# k. U1 e1 m) `7 n  F在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。9 }. ]# Q! M4 a+ C# V6 q4 m3 M
& D8 }; H  w+ x8 Q& T& t4 j2 f, a2 q
通过上传目录的方式,可以把整个静态网站的根目录上传到IPFS网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:
! i& \' r# A6 d% J
' l' y/ R! V9 Y/ A: |3 n  Thttps://ipfs.io/ipfs/QmaFWgfpRNz ... uCphq2ua/index.html- S6 Q$ v) P( A: y& w  u0 k: @

! {0 N9 O+ `- K使用IPNS解决文件更新问题
1 b: z7 J4 J2 }
) \- L3 {2 F( _) W$ w6 N9 n4 s4 \因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。
# R. I" I: b" a
) V( L* n6 V" B  J8 L例如把upchain.pro.txt发布到节点,使用下面的命令:. {$ g. Y( x2 l) T  W6 |
2 ^6 Z) ]0 x5 G
> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
/ l2 R% S1 w# t3 o6 q( c6 U. S, _7 k2 e7 _3 |# x
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi% S, G$ @% @# ^9 ^: R8 T

/ D$ g+ G2 F/ B' U" X命令中的QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi是upchain.pro.txt的hash, 命令提示中的QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva是当前节点id(大家可以回看一个前面ipfs init 的输出)。1 I- Q3 l$ [3 |) f+ q: Z

: M& U+ D8 \. A, z; i发布之后就可以使用http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva 或 https://ipfs.io/ipns/QmYM36s4ut2 ... VvmDU7xKUiVeswBuTva 来访问upchain.pro.txt的内容,如图:
5 J. d% q# t' m. X
4 ^. I4 A9 I0 y其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。
$ ?  e" e$ u2 G
$ G& A3 {' A- ~8 h' z现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”6 z* o1 c, J- n$ o* b

1 ?* u0 U5 o$ p3 N- G" y> echo "创办人:Tiny熊" >>  upchain.pro.txt* u  x# g& `# k9 y

3 ?$ ~' r5 u3 k  f$ W- F" K4 G> ipfs add upchain.pro.txt
! ^% g2 Y4 B/ j! M7 a3 g
% M3 s" I+ E' c7 sadded QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt
8 K7 a% v1 U! o3 e0 t4 L- Q! C5 l
63 B / 63 B [=============================================================] 100.00%
" g9 J0 @# t' k7 v- ~: |* \# C) D; ^; w. T( T
重新发布一下:9 M& L7 X6 _8 |6 E! I) i/ g, h
- c/ @4 Q: G! _, ~& T& v  W
> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S" E5 d* [# y$ P" F6 [9 M6 h, [; C

, d8 L' V2 `- U$ q* \Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S0 [4 ?" _0 _$ c' y1 S

8 U2 }( |, Q' W1 K再次访问 http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva (这个链接和上面的链接一样)可以看到内容更新了。4 x8 ~% k  K; K5 |/ J
/ y4 i4 _& h  T& g. N
如果我们要查询 节点id 指向的hash 可以使用 ipfs name resolve  进行查询:
7 D  h/ ^  v) D1 f1 C* J1 m: K8 p7 i; e6 S8 w$ l
> ipfs name resolve
; Z/ J3 U% F( ]6 V" C1 i
4 p6 |  i1 a, f& n/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5
$ x) e4 n" ]1 r4 T) _
' P0 E5 t9 C# Q3 R0 v有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。
, }: D% a' V+ d8 C% A7 l. i% H, s5 j7 k, [: O- ]+ T
如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:
  ~6 }, l% Z0 t5 B- B, d
6 m* c2 N' \  y# {> ipfs key gen --type=rsa --size=2048 mykey
; c( y3 |. q9 N8 ]" E
, O# U  Z6 a1 JQmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
$ X( C: A+ V3 S  ^" l# J0 K
$ {4 Z% T+ Q1 M> ipfs name publish --key=mykey  hashxxx
; u; f! N; p, q( U- m  j0 T% Q! r+ R# Z" l$ b
Pinning# }: D  ~# K' X9 A4 \1 Q4 O; g$ S

% v) x! F% G9 ^) t0 O' C% X! aPinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。& F+ y8 l. M6 [- [

& M* s0 |; Z/ @+ ?! b2 _- K当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),7 ]3 O/ A8 r* R# S- i

' Q) g% q9 G4 a0 ^1 o+ VIPFS 提供了pin命令进行Pinning操作, 比如我们查询下某一个hash 是否被pin:
* i. n+ J" u9 K' w$ E; A8 \9 G5 B& z2 f* J% @( i5 U; V
> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S/ v( f7 Q" ?8 x- t, x7 S

6 r7 [! T1 \8 b( Y) A5 Z, hQmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive
4 H1 t; W- t; d( G* I; X
8 [3 e' g) J* a7 [, C  T" |> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
$ A; p( p$ k! Q# m) i  F0 y3 Z# i' |5 K
Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned
: e% E* z$ d& V5 a; p* j9 p( c4 _# y) e% s7 C: M
可以使用 pin add 手动钉住一个文件,如:
: O3 d8 a+ N+ ]1 {( G+ ?  Q" r7 O7 T- H, J4 G" l
> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
5 P5 V' l8 W' J" }' O& ^: g, P7 n  V" A7 h8 t3 u( k4 }$ F
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively
7 c+ q) t; I& ~% ?# v( r: {, ~3 W3 r8 O8 B
如果要删除pin的状态,使用pin rm , 如:% h1 x2 F3 T- t2 _+ |: Z
& m$ O5 n% U4 W8 d! h% E
> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
7 c8 u8 h* q* L+ @+ H
; Z& ^& ~: X3 E: l0 u) f& J3 j& Punpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK74 m: p9 Y% N) l, s

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

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    2