Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
IPFS 安装6 F! x2 n/ e* p5 x: X8 f2 B3 [
9 G( F% Q0 [8 k
要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。/ X8 p1 r8 h# D7 O+ {* z
4 p0 [* Y/ ]$ J" `) k& C' W
对于Mac OS X 及 Linux 平台,使用一下命令进行安装:( d  u% B  o& V% o
5 d' J7 ~/ D; M* T& |
$ tar xvfz go-ipfs.tar.gz
) Z7 \5 t$ z, ~) u" R7 g6 {
6 J/ `, j( Q4 F; w1 u$ cd go-ipfs
- D* Z$ A+ |5 B! c7 [! ~
2 i, r# Q( ?0 ~$ o8 {$ g$ ./install.sh/ t& A7 }9 _/ Z6 M4 e8 y
8 S* O+ Y& Q" L
上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。
- @7 ~2 p) U! ?+ B+ N" _: |) e% U! }0 B& s" t5 Y, y2 o  {' c
在Windows平台也是类似,把ipfs.exe移动到环境变量%PATH%指定的目录下。* Q7 L1 m. S# I' x+ G7 {
; E+ @4 p( q- G5 {8 a/ h
IPFS 基本用法
9 l+ [3 |5 @) P8 q2 }5 |' u0 r& f5 \. g- K) A7 k, \& G
IPFS初始化
& q+ q$ K$ O. y9 V7 Z5 r) K! g( l$ @1 |! C, ]( U& f9 y- o0 U$ m5 @
安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化
7 V/ K. \+ p- D+ M- ~0 S: x, o, P; i
) Y0 b8 N6 V5 ]. X: f> ipfs init0 c* f) w0 d) a4 |% c& ]
( i: r; c+ Q% d8 `
initializing ipfs node at /Users/Emmett/.ipfs& t, y; I! c8 I5 a% K
, z$ d; t$ w- r6 J
generating 2048-bit RSA keypair...done8 ^; w) O  o4 ^- K0 e

* u2 ^; O" K8 D9 n# e. R" a- apeer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva
+ |; Y4 q  X/ {' l
3 t8 n+ B, b; a7 qto get started, enter:
/ @+ s% P: G1 _0 s/ j3 ]- B1 q+ l% _# ]; [) H0 H
  ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
, F. r# R. ]1 E- Z$ J" s/ z* z: a) S% `! @* A- T% A
上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:& @) H* y* j) E' p, X" Z8 N
$ q* u8 Z; |9 P
生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。4 O& A3 _* X( f" V5 g1 n

3 u6 L/ C: P1 ~5 N% m) I4 e节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。
) c5 d3 z1 d4 h3 z: T$ C( X8 m$ ^
( x9 P- Y" a2 y: a2 c在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。
7 j" `3 B2 X0 n
& p9 P  o7 V. n4 E! a如同步文件数据块放在.ipfs/blocks 目录,秘钥在.ipfs/keystore 目录,ipfs配置文件为:.ipfs/config。5 |: Y6 \- ^9 H6 l1 E; _
& C5 L/ `; [. v& T# p8 \0 C% b3 z- o+ a
IPFS 配置修改
2 y( Z* p+ x; E* Q; T8 o$ P" r: s0 v) E' ^8 w6 u3 p9 m
在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:7 A  s: V: q9 {
! p* f/ O/ M( x5 P9 ~
cd ~/.ipfs
# {9 j$ B4 F5 G! u( t
- j; E" t* K0 O" s) O- Mexport EDITOR=/usr/bin/vim  g7 I3 G' c8 d6 _4 m6 q% ?) N6 E

5 x- X( A: {7 O5 U% Jipfs config edit) S2 t6 F* G* T* Q6 a
0 \) D7 A" a. [" D7 o: a
或者直接编辑 ~/.ipfs/config 文件。+ E8 }1 P& `3 l7 j" x5 I

5 t- G6 F2 o, ^' K  C上传文件到IPFS
7 x8 a% ]2 _" J* ~, A6 d# I3 s7 {- C! L+ @* \  j- \! _
我们先创建一个upchain.pro.txt文件,可以使用如下方式:. X6 D7 f0 s! `2 ~2 Z0 S, V0 A  y
% W( t9 z" Q: @! j, Y
> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt
+ \! t4 e4 G7 D, K; v8 {6 B- v( _9 ^
2 o; e- t- q' |8 t( e: c& e# ~; mipfs 使用add 命令来添加内容到节点中,  在命令行输入:
/ X( r. d8 j: A
% u- m: N0 L( I0 K, B9 y> ipfs add upchain.pro.txt' H5 y) C% D7 |$ D

3 p5 ~8 r0 f0 R, f% k- k+ Radded QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt
& e1 |0 ^" Q2 x1 F* c) }- h( G6 o, \/ |0 n
43 B / 43 B [=====================================================] 100%; G) x  U( Q5 c5 a

* B4 K! r! q9 n: Y* F; Y当它文件添加到节点时,会为文件生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 查看文件的内容:  @1 b( {! ]) J+ Z: {; Z

9 D3 U& `" w& _5 y( L> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi* ~* ?- Q# \/ z3 U

5 n! X2 J* ^* r& ?
; `* ?7 D% G7 P- N3 o! M* X注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:
  V- Z( z- F: z/ D2 g$ k8 W$ z& N; w& B( z
> ipfs daemon% A4 I5 p6 P! `& W  W
; P2 H& z' N1 ~2 N" V% ?
Initializing daemon...
5 r' b* V7 z8 ~$ L% M% x0 s3 U
$ _3 x' `8 i" K. s! T, Qgo-ipfs version: 0.4.18-2 z0 X: C$ z( K/ m! Z9 ]

6 u- X% r+ l% e1 U, x' ^  J/ ~, Q( w) pRepo version: 7' `9 D; g- O# s% f, x
% S! ~+ b9 p2 }( I
System version: amd64/darwin4 W! J: T! t/ u" k$ C" R4 i

7 c& o, |4 `! o6 Z  ZGolang version: go1.11.18 R8 i& t- w: {  ]0 d6 B

. H' H8 i" s2 ZSwarm listening on /ip4/127.0.0.1/tcp/4001
, ?6 C( d" H5 a0 Y/ S
! v) V$ f1 Z7 F* Y7 C5 g9 NSwarm listening on /ip4/192.168.8.105/tcp/40018 S* K4 B9 V6 `! f; A

+ G; f0 b# `. B% o. dSwarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001
; M. H! J" `  P0 x. B+ L, L
% y$ {* h* \6 |3 U8 HSwarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
6 u1 W% n2 I8 n. G4 I: e) C
' l3 }/ ~2 E( D# k1 vSwarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
, O- @' W$ i/ t4 f9 w: n: _9 W6 K- Y0 W1 A& w# |9 Y$ q
Swarm listening on /ip6/::1/tcp/4001  q; I2 e) C1 W" @
) f5 ~$ ?% }; G! D8 \  X
Swarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
# [9 v, g1 S. @4 k; r; R8 U; E( Z) S' O) y& `& I; T" c
Swarm listening on /p2p-circuit
1 g4 u4 m! s  L/ j
- P7 I0 S; p' P4 F: WSwarm announcing /ip4/127.0.0.1/tcp/40010 A: {/ d% T8 @1 e; G
6 ]4 k  T6 S/ {8 o0 o4 w+ U8 N6 K
Swarm announcing /ip4/192.168.8.105/tcp/40015 U" h' I. g5 F/ R8 S
9 w# j+ h, {9 a. ?; V
Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001& V7 X( G9 _/ Y8 q" J4 C" `
4 w1 E5 B3 A2 \$ I$ d
Swarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001" B; d) c4 W  W* Q! z! G4 N

+ d2 i8 U/ N5 R' r. {9 f  n* aSwarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001+ s" U4 F5 x0 f1 F+ O
, [+ v8 x) o1 |, m1 x
Swarm announcing /ip6/::1/tcp/4001
- z0 R2 {" r# k! U+ U1 H' N5 k' q2 q
Swarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
+ K4 K6 ~; M. Y7 {8 E, K
  m* Z$ Z, m2 A3 h5 ^$ [API server listening on /ip4/127.0.0.1/tcp/5001
1 U, }9 O1 G  r$ g. w
* Y- E' W- Z" h& WGateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
/ I7 g+ T5 O4 m9 |- \! r% n0 Z' b! Q7 _, W9 X$ C9 ]& y' r( h
Daemon is ready
2 o  J, n0 B$ I* _0 ?) r
$ @" `& V% R$ D4 ^7 j0 N开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:
3 a4 R  C2 x- c$ I( e- ~8 l! U" {
8 k- ]0 \4 G: a  J/ T: R. ]2 sAPI服务,默认在5001端口,可以通过 http://localhost:5001/webui 进行访问,界面如:3 k5 ?& X; M1 G  }3 x1 ^5 V

+ w2 J( ~1 y0 p1 c! J/ Y3 `这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。
* P$ r  I2 d* A  S6 J( i, d1 G: [7 o4 d' }2 O
网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。
* j9 t1 s( x6 ~, P5 S0 z( Z! b5 Z
+ w# {- e/ H- E- K: y4 W! pipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。
! i# T! _0 H0 s! P# \' L
" ~# _7 V3 {) q- [9 P& }上传目录到IPFS
" h/ R$ r$ [- o0 C! i, W
# F( l$ W" k2 M% H! Z$ k我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。) X- C* E' z6 V/ j8 g

  Z, _  H9 w% R# s4 H> mkdir upchain* r! i% _; ~1 f2 c3 Q
7 F  ]& n6 ^0 u; Z: S$ ]% `
> mv upchain.pro.txt  upchain
% c2 t1 Y5 H; ?, q$ L  n2 F; h9 w0 F! Y( |; R0 O; k4 L
上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下:
2 c6 N6 J) J- r1 Y  \% v# g! [: ]
> ipfs add -r upchain+ k; Z5 G) C- {5 f

9 A1 m% M* a7 [" A' D1 P  r- padded QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt$ b- w- v( [9 v1 _8 |! q
7 o5 }# @. n0 x! ]7 y6 S
added QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain
, j4 J1 C  E  Q2 N0 p
; L1 Q6 H& I  }  ?1 W* I: G. S43 B / 43 B [===========================================================================] 100.00%
; m( B8 p7 W& _- i$ }+ V1 w) |' q, Z
在上传时文件夹,文件夹也会生成一个对应的hash,可以通过hash后接文件名来进行访问, 如:
! B( J& e# ^. a; O$ R) l5 v: l" Q- {' }3 h7 c( x% s
>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt
- U: O9 ~( x0 j/ g* `
* Y% T9 l" C# K4 x) r; w0 f! z8 s+ b; G, X
在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。
( g6 v1 g" V2 @+ N0 s" w0 D
3 P5 ]# d6 i9 v通过上传目录的方式,可以把整个静态网站的根目录上传到IPFS网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:
. Q" k' g- g$ k5 S+ B& J+ a; H7 b! V  |3 g6 O! E
https://ipfs.io/ipfs/QmaFWgfpRNz ... uCphq2ua/index.html
: P& a- F3 S& n9 ]0 \* K: U9 ?+ `( S/ u7 T% X
使用IPNS解决文件更新问题
* q0 I  }( J" V: w
. v  [; l2 k- M" f因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。0 s% f+ m. E, v# o- v) @
8 U3 {4 \  U" a+ h3 l9 ~, n
例如把upchain.pro.txt发布到节点,使用下面的命令:& l6 a! K6 G8 t$ y) \) \/ N$ p  [

6 t$ ~% g% e! _> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi$ C7 j3 a$ ^& R! x8 K

+ W+ x1 {/ O) b( hPublished to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi" a0 V- q4 r" N! I

' C4 m5 t1 Q; ?, P! y( }; A) n命令中的QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi是upchain.pro.txt的hash, 命令提示中的QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva是当前节点id(大家可以回看一个前面ipfs init 的输出)。
- s. d7 o4 M$ d  _# |6 f: Q
0 O$ r  ]! W- _1 r8 J# G5 C发布之后就可以使用http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva 或 https://ipfs.io/ipns/QmYM36s4ut2 ... VvmDU7xKUiVeswBuTva 来访问upchain.pro.txt的内容,如图:; j! z9 \1 i: N1 Q, Z
1 N1 A7 w, S9 {
其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。
/ Y7 o1 z% Q! _" p# ~. x! R
) O( [" Q8 H  T# F: [. K' k/ T现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”+ M: d5 c0 G5 l* `
% X$ ]1 h. e4 G# B/ J' A" }" ]
> echo "创办人:Tiny熊" >>  upchain.pro.txt' [4 u4 I5 K. v! {! X! A* K

, ^* n2 w* H$ B7 x# ?, e! B> ipfs add upchain.pro.txt
8 A. S! a% W2 H& _0 k# r3 v2 B9 c2 c8 ?& J) f% o5 F% r
added QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt
) T, S1 L2 {; K7 w
/ V# h7 d) s6 d; h63 B / 63 B [=============================================================] 100.00%
5 {1 `% I7 _! N- C: B
# `9 J8 |( y' L; {; d重新发布一下:
% ~0 B- P% w2 r& t3 V1 d! j. @$ l
> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
2 B% O; b2 u" u% @! V$ R
; p5 ~: ^& e8 w5 V3 o, [Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S% i* T7 P7 d# j! b1 F" o1 A

" k) H7 j! H1 F2 d! J" R# e再次访问 http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva (这个链接和上面的链接一样)可以看到内容更新了。
/ ]3 G; @  `. ^8 G7 j6 N7 K# {  e
. u  X. l4 v! l+ a# `7 t  z) {如果我们要查询 节点id 指向的hash 可以使用 ipfs name resolve  进行查询:
7 V5 r+ e& C" y6 g  R! Y. \/ U, A- G# e4 E7 n% U0 }, o& a9 m
> ipfs name resolve% H$ H' A& ], Y/ N5 ?; Q  L2 m

; l% K7 T# m8 H/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5
3 _' l: A# \* A+ S+ G
5 {: j/ t2 Q- v* O有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。- Y: A. `6 Q- u' \: F$ d2 E
4 C/ t, _7 ?. d& I% m* M1 X
如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:9 Z" v1 F/ r  L, |  ?2 R2 ], D

/ _$ e, N% D, s) b5 c> ipfs key gen --type=rsa --size=2048 mykey
$ h: ^; m) }6 [& X
$ w7 Q; _4 {, l. GQmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
  e( k8 V2 r( I2 n+ U* H0 C* q0 P; Y4 ]4 u& s: T
> ipfs name publish --key=mykey  hashxxx' z. M. h4 a5 g& w7 h) H3 b

% y+ W5 o+ B( H/ y+ K, e; M) {( OPinning6 O+ ?/ U3 _4 E0 R
9 P' e7 y; B! R3 X& w
Pinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。
4 |" F6 k2 d0 j- q, X3 e0 d* |. j% M  |
当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),
6 F7 S# [( H& x+ W5 J/ {7 l. @! B8 q! _/ O
IPFS 提供了pin命令进行Pinning操作, 比如我们查询下某一个hash 是否被pin:* R: u, p0 N& \0 I
% a" m; A% t4 K
> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S6 ^$ W/ j/ i1 K0 t( s- G; D
1 ]1 j* N9 {. g* E- F1 K+ V1 j5 U
QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive
. E$ Q7 G$ x' S1 U. c2 V4 f" m# P) j
; U) q" |, L" K  A2 i  i3 R; o6 E> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7! @) g- p0 ^5 y" L) a2 z

9 x1 c0 Y8 T: ?8 y# d# O8 s( MError: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned
. @. a( w: K# r
3 ~7 e. [/ N# N5 m7 P1 O可以使用 pin add 手动钉住一个文件,如:- J6 }* u. }6 j1 I; }

. Y' d2 F, u) p1 C1 d8 _: w4 r/ j> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7; J+ Y! ^! A6 y2 o6 X- T5 x& x, Y
3 s% y/ [! Z% o- u
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively
/ n+ ~4 H" c1 o+ K+ E, b8 ~% B% X9 \8 g- B& T6 {( q
如果要删除pin的状态,使用pin rm , 如:* H5 l7 I  H6 f& O7 }3 Z
6 F/ M: U7 b1 B% E9 T6 {" }; i
> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK70 w% n  x3 A6 c+ e: s$ W

( L6 a& ?: I0 |1 munpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
5 E; k, Q) K6 n$ g; n
" Z' e1 g- B& B2 Apin rm 的参数 -r 表示递归的删除pin 状态,对于没有pin住的文件, 如果执行GC操作 ipfs repo gc 文件会被删除。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    2