Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

IPFS实践之初体验

繁星如尘
101 0 0
IPFS的全称是InterPlanetary File System(星际文件系统),从名称上看,这是一个很炫酷、很有野心的项目。简单地说它就是一个点对点的分布式文件系统。官网和github都可以找到所有的相关资料。建议从它的白皮书,和直译中文版本开始了解,后面我们会慢慢地认识它。白皮书上指出了多个应用场景:
- H* ~+ i0 P3 o5 \As a mounted global filesystem, under /ipfs and /ipns.
) \7 C; n! J$ J( U5 xAs a mounted personal sync folder that automatically1 k) Q8 C& |- ?' i4 B9 v
versions, publishes, and backs up any writes.0 g3 V6 ~- V" T2 q
As an encrypted file or data sharing system.1 B4 R; |5 e3 w* f$ u4 `
As a versioned package manager for all software.6 S/ s! n  |  p2 q+ n
As the root filesystem of a Virtual Machine.- {" N) E5 [( [, F3 J. o5 J% k  J
As the boot filesystem of a VM (under a hypervisor).
$ H( m- Q* }6 G& F+ nAs a database: applications can write directly to the
+ Y0 o. g5 t; D; s$ WMerkle DAG data model and get all the versioning,
( S* ^8 j' G. F( q- jcaching, and distribution IPFS provides.
0 E8 d) V( f0 DAs a linked (and encrypted) communications platform.( u2 M* J' Q1 T5 X$ I# `9 H
As an integrity checked CDN for large files (without, z, X1 W5 R( q  _
SSL).
1 O5 c- d! a, _: h6 ]As an encrypted CDN.
# q' E1 g0 t7 e: q' f4 }! MOn webpages, as a web CDN.5 D" N4 c' X) E7 F! w) P
As a new Permanent Web where links do not die.
4 r- G: t& Q1 d( P·
8 U5 x, w3 q  ?- ^7 z$ y体验
5 B; H( e( {% P* D) [3 M  q我想从第一个应用场景开始,开启我们的应用旅程。
. V6 F1 ~' Z; ], B0 s8 y这个场景可以把它想象成一个特别的"云盘",这个"云盘"不依赖任何云存储商,不依赖任何平台账号,不用担心云盘提供商的内容审核,不用担心个人隐私的泄密,不用担心内容丢失或被篡改。这些特性希望通过后面的介绍,大家能够自己体会到。可以先试想下,平常我们使用云盘的几个基本需求:
) P& E- r$ x* `6 J( u上传文件下载文件分享文件
! c" m4 o5 o$ [- R6 a$ |下面我们看IPFS如何作为一个“云盘”,来满足这些基本需求的。参考官方的get-start.
" P+ ]" r9 L# h

# ~9 k5 A+ D3 K  ^·" j9 D. B1 \- ]+ M9 D! P9 R( s
下载Daemon
1 m/ @4 s' d) e3 |3 P$ f" O$ B首先下载官方提供了IPFS的Demo,比较完整的版本是Go实现的,目前最新版本是0.4.15,包含多个平台的版本,以windows 64bit系统为例,下载go-ipfs_v0.4.15_windows-amd64\go-ipfs,由于网络限制,可能有些同学无法下载,我这边上传了一个到IPFS网络上,有需要的同学可以直接下载。
- _: ?, H/ ?: e% i, @这个demo中提供了Node/Cli/Http api/Http Gateway/Library/webUi功能,本文中暂使用CLI的来体验IPFS的基本功能,为了方便在cmd直接执行IPFS命令,可以将Go-ipfs加入环境变量path中。
) G! s. y7 K6 w1 W$ r" B- A& {初始化
; F8 J/ \4 l9 A> ipfs init! @% S' D, d2 a# s9 a. _
执行初始化之后,user路径下会多了一个.ipfs的文件夹,其中有一个config文件,记录的是IPFS的配置,配置内容后续的讲述中会慢慢涉及,此刻我们先了解的是IPFS节点的身份标识Identity,其中peerid,是本机IPFS的地址,下文中IPNS的使用中会涉及到peerid。当然,peerid可以通过命令行直接查看:
& x4 U( E. ~) d7 X, _. G/ J( c> ipfs id
1 n, M1 ~# k' K% A·1 d& N5 Y* W7 K5 g
启动Deamon$ Y: @* l- L) f0 u
执行
" f( X( M; c/ o+ L> ipfs daemon
1 j: @% A2 j. ]! f, N- Y开启deamon之后,会启动demo中包含的IPFS服务,至此,本机就可以作为一个"个人云盘"来使用了。
" d! K+ v5 w% m4 v·
' |7 o% ]1 D; ?$ j1 u( e上传文件$ O  z2 R: K6 y" N
> ipfs add  //添加文件& E" h0 t" u+ w5 L/ k, e3 ^9 N
> ipfs add -r  //添加文件# Y# L" K7 y7 o( `/ m9 `# K
文件添加时,大文件会按照256KB的大小去分块,分块内容存储在.ipfs repo下的blocks文件夹下,每一个块都对应一个hash。文件添加完成之后,会返回一个文件hash,文件夹是递归添加的,会将每一个文件的hash返回,最后一个返回文件夹hash。由于IPFS中,文件都是基于内容寻址的,用户不需要关心这些文件放在哪,这些hash就是用来查找和得到文件的索引。
8 @' o2 ~* t: N9 S4 a" c·
% a, i' R  I1 o" P. h/ d7 a下载文件" W$ Q4 z7 y! T% W
想要拿到一个IPFS上的文件,只需要知道文件的hash即可。  F$ V2 B- Y9 d2 ^" |, D/ Z& I, i
下载命令:
2 e/ i9 X7 F# a4 x% ]> ipfs get  -o
" o" Z% w# W7 `或者查看命令:7 h4 f" P4 Z4 G) _" u) b1 v6 E
> ipfs cat
& ~3 s" r& h+ h/ r$ `IPFS 的所有文件都是在本地的,Pin add可以将远端节点的文件长期保留在本地,不被垃圾回收。通过 add 添加的文件默认就是pin过的。
. o3 e" B7 |, F5 o. w5 y% Upin还有一个作用,pin add之后,这个节点就可以同add这个文件的节点一样,作为整个文件的服务节点。其他节点在get或pin add的时候理论上可以从这2个节点的任何一个节点拿去这个文件的块。当有很多个节点都pin add这个文件时,就会增加这个文件的获取速度,也降低了文件被删除的可能。5 w' o5 Y: N" c  X6 m# M6 J5 j
> ipfs pin add , M7 ~8 N* t- \
> ipfs pin ls //查看哪些文件在本地是持久化的。8 C# v5 g: D; k* ?! x( {) g
·
" j) n% x; l8 P' R$ i+ |分享文件
8 n( ~5 y9 G* V4 ~* L9 @现实中,用户习惯获取内容的方式都通过http的方式,让用户去敲get命令去或取文件恐怕只有极客们会尝试吧。回想一下,云盘分享文件的做法,生成一个http url,把链接分享给需要的人。" Q0 ]: J4 k; }
IPFS demo也提供了一个http gateway,官方(公网)用的是 http://ipfs.io ,所以分享的链接可以是:
( X' }' `; j5 U& H[url=]http://ipfs.io/ipfs/
. N; V4 F5 {& r5 ~  d3 |% T由于某些已知原因,ipfs.io这个网关在国内是没法正常使用的,因此有条件的可以在自己的服务器上部署一个IPFS gateway(Ipfs 私网),这样,分享的链接可以是
. U6 x/ L! F/ @http:///ipfs/
; ^4 R/ K4 i, t: y$ X·
9 H8 Q* x9 K1 u, U  S" ]3 yIPNS2 F# |! U3 x, o- G9 I" p4 M
到现在,我们分享文件还是不断地发送一个个hash组成的url,每分享一个文件就会重新生成一个url,那么可以有一固定的"网址”给我们来看你的分享呢?当然可以。这就需要借助IPNS。具体做法是
& y5 d* a0 [" J4 G> ipfs name publish
+ W) D% `1 j4 a) ~; ~# r6 ?% }3 ^这条命令相当于把文件的hash和IPFS的节点绑定,这样就可以通过一个不变的地址来访问publish的文件
6 b; ^1 V) a- p! h! z$ ohttp:///ipns/! E. q8 i5 V3 R/ g, w/ N( f
peerid即之前介绍的本节点的唯一标识。/ w/ a% N& @3 a
这样做的有一个很大的缺陷,就是每次这个链接指向的都是最后一条publish的内容。但是有解决方法,大家可以查看我的博客的关于页,我的IPFS主页。实现方式其实很简单,就是将将分享文件url的列表publish到ipns上。后续可能会再写一篇博文介绍做法。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

繁星如尘 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2