Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
IPFS 安装
, ~2 q/ T+ o8 A1 Q% `+ B+ G, O/ X0 q9 d1 u; _
要使用IPFS, 第一步肯定是先把IPFS安装好,IPFS在Mac OS X 、Linux及Window平台均有提供, 可以通过这个链接下载对应平台可执行文件的压缩包。
/ g/ Q2 \% x" V% p. E6 [. D* r" p" u3 I9 B1 W" E) @0 M% L
对于Mac OS X 及 Linux 平台,使用一下命令进行安装:
3 k$ F9 l$ K9 b5 j( W& s/ `! H% `" i4 ^' d
$ tar xvfz go-ipfs.tar.gz; G  E- G& D6 P! O+ s
: V' R& ?& F% b4 A5 T. ], `. N
$ cd go-ipfs
" r+ J5 S  m2 }* x/ i& w- j' A; W0 {6 J7 y; e: h6 ^" F
$ ./install.sh- W, ^; A' r( M4 p& l: G7 ?

  a  N# z) J0 q上面先使用tar 对压缩包进行解压,然后执行install.sh 进行安装,安装脚本install.sh其实就是把可执行文件ipfs移动到$PATH目录下。安装完成之后,可以在命令行终端敲入ipfs试试看,如果显示一堆命令说明,则说明IPFS安装成功。
; h3 v7 @/ c) G
3 ^5 Z4 R: l; ~6 Z, V, Z; ]在Windows平台也是类似,把ipfs.exe移动到环境变量%PATH%指定的目录下。
8 e% u( h( {' j' y' H1 |3 l4 m2 }. g! i/ \+ D
IPFS 基本用法7 ~0 J( w2 U5 W( A

8 f, L( b2 M0 _0 J) ?IPFS初始化. L0 r' N* N3 E& `8 R5 R

2 |) J* h. a" h" S) K; o5 M安装完成之后,要使用IPFS第一步是要对IPFS进行初始化,使用ipfs init进行初始化( v( d4 Q2 Z4 e+ a9 G5 G$ G
% ]$ q" H* q  d; D& y
> ipfs init
, O7 A* P4 c& [9 C4 E6 o& F  F) I3 E( x* o4 w
initializing ipfs node at /Users/Emmett/.ipfs
9 E0 F/ V- [4 H' c$ z% A3 R" N: ~2 O4 D2 A/ q, O8 p7 o+ W5 n3 j3 M' n
generating 2048-bit RSA keypair...done
/ k9 }$ i5 i  t. U1 n0 X. ~5 Y$ K
peer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva! n  a, g/ i4 ?
6 [) X0 b9 m" D8 i6 H: a7 p
to get started, enter:+ E; }6 D/ S$ d. b8 z  h! o

, l  N$ s& y, |: \  ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
9 G1 M4 u' I' B2 v4 }% E# c: a8 n" `4 e+ b8 A1 G" c
上面是执行命令即对应输出,在执行ipfs init进行初始化时,会有一下行为:% w! J  H0 d6 I. E: Q& Y
+ t2 Q! p2 a/ ^( E& R
生成一个秘钥对并产生对应的节点id, 即命令提示:peer identity后面的hash值。* ~  _$ y- R; _8 h0 X( T
' n, o& w5 x" g7 z6 w+ k: ?" [* Y8 Y
节点的id用来标识和连接一个节点,每个节点的id是独一无二的, 因此大家看到的提示也会和我的不一样。
& ?( S  Y+ h+ O/ d1 {  @6 H, r/ j( J% P8 c& C& X5 v" x
在当前用户的主目录(~ 目录)下产生一个.ipfs 的隐藏目录,这个目录称之为库(repository)目录,ipfs 所有相关的数据都会放在这个目录下。
4 p: t6 T5 H+ J! n5 y+ }1 G# O1 ~- q
- o. ^$ w+ W/ _3 `如同步文件数据块放在.ipfs/blocks 目录,秘钥在.ipfs/keystore 目录,ipfs配置文件为:.ipfs/config。
. [5 }2 k- n% r* ^5 f% q
1 i; S/ b% d) r% G7 n% f( cIPFS 配置修改
& e0 f, l: R0 H& A3 r: v
6 X+ B! H: _3 D5 ~3 J7 \在IPFS初始化之后,可以根据需要修改配置(可选),修改方法如下:
; `1 }, i- T1 N" w1 U
0 H7 M8 X" c; \# u/ \2 f9 e1 Xcd ~/.ipfs. z, [5 ]0 t$ N. ?, f4 {
; b" }$ X" G! t, @
export EDITOR=/usr/bin/vim
, X: I1 o' a+ F1 g8 e; ~- J
  _4 A# d* u* ?6 B  \ipfs config edit
" E; |5 Y8 e- ?# J4 q1 l1 H4 ]' }2 `( s8 I4 n0 ~
或者直接编辑 ~/.ipfs/config 文件。
! N0 G# h. a& @. u. s2 B( U6 L; s2 R( L1 |
上传文件到IPFS
0 H8 S  X7 e' q" @$ i+ O! ?: B* E7 H7 L1 [
我们先创建一个upchain.pro.txt文件,可以使用如下方式:5 L% Z5 `- e9 g+ Y5 |

& }$ ~' }- j  v& C6 R6 x- S8 p# w> echo "比特池塘:www.bitmere.com" >> upchain.pro.txt2 {. X. [1 S$ S* J9 a

5 N' o6 U2 N1 j: N; [ipfs 使用add 命令来添加内容到节点中,  在命令行输入:
1 i6 N6 a% ]5 i7 [1 p% m6 p5 U/ ~6 i+ \/ C; d: G9 o9 Y
> ipfs add upchain.pro.txt) @6 u! \% |: @3 J

6 B+ ]- q+ ^$ c- _- s- s2 n$ `: uadded QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt8 N3 o2 b8 R9 N+ ?) N1 i
: a) I" v; H3 U. S, e3 h' m8 O
43 B / 43 B [=====================================================] 100%. _& ~) M7 @, z

5 `, ?# F% b( \9 C' D当它文件添加到节点时,会为文件生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 查看文件的内容:
# X8 d- w+ i7 q& @& t) g+ o7 {
7 h4 V4 D% L& ~, p> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi/ Z- g" N; }4 g$ T. p
& \& t/ u: o7 j8 x( s
' e5 v+ f: m9 n& q% h! N
注意,此时文件仅仅是上传在本地的IPFS节点中,如果需要把文件同步到网络,就需要开启 daemon 服务, 使用命令:
$ m! [: Z8 C& t( m: S& i$ i8 M
; \* @' l8 c$ Y! N, z9 O> ipfs daemon
8 R5 e9 s9 L: m0 c8 b, U0 K- @% A9 g
Initializing daemon...
6 \* g+ \, p) H, x
: M0 E3 ^9 Y7 l7 p! |" fgo-ipfs version: 0.4.18-1 j: M* _( p3 G

; y1 }8 |, K% T. URepo version: 76 M  \: W  j  X, \

$ l$ u- ~' B* o6 w# LSystem version: amd64/darwin8 F5 v6 T3 O5 g
7 Y% B& V8 T7 R( Y% _2 e
Golang version: go1.11.1' ^6 t, A' w8 z! @3 C
1 S' u3 T; W2 x* K: T
Swarm listening on /ip4/127.0.0.1/tcp/4001- B0 `, q* |+ q5 ^1 N

" Q2 e, ]4 |: O5 pSwarm listening on /ip4/192.168.8.105/tcp/4001( \6 t! H6 n0 g' ]8 O
( j# r0 e: ~& n3 v/ W
Swarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001
6 |1 ~: e5 }% z9 }: r; t/ }0 p4 I% y, \2 c
2 o$ a0 D0 O& v/ ZSwarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
/ Q7 B8 _( m6 {: E+ s9 y& F/ M" ^- w- ?5 C  m9 n
Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001. k' |& r: c+ M* \' ]% Q1 a3 n
$ ^+ C$ C2 n/ r' q: J
Swarm listening on /ip6/::1/tcp/4001' @3 z1 w* r5 a2 v3 ^8 _: x

4 K  H6 q/ w: C2 n0 H7 i2 X% jSwarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/40015 B( P: Q0 C3 z1 y

( Y" {$ z, v9 YSwarm listening on /p2p-circuit
4 o1 |) }( T4 e& U, D% A4 U0 Q+ k; p' V; i
Swarm announcing /ip4/127.0.0.1/tcp/40010 j) @9 A. ?7 D9 |- e

6 l$ S0 Z4 e, {$ b( ?2 [" RSwarm announcing /ip4/192.168.8.105/tcp/40011 D* ~& Y$ u+ d4 g+ C

4 T1 n' a7 q! h3 @Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001
3 o$ p7 d  ~" e) F  w, J$ s+ z* l+ D1 ^; s% N! k8 J
Swarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
0 k: t# a+ x6 y2 b. x9 ~! ^, a
/ `+ V) K& q+ B$ u4 U4 ~: TSwarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
" A1 Z" r& w/ G9 f/ [1 f
9 j3 `  `9 J, sSwarm announcing /ip6/::1/tcp/40015 o; d: p* q; L4 R( ]
/ N- w6 f6 X5 L7 u7 S- w$ B! G* W
Swarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
0 i  I$ I/ r$ l; H& d' G+ f. k+ e& X& S% _2 a; P7 n
API server listening on /ip4/127.0.0.1/tcp/5001) n6 Y3 L) ?% V

% T% L; `% w$ ]4 yGateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
8 M0 X2 w% Z/ x6 _& w% z! C" s  _3 d" l5 P( @( s+ S+ m
Daemon is ready% ~& o+ C; X4 c7 N

, H2 G6 X& a& Y- m1 R1 ]开启 daemon 之后,Swarm 就会尝试连接其他的节点,同步数据,同时在本地还会开启两个服务:API服务及Web网关服务,下面分别介绍下:
7 r( q% c( ]4 ^8 T0 m) s4 ^0 y& \' ^9 W" R0 P8 }, g% c7 I/ j
API服务,默认在5001端口,可以通过 http://localhost:5001/webui 进行访问,界面如:* G6 z5 |9 G8 V7 Y& S
5 ~) J" X% i& o9 ]
这也是IPFS的一个Web版的管理控制台, 可以通过这个控制台添加文件,查看节点连接情况等等。: i0 Z- v4 F1 ?7 b2 h$ h; G  b0 U* c

  m  W& A& z. b+ J网关服务,默认在8080端口, 由于当前浏览器还不支持通过IPFS协议(ipfs://)来访问文件,如果我们要在浏览器里访问文件的话,就需要借助于IPFS 提供的网关服务,由浏览器先访问到网关,网关去获取IPFS网络杀过了的文件。 有了网关服务,就可以通过这个链接:http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi 来访问刚刚上传到ipfs 的文件。/ V. _0 I7 K3 W: x7 Z

5 k1 L4 D' O8 ~ipfs 也提供了官方的网关服务:https://ipfs.io/, 因此也可以通过 https://ipfs.io/ipfs/QmQgMZKqHzy ... UDVjqhJDoaUKDymgioi (需要翻墙)来访问刚刚上传到ipfs 的文件。! H/ u8 Y5 r7 M' ]
' x: ?) Q0 d3 M1 U$ B
上传目录到IPFS
- M6 X  a3 H* S% \: r6 b) Z
5 R. @, T  ^  j- Q我们先创建一个文件夹upchain, 并把之前的 upchain.pro.txt 放进目录。
0 A: u. g" R0 a, g. b5 V( j; w1 }9 i! X
> mkdir upchain! L. m' w& f, Q1 q& `$ [
  Y; I  Z4 A- }0 i* d
> mv upchain.pro.txt  upchain- k! T( l2 K0 z1 Q6 s" u5 c
0 z/ u) C/ Z7 A! |, J* V1 ^! K
上传目录到IPFS 需要在使用 add 命令时加上 -r ,如下:
6 R4 p( v. Y+ {4 H6 b" x, o) I! F6 L: j8 Z! x. _# [3 `
> ipfs add -r upchain
6 q) \% Q5 q# P  Y
6 ~$ X) Q2 w/ \+ Aadded QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt
& [6 V' r# m: o, x
- r, M4 d6 G4 M+ {' Ladded QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain
' E: I& u8 i2 M2 e4 W; y/ ]
5 V" x# ]$ k% }  {1 Z  ]$ S43 B / 43 B [===========================================================================] 100.00%' \+ u$ r! S+ E* I
7 `" q1 D, G7 p# g
在上传时文件夹,文件夹也会生成一个对应的hash,可以通过hash后接文件名来进行访问, 如:
" f7 _9 ]3 U9 Z" @$ A5 H# W
4 n! ~# x- b4 v8 _+ d7 a+ q>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt
' k. O) ~7 t- b5 A
2 ?. p8 H' G3 S. ~; y4 C" B9 w& h" F9 m* Y6 G9 x) w# s
在浏览器可以链接:http://127.0.0.1:8080/ipfs/QmQYp ... dbP/upchain.pro.txt 来访问。7 t9 f3 @( ^4 n, Y7 O4 _
- E- M/ m2 K- n" I7 }
通过上传目录的方式,可以把整个静态网站的根目录上传到IPFS网络,这样就可以省去托管服务器,例如可以直接通过以下链接访问深入浅出区块链博客:
. k- _/ N- b; ^0 I. n( Q3 d% |  y7 a# `9 {4 V+ p
https://ipfs.io/ipfs/QmaFWgfpRNz ... uCphq2ua/index.html" o% R( ^1 G: r( u2 V

7 o* ~2 {! t% i7 C* K使用IPNS解决文件更新问题# u# N3 S; L1 I; n' r  V8 l
3 U8 `' m8 g$ Y, ~8 Z0 L6 q5 P# J0 C
因为IPFS在IPFS中,对一个文件的内容修改后(如升级),会生成一个完全不同的新Hash,使用IPNS就可以利用同一个链接总是指向更新的内容,其实使用也很简单,只需要每次在内容更新之后使用ipfs name publish hash 发布到节点。& b7 q  n7 v! l  @* ^/ c
  w, P1 @9 f  c5 p
例如把upchain.pro.txt发布到节点,使用下面的命令:
$ W( ~, T$ d" ^1 J) B/ v, Z5 f" e  z* _8 ?
> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
1 V: T, i# h2 V+ }: B- C' o% x, ^0 y9 |5 a$ {8 J
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
# z; X) Q: \. l# U  s+ x; I3 V5 @( w
命令中的QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi是upchain.pro.txt的hash, 命令提示中的QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva是当前节点id(大家可以回看一个前面ipfs init 的输出)。
6 M4 e/ B1 ^! V* G# H- X  ]% E; e. W- T* q& ^! w0 a7 M) G* q
发布之后就可以使用http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva 或 https://ipfs.io/ipns/QmYM36s4ut2 ... VvmDU7xKUiVeswBuTva 来访问upchain.pro.txt的内容,如图:
: E2 V, t- G) o9 `8 ^- m$ V) U) G) y/ \% N7 G
其实理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 来访问,通过网站还是前面提到的浏览器暂不支持ipfs协议。. H8 g" S# a. E1 N& S9 c+ X
  k& y, d% I9 E" g) ^
现在我们来更新一下upchain.pro.txt 加入文字:“创办人:Tiny熊”
& u/ n3 g  k& v; h# ]
9 l* ~6 K) ^9 j7 D/ \> echo "创办人:Tiny熊" >>  upchain.pro.txt
8 L3 q5 a% Q2 t* V8 \( Q# X" Z$ {5 w( T& k. X2 w8 ]$ _. {5 l
> ipfs add upchain.pro.txt
: k/ N+ q) r! p, D+ n& j7 y
( G5 Q+ D- o1 t3 L9 Padded QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt  ^8 j# f0 g% d5 S9 i1 X
3 W+ d3 q$ t1 E* c3 r
63 B / 63 B [=============================================================] 100.00%4 `) p/ S0 d, g- z
# r2 ]- e  J; F; f
重新发布一下:. A( i- T6 T% v
& ]& R, c5 D  L' ~3 c5 _6 D
> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S4 a& z+ Y1 E. R
' \8 l7 `8 V6 G4 l+ @: ?
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S; h! Y! n1 ^/ o5 Q. u

9 o; F3 \6 u2 A8 Y& J0 `. j再次访问 http://127.0.0.1:8080/ipns/QmYM3 ... VvmDU7xKUiVeswBuTva (这个链接和上面的链接一样)可以看到内容更新了。  i) _  _, h* G" q' T+ b, q
4 A7 T+ x+ T1 ^6 S; B& d8 [" C/ [
如果我们要查询 节点id 指向的hash 可以使用 ipfs name resolve  进行查询:$ [1 i! h: d4 i  _
. `% N- U" s- q
> ipfs name resolve
- H8 f; Z( b+ G0 j& N* W0 z, t9 c7 k* O% ]  q
/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5
* n8 o' K( M% @+ \0 w: F$ d3 }9 G- e  k
有一点值得大家注意: 节点id其实是公钥的hash,它的关联信息是需要经过私钥签名才可以发布,因此只有我们自己才可以更新节点的指向。$ [- b4 L# o& w- K- M

- S! W: q; o  O0 j" y如果我们有多个站点需要更新,可以新产生一个秘钥对,使用新的key 发布,如:3 I" G2 Q0 V/ i3 a5 r) T
. l: X4 L0 }( L2 K+ R4 |
> ipfs key gen --type=rsa --size=2048 mykey& T$ g7 s" j5 v; ?* |' j8 A
4 I3 P3 P: \) D4 Z
QmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
  ]4 J6 e8 T8 a4 t2 M/ X6 f! W* G3 V9 b+ I
> ipfs name publish --key=mykey  hashxxx6 d9 P6 c. G) c" P7 e
6 v2 n, Q2 A% N; n3 R2 L7 t. d  {, K
Pinning
& f  R6 u3 J: b
0 R4 Z6 W) N: P5 t- DPinning 在IPFS里是一个很重要的概念,当我们每次请求一个网络上的内容的时候,IPFS总是会把内容先同步的本地提供服务,而为了防止 IPFS 存储空间不停增长,实际上使用cache 机制来处理文件, 如果文件在一段时间内没有被使用,文件会被”回收“。 Pinning 的作用就是把文件”钉“住,确保文件在本地不被”回收“。 如果是重要的文件,就可以使用 Pinning 防止文件被删除。
. z& O2 Z- K  ]/ Y* U1 W: s2 j" Z0 v  w, I" ]1 h% ^
当我们使用ipfs add 添加文件时,默认会进行Pinning(使用其他命令获取的文件不会进行pinning),9 n1 W" O* u  J' Y, E

" l- |1 A% ]' Y. c1 N- tIPFS 提供了pin命令进行Pinning操作, 比如我们查询下某一个hash 是否被pin:
+ {7 h) _; r% C( F7 o0 B3 M7 }$ {2 y- R, h
> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
8 J3 @3 o" l6 m0 b* f
* i* f/ N# F1 S/ J. p0 C5 \4 L+ L  bQmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive* e$ z" c0 j8 m* ]

; P  N1 s) o& M3 y% _) T' r> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK76 t/ b, D! k: ~" O* R1 p# i
  |; O/ U! `9 l4 s1 H
Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned
* F- J4 K* ~* y- e$ `4 e* s& m
$ D6 I. D: K) o; r可以使用 pin add 手动钉住一个文件,如:9 e" E+ R. u$ C* y

" k# N0 K  I) E9 b+ B> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
1 w% r7 ?9 T: R' ]+ z6 d$ Q( @% k3 [( |
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively
! L# Q6 V; I$ a& w
, J1 n# f- K$ I如果要删除pin的状态,使用pin rm , 如:
* U( B( H) a7 S  S( v8 E
0 ]% o8 U4 L" W6 H, U. d3 s( j> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
% ?8 R7 v6 @4 h1 D& O" N$ n8 v3 [9 B. l# a5 M0 c/ f: P4 E; Y
unpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7( P9 R# \, g  @& K4 D7 F

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

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    2