Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

IPFS实践之初体验

繁星如尘
166 0 0
IPFS的全称是InterPlanetary File System(星际文件系统),从名称上看,这是一个很炫酷、很有野心的项目。简单地说它就是一个点对点的分布式文件系统。官网和github都可以找到所有的相关资料。建议从它的白皮书,和直译中文版本开始了解,后面我们会慢慢地认识它。白皮书上指出了多个应用场景:
/ n! w8 l/ J1 e& f# D6 jAs a mounted global filesystem, under /ipfs and /ipns.( U! ^+ M  k' w* P/ ^* r6 ^
As a mounted personal sync folder that automatically
% O& E% Q3 n' ~& \3 I- C6 Tversions, publishes, and backs up any writes.
( v# g$ D$ `6 n8 m+ EAs an encrypted file or data sharing system.0 s8 Y$ M! \3 f
As a versioned package manager for all software.1 }8 y- ^2 g% D0 E! I" i; W
As the root filesystem of a Virtual Machine.5 B9 u1 U0 e* y9 U' P, g5 Z0 `
As the boot filesystem of a VM (under a hypervisor).7 ~" z5 v7 ]8 K5 Y* I6 `- R. L
As a database: applications can write directly to the
+ }% z; _+ R: o0 _" b7 C$ {+ \' AMerkle DAG data model and get all the versioning,( b9 U9 R% f3 ~( t
caching, and distribution IPFS provides.+ e$ c3 e: I1 a  a1 [8 b- o
As a linked (and encrypted) communications platform./ N) m" z, U5 g' x9 h# o% d
As an integrity checked CDN for large files (without
, n6 F; {8 H- D" TSSL).3 ~, x3 u0 U# v2 G% B1 L/ O4 n* S
As an encrypted CDN.
% ?$ m- @2 o: v8 z& A9 POn webpages, as a web CDN." M, @  y' ?$ g
As a new Permanent Web where links do not die.5 g+ Y0 Y2 t/ I" D
·1 S/ q% n& ]# U% _7 j6 |; o0 i
体验
$ k$ W8 N+ R+ V$ W! M! x我想从第一个应用场景开始,开启我们的应用旅程。
& W1 b* w& D9 K: m& u5 H. Q这个场景可以把它想象成一个特别的"云盘",这个"云盘"不依赖任何云存储商,不依赖任何平台账号,不用担心云盘提供商的内容审核,不用担心个人隐私的泄密,不用担心内容丢失或被篡改。这些特性希望通过后面的介绍,大家能够自己体会到。可以先试想下,平常我们使用云盘的几个基本需求:
0 e1 \( ?2 S- N7 x; v  W/ T上传文件下载文件分享文件3 h9 X; e% X. Y$ A% l$ M) \9 w
下面我们看IPFS如何作为一个“云盘”,来满足这些基本需求的。参考官方的get-start.
" s' ]) ]4 V, B# ]" F  ], e
4 H+ S9 r6 p) |5 A! I- U- g
·
; ~7 n5 k) [9 \. `  d( G下载Daemon
+ o! c- R8 M& ]7 |3 L首先下载官方提供了IPFS的Demo,比较完整的版本是Go实现的,目前最新版本是0.4.15,包含多个平台的版本,以windows 64bit系统为例,下载go-ipfs_v0.4.15_windows-amd64\go-ipfs,由于网络限制,可能有些同学无法下载,我这边上传了一个到IPFS网络上,有需要的同学可以直接下载。! T+ y- e$ w1 `9 M. i& W& B
这个demo中提供了Node/Cli/Http api/Http Gateway/Library/webUi功能,本文中暂使用CLI的来体验IPFS的基本功能,为了方便在cmd直接执行IPFS命令,可以将Go-ipfs加入环境变量path中。
  O, m6 G/ d+ }- Y' \) I初始化+ ~9 s- m; l! m3 R
> ipfs init
- v5 w: N, `8 S, u8 P: U. `执行初始化之后,user路径下会多了一个.ipfs的文件夹,其中有一个config文件,记录的是IPFS的配置,配置内容后续的讲述中会慢慢涉及,此刻我们先了解的是IPFS节点的身份标识Identity,其中peerid,是本机IPFS的地址,下文中IPNS的使用中会涉及到peerid。当然,peerid可以通过命令行直接查看:
7 \8 {& H: N) `. r7 K> ipfs id6 ^/ j+ |0 ^+ o" p; Z7 j: `
·( K/ X2 b# m8 r
启动Deamon
2 B9 P% {& B2 I' g; A  u4 g, o2 _$ |执行0 d# q; P! l; W9 U
> ipfs daemon
+ f) K0 I+ `( J( q开启deamon之后,会启动demo中包含的IPFS服务,至此,本机就可以作为一个"个人云盘"来使用了。
/ }" G. F' B: B4 I# L' k  Q·
$ v( ^3 Y) F# i( j2 o" f$ q上传文件
5 [) y- r& T3 ^> ipfs add  //添加文件
3 C- p# e$ O, L# W3 f! r& A! C> ipfs add -r  //添加文件. `8 S( j4 s' n: j+ [. T
文件添加时,大文件会按照256KB的大小去分块,分块内容存储在.ipfs repo下的blocks文件夹下,每一个块都对应一个hash。文件添加完成之后,会返回一个文件hash,文件夹是递归添加的,会将每一个文件的hash返回,最后一个返回文件夹hash。由于IPFS中,文件都是基于内容寻址的,用户不需要关心这些文件放在哪,这些hash就是用来查找和得到文件的索引。6 @# f+ O* T5 x+ |( \9 N1 l4 u
·  \4 t" P  M/ R6 u; @6 Z% ?
下载文件! d3 i) c6 ]5 I) h2 {( L
想要拿到一个IPFS上的文件,只需要知道文件的hash即可。
5 R) j$ K) J) c下载命令:8 l5 `) y. U8 I9 S8 i  T% s( a
> ipfs get  -o   @  I% L$ y1 @/ P8 }0 j6 t" Y
或者查看命令:
/ s- m; S7 U+ Y0 B5 w> ipfs cat
( D! [( r' S5 m% J3 `+ Z1 ]IPFS 的所有文件都是在本地的,Pin add可以将远端节点的文件长期保留在本地,不被垃圾回收。通过 add 添加的文件默认就是pin过的。
3 d2 |( t& r9 H8 t) o7 Kpin还有一个作用,pin add之后,这个节点就可以同add这个文件的节点一样,作为整个文件的服务节点。其他节点在get或pin add的时候理论上可以从这2个节点的任何一个节点拿去这个文件的块。当有很多个节点都pin add这个文件时,就会增加这个文件的获取速度,也降低了文件被删除的可能。
4 G9 I2 \- K) J3 G> ipfs pin add
1 u# N  ^9 f/ l0 m1 I0 \# ]> ipfs pin ls //查看哪些文件在本地是持久化的。
. G& G. [6 {  P# x/ C( n% [$ ~3 {" X·
  ?; G" w. L9 k6 o$ M& y% A分享文件# \0 {  W9 o* V& L# a, t
现实中,用户习惯获取内容的方式都通过http的方式,让用户去敲get命令去或取文件恐怕只有极客们会尝试吧。回想一下,云盘分享文件的做法,生成一个http url,把链接分享给需要的人。2 X6 P" @1 y0 ]. X1 @4 O" N
IPFS demo也提供了一个http gateway,官方(公网)用的是 http://ipfs.io ,所以分享的链接可以是:
  m, [  }- j' h7 [[url=]http://ipfs.io/ipfs/% ?; q0 P3 U: ~
由于某些已知原因,ipfs.io这个网关在国内是没法正常使用的,因此有条件的可以在自己的服务器上部署一个IPFS gateway(Ipfs 私网),这样,分享的链接可以是: L+ {& ^7 a" J! r
http:///ipfs/
1 ?. z( y. P9 O! e·5 j8 m. D/ N. v4 ^) L
IPNS( Z) f: E% D: F+ K
到现在,我们分享文件还是不断地发送一个个hash组成的url,每分享一个文件就会重新生成一个url,那么可以有一固定的"网址”给我们来看你的分享呢?当然可以。这就需要借助IPNS。具体做法是" \# u/ \! s1 g9 e3 v/ Z7 ?' P- @
> ipfs name publish 0 T( C% {4 U9 r
这条命令相当于把文件的hash和IPFS的节点绑定,这样就可以通过一个不变的地址来访问publish的文件
+ H; A5 C% }$ K# |http:///ipns/
( T; a/ A) }* R, J' O. p6 R4 @$ u  c4 Upeerid即之前介绍的本节点的唯一标识。$ c9 b* _/ B; r4 x
这样做的有一个很大的缺陷,就是每次这个链接指向的都是最后一条publish的内容。但是有解决方法,大家可以查看我的博客的关于页,我的IPFS主页。实现方式其实很简单,就是将将分享文件url的列表publish到ipns上。后续可能会再写一篇博文介绍做法。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

繁星如尘 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2