Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

IPFS实践之初体验

繁星如尘
105 0 0
IPFS的全称是InterPlanetary File System(星际文件系统),从名称上看,这是一个很炫酷、很有野心的项目。简单地说它就是一个点对点的分布式文件系统。官网和github都可以找到所有的相关资料。建议从它的白皮书,和直译中文版本开始了解,后面我们会慢慢地认识它。白皮书上指出了多个应用场景:  _; T3 ?  z' P. u8 \1 [  o) h  D$ E
As a mounted global filesystem, under /ipfs and /ipns.
! J- Z! `: D  t8 m8 G( GAs a mounted personal sync folder that automatically
8 u: L2 b& J: q; Z0 yversions, publishes, and backs up any writes.& {# f; j9 w' M8 R
As an encrypted file or data sharing system.
/ ?$ [% L( N: s. ?As a versioned package manager for all software." H' k" z9 o$ E, W- r# U4 e
As the root filesystem of a Virtual Machine.& t# n$ f8 q% Z# O
As the boot filesystem of a VM (under a hypervisor).
) _7 G% A* `8 Y  }. DAs a database: applications can write directly to the
4 r+ ~- w- a+ X% I/ d& D. f6 x& _Merkle DAG data model and get all the versioning,5 V. T6 }% G" |
caching, and distribution IPFS provides.
+ K! u8 l* |; k( wAs a linked (and encrypted) communications platform.7 Z+ I9 q3 y; R$ W: A0 ?! M7 x
As an integrity checked CDN for large files (without
/ E. Q; _' I2 S/ }- hSSL).
* M0 l. e& B# a1 r; HAs an encrypted CDN.
9 w* ^# _- \& d8 HOn webpages, as a web CDN.
  @& B9 |$ i* R& E" m% |As a new Permanent Web where links do not die.
2 \+ l; L  f; Y( O·8 y; J( O2 A: R  E
体验& v1 c% E5 D3 S3 f6 p: s2 U. a' }
我想从第一个应用场景开始,开启我们的应用旅程。
* @; X  R3 M) m这个场景可以把它想象成一个特别的"云盘",这个"云盘"不依赖任何云存储商,不依赖任何平台账号,不用担心云盘提供商的内容审核,不用担心个人隐私的泄密,不用担心内容丢失或被篡改。这些特性希望通过后面的介绍,大家能够自己体会到。可以先试想下,平常我们使用云盘的几个基本需求:+ T) H$ q# y* A% _
上传文件下载文件分享文件
8 l: E$ ]2 k1 w: G; I/ E- L下面我们看IPFS如何作为一个“云盘”,来满足这些基本需求的。参考官方的get-start.
6 d" H0 Q: V9 h  v$ a

5 F& ~9 U: Y4 d) g/ i7 ]% q8 h·" s9 B7 s6 l0 }3 @: W4 X! m
下载Daemon6 h6 o; k. l$ A: W
首先下载官方提供了IPFS的Demo,比较完整的版本是Go实现的,目前最新版本是0.4.15,包含多个平台的版本,以windows 64bit系统为例,下载go-ipfs_v0.4.15_windows-amd64\go-ipfs,由于网络限制,可能有些同学无法下载,我这边上传了一个到IPFS网络上,有需要的同学可以直接下载。6 T6 E. A& Z* B  S% [; X
这个demo中提供了Node/Cli/Http api/Http Gateway/Library/webUi功能,本文中暂使用CLI的来体验IPFS的基本功能,为了方便在cmd直接执行IPFS命令,可以将Go-ipfs加入环境变量path中。# p& E! |( L4 p7 w. ^
初始化- K: [* D8 A- X6 `5 ~( _
> ipfs init6 ?* L0 \3 _  P
执行初始化之后,user路径下会多了一个.ipfs的文件夹,其中有一个config文件,记录的是IPFS的配置,配置内容后续的讲述中会慢慢涉及,此刻我们先了解的是IPFS节点的身份标识Identity,其中peerid,是本机IPFS的地址,下文中IPNS的使用中会涉及到peerid。当然,peerid可以通过命令行直接查看:
# u  Q$ l; Q% e: t> ipfs id
: D5 n) ^: [8 v, T' h( U; v·
( i/ J! s0 i6 G' b1 H$ I4 w启动Deamon
7 Z9 b1 F$ j& w# p: D执行
6 s  O3 L3 I# Q  _$ D+ l> ipfs daemon+ w. C5 W1 B# l# }
开启deamon之后,会启动demo中包含的IPFS服务,至此,本机就可以作为一个"个人云盘"来使用了。0 U, l9 u1 N( Q* n
·$ V2 [+ O$ Y$ e- ~, r
上传文件6 h' L. H& v3 n) G' b/ h
> ipfs add  //添加文件7 M% f+ d7 w+ \1 v% }8 u# l* p4 n' P
> ipfs add -r  //添加文件9 Y& F* J" t# j  g
文件添加时,大文件会按照256KB的大小去分块,分块内容存储在.ipfs repo下的blocks文件夹下,每一个块都对应一个hash。文件添加完成之后,会返回一个文件hash,文件夹是递归添加的,会将每一个文件的hash返回,最后一个返回文件夹hash。由于IPFS中,文件都是基于内容寻址的,用户不需要关心这些文件放在哪,这些hash就是用来查找和得到文件的索引。1 H( g: o) a5 @
·- F/ g/ X; ?" N7 F0 k( F4 b, _) |
下载文件  E' g- X# q( i9 ?& u$ ?( p
想要拿到一个IPFS上的文件,只需要知道文件的hash即可。8 `- u/ E4 ~7 D- B
下载命令:" ?) ], `  M& q8 U( F. t7 d
> ipfs get  -o
) F6 m& W, S; b/ a0 e9 n5 t* r或者查看命令:, H4 ?2 ]- X* w
> ipfs cat 9 C) I1 w; n! m9 a
IPFS 的所有文件都是在本地的,Pin add可以将远端节点的文件长期保留在本地,不被垃圾回收。通过 add 添加的文件默认就是pin过的。* H. w6 H8 v/ i' E7 I, S
pin还有一个作用,pin add之后,这个节点就可以同add这个文件的节点一样,作为整个文件的服务节点。其他节点在get或pin add的时候理论上可以从这2个节点的任何一个节点拿去这个文件的块。当有很多个节点都pin add这个文件时,就会增加这个文件的获取速度,也降低了文件被删除的可能。
: D- i( j2 ?5 o7 {! y' I6 s3 ^> ipfs pin add
2 J4 s' d9 Q$ |4 N* ]' B> ipfs pin ls //查看哪些文件在本地是持久化的。
% p0 @) p% L4 S5 x+ d  x" p% O·9 W( M2 R2 k. J
分享文件
* Y3 V) u) m( a' [2 {' l2 A现实中,用户习惯获取内容的方式都通过http的方式,让用户去敲get命令去或取文件恐怕只有极客们会尝试吧。回想一下,云盘分享文件的做法,生成一个http url,把链接分享给需要的人。/ A3 @7 R  {" a, @0 F0 g% U6 D" _
IPFS demo也提供了一个http gateway,官方(公网)用的是 http://ipfs.io ,所以分享的链接可以是:5 T% j3 _: V! {
[url=]http://ipfs.io/ipfs/
( [: r( V; o: \8 f由于某些已知原因,ipfs.io这个网关在国内是没法正常使用的,因此有条件的可以在自己的服务器上部署一个IPFS gateway(Ipfs 私网),这样,分享的链接可以是& m9 H9 z4 `/ ]3 l! I9 B: y3 T
http:///ipfs/* x1 e' H& R* C3 I
·" a" P2 z6 M1 Z6 O
IPNS8 `3 \: Q: w2 F! h& X! t, F
到现在,我们分享文件还是不断地发送一个个hash组成的url,每分享一个文件就会重新生成一个url,那么可以有一固定的"网址”给我们来看你的分享呢?当然可以。这就需要借助IPNS。具体做法是+ @6 i0 W  f& V+ r
> ipfs name publish : h1 o# X) M' {; P+ F) _1 ^: i
这条命令相当于把文件的hash和IPFS的节点绑定,这样就可以通过一个不变的地址来访问publish的文件7 t3 g$ Z; ?1 o7 Q
http:///ipns/
* N. S( s' ^2 p! }% i; N7 {peerid即之前介绍的本节点的唯一标识。
  c  M  y" i6 R% d: n0 \+ u这样做的有一个很大的缺陷,就是每次这个链接指向的都是最后一条publish的内容。但是有解决方法,大家可以查看我的博客的关于页,我的IPFS主页。实现方式其实很简单,就是将将分享文件url的列表publish到ipns上。后续可能会再写一篇博文介绍做法。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

繁星如尘 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2