Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

IPFS实践之初体验

繁星如尘
98 0 0
IPFS的全称是InterPlanetary File System(星际文件系统),从名称上看,这是一个很炫酷、很有野心的项目。简单地说它就是一个点对点的分布式文件系统。官网和github都可以找到所有的相关资料。建议从它的白皮书,和直译中文版本开始了解,后面我们会慢慢地认识它。白皮书上指出了多个应用场景:
4 p  ^9 w0 H/ F* x6 ]As a mounted global filesystem, under /ipfs and /ipns.
  b1 u! F, l+ S0 jAs a mounted personal sync folder that automatically
: i, H( G( e- A6 _! Xversions, publishes, and backs up any writes.: `" J) @3 d( C6 ^* }
As an encrypted file or data sharing system.( I9 M) p" c) `: B" W: E5 \. Q8 E
As a versioned package manager for all software.
# o& E6 b6 @: H0 L) [& O' VAs the root filesystem of a Virtual Machine.  w5 j1 G6 e7 e) I9 {& W
As the boot filesystem of a VM (under a hypervisor).
! }8 S/ w& T; P- @5 {0 X1 jAs a database: applications can write directly to the
6 i  d% ~* P+ N* XMerkle DAG data model and get all the versioning,, ^8 p4 w1 m, L  |' n
caching, and distribution IPFS provides.
  V: H$ j2 q* ?As a linked (and encrypted) communications platform.
; X5 N' g3 V  ZAs an integrity checked CDN for large files (without
- a9 y  j6 {& i( [  c2 a; Z8 B5 ESSL).
4 h7 L' y: o& v: uAs an encrypted CDN.
. C+ x- r1 K, dOn webpages, as a web CDN.& R' S; Y9 b+ v2 e0 A
As a new Permanent Web where links do not die.* e9 n# L6 t. t* u
·
6 A: w9 k4 R  [7 M; D9 e8 b1 h0 X) }体验0 ^$ X3 O, A7 N
我想从第一个应用场景开始,开启我们的应用旅程。6 f& y* A4 g% [+ Y+ t  b$ ~
这个场景可以把它想象成一个特别的"云盘",这个"云盘"不依赖任何云存储商,不依赖任何平台账号,不用担心云盘提供商的内容审核,不用担心个人隐私的泄密,不用担心内容丢失或被篡改。这些特性希望通过后面的介绍,大家能够自己体会到。可以先试想下,平常我们使用云盘的几个基本需求:
& d/ w1 d/ ~0 A' `4 C/ S0 z上传文件下载文件分享文件5 I; v$ U' Q* E8 C% i' p+ s
下面我们看IPFS如何作为一个“云盘”,来满足这些基本需求的。参考官方的get-start.
- [! C5 R, W. N# @7 |& j' _

4 p' T" T* t# L/ J: _: R5 h1 Z: `·
8 w6 ~0 V) g8 H" x. Y% u/ v& W下载Daemon
) I) d; ?; u7 X6 y# y# B' D首先下载官方提供了IPFS的Demo,比较完整的版本是Go实现的,目前最新版本是0.4.15,包含多个平台的版本,以windows 64bit系统为例,下载go-ipfs_v0.4.15_windows-amd64\go-ipfs,由于网络限制,可能有些同学无法下载,我这边上传了一个到IPFS网络上,有需要的同学可以直接下载。
0 E: z) S1 M+ e. K5 @* w这个demo中提供了Node/Cli/Http api/Http Gateway/Library/webUi功能,本文中暂使用CLI的来体验IPFS的基本功能,为了方便在cmd直接执行IPFS命令,可以将Go-ipfs加入环境变量path中。+ V- K- x. u7 q6 E% n/ S2 U
初始化. I  h" z# b4 o3 c9 J4 e" a
> ipfs init: \+ t8 u; g% C
执行初始化之后,user路径下会多了一个.ipfs的文件夹,其中有一个config文件,记录的是IPFS的配置,配置内容后续的讲述中会慢慢涉及,此刻我们先了解的是IPFS节点的身份标识Identity,其中peerid,是本机IPFS的地址,下文中IPNS的使用中会涉及到peerid。当然,peerid可以通过命令行直接查看:
; f- g) p/ x4 y9 J3 l/ e, ?> ipfs id- k1 A$ |) {) h/ b2 e. B- b2 Z: y
·, |6 L3 H- d5 y% B; F
启动Deamon
- k* d6 ~/ T1 i) k  N执行
# J5 n8 k/ s( b5 z) h+ f> ipfs daemon
# I! I& V7 y3 l* n( Y0 a: ~: y开启deamon之后,会启动demo中包含的IPFS服务,至此,本机就可以作为一个"个人云盘"来使用了。
0 L! n5 x9 C) g4 C: ?- T7 g6 M4 s·
0 _; P8 _- x4 ^上传文件9 }. I5 x* a! O: m6 s7 g
> ipfs add  //添加文件" Z" D  b+ i3 R( {* A. z) Y/ p/ @& Z
> ipfs add -r  //添加文件0 U! n+ U, a1 Q
文件添加时,大文件会按照256KB的大小去分块,分块内容存储在.ipfs repo下的blocks文件夹下,每一个块都对应一个hash。文件添加完成之后,会返回一个文件hash,文件夹是递归添加的,会将每一个文件的hash返回,最后一个返回文件夹hash。由于IPFS中,文件都是基于内容寻址的,用户不需要关心这些文件放在哪,这些hash就是用来查找和得到文件的索引。
# W; k' z$ Z# q·
0 W9 S* q1 o' L8 u下载文件
! c0 c) Y" C! a想要拿到一个IPFS上的文件,只需要知道文件的hash即可。8 ?* ~' K& K/ U
下载命令:! y' ]9 j8 p, D5 q
> ipfs get  -o
; }3 o4 b# t3 i: m* s" G或者查看命令:& ~/ c8 k9 ^' P- ?8 W
> ipfs cat 6 ^5 [" s/ a$ d' S( D
IPFS 的所有文件都是在本地的,Pin add可以将远端节点的文件长期保留在本地,不被垃圾回收。通过 add 添加的文件默认就是pin过的。2 F: ?& q( X& M  r7 X
pin还有一个作用,pin add之后,这个节点就可以同add这个文件的节点一样,作为整个文件的服务节点。其他节点在get或pin add的时候理论上可以从这2个节点的任何一个节点拿去这个文件的块。当有很多个节点都pin add这个文件时,就会增加这个文件的获取速度,也降低了文件被删除的可能。7 R9 ~$ v/ R4 u5 ]
> ipfs pin add : o! ^, U  ~$ L% R
> ipfs pin ls //查看哪些文件在本地是持久化的。9 Y% n" }3 C/ F" [7 ^
·" m3 v6 k0 E5 y( w2 _' Q3 h
分享文件6 q- g& `- Z" P" _/ b& {
现实中,用户习惯获取内容的方式都通过http的方式,让用户去敲get命令去或取文件恐怕只有极客们会尝试吧。回想一下,云盘分享文件的做法,生成一个http url,把链接分享给需要的人。# x  j+ w* E8 O8 M' L+ v" d& Z
IPFS demo也提供了一个http gateway,官方(公网)用的是 http://ipfs.io ,所以分享的链接可以是:6 h8 o- ^7 p) b9 |
[url=]http://ipfs.io/ipfs/5 F* E0 Q3 M# t# e, k1 y
由于某些已知原因,ipfs.io这个网关在国内是没法正常使用的,因此有条件的可以在自己的服务器上部署一个IPFS gateway(Ipfs 私网),这样,分享的链接可以是
- O, R8 Z& r: e9 K4 E+ E) shttp:///ipfs/
: ~" n6 W1 P3 I·" ^! C1 R, i4 i  p( s5 E
IPNS
" [/ h8 f' H, }2 V( W$ J到现在,我们分享文件还是不断地发送一个个hash组成的url,每分享一个文件就会重新生成一个url,那么可以有一固定的"网址”给我们来看你的分享呢?当然可以。这就需要借助IPNS。具体做法是
: s8 r& X& {& h1 [5 [5 `; ?> ipfs name publish
( e3 r$ K* S! J/ s3 W这条命令相当于把文件的hash和IPFS的节点绑定,这样就可以通过一个不变的地址来访问publish的文件1 J8 y/ m, l' c& X5 K
http:///ipns/& {7 A! v, T1 t6 q; ~" c  }
peerid即之前介绍的本节点的唯一标识。
- `0 Y1 \; {2 V$ B, Y( l" b' o这样做的有一个很大的缺陷,就是每次这个链接指向的都是最后一条publish的内容。但是有解决方法,大家可以查看我的博客的关于页,我的IPFS主页。实现方式其实很简单,就是将将分享文件url的列表publish到ipns上。后续可能会再写一篇博文介绍做法。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

繁星如尘 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2