Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

IPFS实践之初体验

繁星如尘
165 0 0
IPFS的全称是InterPlanetary File System(星际文件系统),从名称上看,这是一个很炫酷、很有野心的项目。简单地说它就是一个点对点的分布式文件系统。官网和github都可以找到所有的相关资料。建议从它的白皮书,和直译中文版本开始了解,后面我们会慢慢地认识它。白皮书上指出了多个应用场景:( S' H0 b' o/ t. a- A8 A% y8 f
As a mounted global filesystem, under /ipfs and /ipns.
% |! W% {/ x9 n# }6 b( ?As a mounted personal sync folder that automatically
/ y# \6 `1 k" d( L# Y. O9 Q6 Vversions, publishes, and backs up any writes.
9 E" l  |, ~& n; x4 e$ tAs an encrypted file or data sharing system.
- t& T4 `3 v3 ~. wAs a versioned package manager for all software.3 M2 H+ c$ u$ j9 a5 G
As the root filesystem of a Virtual Machine.
1 U9 b2 y# q2 P" e0 L2 T. f9 V' {As the boot filesystem of a VM (under a hypervisor).$ [6 Q: e7 p' i/ h
As a database: applications can write directly to the! ?5 e) v0 V7 E4 l' \. F' G
Merkle DAG data model and get all the versioning,
1 R0 C" Q6 z( H' Y0 L+ Ncaching, and distribution IPFS provides.
: `0 A) x+ d3 M- v. ZAs a linked (and encrypted) communications platform.
6 G! q3 ~. ?* O- R  c4 H9 r2 D5 q* jAs an integrity checked CDN for large files (without
2 x. W+ j3 L  d3 {$ LSSL).4 |0 E2 D9 `7 p( R3 g0 \& O2 v6 m
As an encrypted CDN.
8 \0 {* P$ W  \8 H2 X: R% B8 wOn webpages, as a web CDN.
, O  {0 l; d) t8 h- H- hAs a new Permanent Web where links do not die.0 d. e5 N9 F, k; l, S
·
: Z3 g5 F0 Q' l体验2 x% d/ R! k# x; x2 x* k
我想从第一个应用场景开始,开启我们的应用旅程。5 J8 x4 a% R7 Y' E3 H: A* }9 X
这个场景可以把它想象成一个特别的"云盘",这个"云盘"不依赖任何云存储商,不依赖任何平台账号,不用担心云盘提供商的内容审核,不用担心个人隐私的泄密,不用担心内容丢失或被篡改。这些特性希望通过后面的介绍,大家能够自己体会到。可以先试想下,平常我们使用云盘的几个基本需求:
3 g4 T  a- m9 L+ f  r上传文件下载文件分享文件/ @- i8 r6 {4 {  O( r
下面我们看IPFS如何作为一个“云盘”,来满足这些基本需求的。参考官方的get-start." j4 C2 Z( n0 S1 t5 C

: E$ ^# g0 u7 o  B$ _·" u, H( z  F# h5 w& h
下载Daemon" [% Q3 Z4 ?0 h0 x% W7 u
首先下载官方提供了IPFS的Demo,比较完整的版本是Go实现的,目前最新版本是0.4.15,包含多个平台的版本,以windows 64bit系统为例,下载go-ipfs_v0.4.15_windows-amd64\go-ipfs,由于网络限制,可能有些同学无法下载,我这边上传了一个到IPFS网络上,有需要的同学可以直接下载。6 d2 S& X& C% G7 U8 U
这个demo中提供了Node/Cli/Http api/Http Gateway/Library/webUi功能,本文中暂使用CLI的来体验IPFS的基本功能,为了方便在cmd直接执行IPFS命令,可以将Go-ipfs加入环境变量path中。* w# I# V+ \6 ?" R
初始化
' M  u" z( x& |# ?: u> ipfs init* u" r/ P/ O, W$ s* ]2 M
执行初始化之后,user路径下会多了一个.ipfs的文件夹,其中有一个config文件,记录的是IPFS的配置,配置内容后续的讲述中会慢慢涉及,此刻我们先了解的是IPFS节点的身份标识Identity,其中peerid,是本机IPFS的地址,下文中IPNS的使用中会涉及到peerid。当然,peerid可以通过命令行直接查看:# [3 i$ [8 [8 Y4 j
> ipfs id6 J2 Q1 k/ B- Y! }
·2 `! J0 ~) N/ |6 x2 p! G2 g% p1 e8 j
启动Deamon( e- C2 T* d6 K4 D9 P+ x2 w
执行
7 S4 v! P9 D( E> ipfs daemon
& s  s$ N6 ~3 F, S6 w# n% X5 |0 t开启deamon之后,会启动demo中包含的IPFS服务,至此,本机就可以作为一个"个人云盘"来使用了。
' c7 X( i4 `& o  B·$ a* @) _, \: D- d
上传文件
7 |5 x. U0 h% n> ipfs add  //添加文件
: B( P& P- g/ b% R% U) B, a& q> ipfs add -r  //添加文件7 ~* p+ C2 z- |' P( s# Q2 I9 D3 {
文件添加时,大文件会按照256KB的大小去分块,分块内容存储在.ipfs repo下的blocks文件夹下,每一个块都对应一个hash。文件添加完成之后,会返回一个文件hash,文件夹是递归添加的,会将每一个文件的hash返回,最后一个返回文件夹hash。由于IPFS中,文件都是基于内容寻址的,用户不需要关心这些文件放在哪,这些hash就是用来查找和得到文件的索引。2 |: b3 J) P( ^+ c4 _0 Q$ G
·; B% J2 t5 G+ l, a
下载文件
! r' V+ f: D% e% T# I想要拿到一个IPFS上的文件,只需要知道文件的hash即可。+ d) ]: e( V/ U# l' \! V
下载命令:' \' o0 l4 e9 f  q
> ipfs get  -o
9 `8 o  \9 q2 z5 ^( j' l或者查看命令:( H0 ]9 G9 `$ i
> ipfs cat
9 F  O9 G9 D. B( I0 I; iIPFS 的所有文件都是在本地的,Pin add可以将远端节点的文件长期保留在本地,不被垃圾回收。通过 add 添加的文件默认就是pin过的。
5 Z' T8 z& l" K5 F5 I" jpin还有一个作用,pin add之后,这个节点就可以同add这个文件的节点一样,作为整个文件的服务节点。其他节点在get或pin add的时候理论上可以从这2个节点的任何一个节点拿去这个文件的块。当有很多个节点都pin add这个文件时,就会增加这个文件的获取速度,也降低了文件被删除的可能。
8 z( Z8 s% D: z  M4 [> ipfs pin add ; ?8 d$ G1 p! G, S0 L) h# D4 b
> ipfs pin ls //查看哪些文件在本地是持久化的。
8 r$ n: O9 D( T/ L1 x·1 t: Y0 f9 e& o) c8 G1 K
分享文件- q9 R  t3 L, W! k' M' w& b
现实中,用户习惯获取内容的方式都通过http的方式,让用户去敲get命令去或取文件恐怕只有极客们会尝试吧。回想一下,云盘分享文件的做法,生成一个http url,把链接分享给需要的人。
% B% Q3 n7 R+ o2 M3 j: W. r( gIPFS demo也提供了一个http gateway,官方(公网)用的是 http://ipfs.io ,所以分享的链接可以是:
' \- V1 C& H: G2 L/ H4 G: H[url=]http://ipfs.io/ipfs/
) ?7 t6 o. v7 f  V1 ~由于某些已知原因,ipfs.io这个网关在国内是没法正常使用的,因此有条件的可以在自己的服务器上部署一个IPFS gateway(Ipfs 私网),这样,分享的链接可以是
6 T0 F( ^! I6 w$ m$ Ehttp:///ipfs/+ P% l4 E3 _7 m- P( d4 Y
·6 y1 J# u4 Q/ v0 y1 @. x+ F4 W
IPNS
3 B# ^4 x% G% A8 t1 m- g9 s) Y5 Z到现在,我们分享文件还是不断地发送一个个hash组成的url,每分享一个文件就会重新生成一个url,那么可以有一固定的"网址”给我们来看你的分享呢?当然可以。这就需要借助IPNS。具体做法是
, W; d3 |( J/ P/ {> ipfs name publish
$ p* G: Z; t& R7 r这条命令相当于把文件的hash和IPFS的节点绑定,这样就可以通过一个不变的地址来访问publish的文件% k. i; `) f  M$ @- g' X1 ~& [
http:///ipns/7 Z; Z4 k8 u9 N' M1 p
peerid即之前介绍的本节点的唯一标识。
; }9 T! H/ \% F. P7 N) y% H+ w这样做的有一个很大的缺陷,就是每次这个链接指向的都是最后一条publish的内容。但是有解决方法,大家可以查看我的博客的关于页,我的IPFS主页。实现方式其实很简单,就是将将分享文件url的列表publish到ipns上。后续可能会再写一篇博文介绍做法。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

繁星如尘 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2