Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

IPFS实践之初体验

繁星如尘
161 0 0
IPFS的全称是InterPlanetary File System(星际文件系统),从名称上看,这是一个很炫酷、很有野心的项目。简单地说它就是一个点对点的分布式文件系统。官网和github都可以找到所有的相关资料。建议从它的白皮书,和直译中文版本开始了解,后面我们会慢慢地认识它。白皮书上指出了多个应用场景:
& X5 d4 ~3 b, J5 ^0 l+ FAs a mounted global filesystem, under /ipfs and /ipns.
5 ?* B( t4 N  E; O3 `As a mounted personal sync folder that automatically1 ~4 G5 Z7 {! v) h& L
versions, publishes, and backs up any writes.
# E# G' K" ]1 G3 [As an encrypted file or data sharing system.* w+ E* b" y) B9 ^! M* N
As a versioned package manager for all software.4 {  Y# S2 S) @2 K  Q
As the root filesystem of a Virtual Machine.
! c: c' T* f! A/ NAs the boot filesystem of a VM (under a hypervisor).% e, n& O. I) w3 P) {. z. G
As a database: applications can write directly to the
" d' @( \( d2 \6 g. k( B) mMerkle DAG data model and get all the versioning,
. N4 b) Q" M$ F2 [caching, and distribution IPFS provides.- o4 B( U  Z" F, S
As a linked (and encrypted) communications platform.) x* z! A( s* G* C. F. f' ~
As an integrity checked CDN for large files (without
8 S1 M( r/ I& Z3 nSSL).
" d) d% C0 t0 |* @As an encrypted CDN.
1 y9 ^+ J8 }: sOn webpages, as a web CDN.! I) w# b) C) y; n
As a new Permanent Web where links do not die.. B5 ?- C5 B$ N5 @
·
2 T' x8 q; M1 ^6 k体验1 d1 d' |# q! ?! \2 Z
我想从第一个应用场景开始,开启我们的应用旅程。
9 B; \; r3 b$ c. M, [4 Q! L这个场景可以把它想象成一个特别的"云盘",这个"云盘"不依赖任何云存储商,不依赖任何平台账号,不用担心云盘提供商的内容审核,不用担心个人隐私的泄密,不用担心内容丢失或被篡改。这些特性希望通过后面的介绍,大家能够自己体会到。可以先试想下,平常我们使用云盘的几个基本需求:9 w% n4 ?7 z/ G- I. J- o
上传文件下载文件分享文件6 a# b% {' h/ U, T
下面我们看IPFS如何作为一个“云盘”,来满足这些基本需求的。参考官方的get-start.
) s7 q+ s5 z7 E& s9 B
: p% U6 u7 o( N+ n! q
·) T, i: Z7 T* r/ G- R7 F" W  `8 _
下载Daemon4 A' l# `, @) G) o" N  e
首先下载官方提供了IPFS的Demo,比较完整的版本是Go实现的,目前最新版本是0.4.15,包含多个平台的版本,以windows 64bit系统为例,下载go-ipfs_v0.4.15_windows-amd64\go-ipfs,由于网络限制,可能有些同学无法下载,我这边上传了一个到IPFS网络上,有需要的同学可以直接下载。
+ h. E# }1 s% v/ [7 q. X# q- {9 w! B2 }这个demo中提供了Node/Cli/Http api/Http Gateway/Library/webUi功能,本文中暂使用CLI的来体验IPFS的基本功能,为了方便在cmd直接执行IPFS命令,可以将Go-ipfs加入环境变量path中。
+ D% ]3 @1 q* u* e初始化- a( P# e1 {! x- U; |1 p
> ipfs init
9 K  u( J: K9 M, I9 l; L. i+ _执行初始化之后,user路径下会多了一个.ipfs的文件夹,其中有一个config文件,记录的是IPFS的配置,配置内容后续的讲述中会慢慢涉及,此刻我们先了解的是IPFS节点的身份标识Identity,其中peerid,是本机IPFS的地址,下文中IPNS的使用中会涉及到peerid。当然,peerid可以通过命令行直接查看:5 U* }/ A6 P& d& T3 o9 b
> ipfs id- E9 O( \) D4 p  r" J
·
, _  @' Z8 c+ g. X启动Deamon, d+ E: p6 b! k. Z
执行7 U( }9 V: K: \: U7 D  [6 X
> ipfs daemon
& u7 u1 q$ p+ a9 t1 x开启deamon之后,会启动demo中包含的IPFS服务,至此,本机就可以作为一个"个人云盘"来使用了。: p  w9 G$ H' [1 u( Q4 Q
·
( {9 m/ o  E* C- b3 l上传文件
0 [( M& q) K0 k6 @3 e' F3 ?> ipfs add  //添加文件! D. T  D+ f( x9 a( f, D6 q
> ipfs add -r  //添加文件: f! q* {6 Y6 q: |
文件添加时,大文件会按照256KB的大小去分块,分块内容存储在.ipfs repo下的blocks文件夹下,每一个块都对应一个hash。文件添加完成之后,会返回一个文件hash,文件夹是递归添加的,会将每一个文件的hash返回,最后一个返回文件夹hash。由于IPFS中,文件都是基于内容寻址的,用户不需要关心这些文件放在哪,这些hash就是用来查找和得到文件的索引。
  _8 Z  s9 `% e- G·
1 a* @( ?; |; U5 `1 |+ Z下载文件: [% H8 `" Q2 M3 `' M, l1 W
想要拿到一个IPFS上的文件,只需要知道文件的hash即可。
" u4 v, [' s+ t下载命令:, Q+ ~/ F9 m4 a( v0 c
> ipfs get  -o 7 t, ~4 Q, ?+ Y4 B# D
或者查看命令:8 Y0 K) o+ d/ e# H7 Z* l. N
> ipfs cat 6 I: n* ^- p3 U. c
IPFS 的所有文件都是在本地的,Pin add可以将远端节点的文件长期保留在本地,不被垃圾回收。通过 add 添加的文件默认就是pin过的。
& Y; t: i4 y% |' U% X. C: M/ O/ H1 hpin还有一个作用,pin add之后,这个节点就可以同add这个文件的节点一样,作为整个文件的服务节点。其他节点在get或pin add的时候理论上可以从这2个节点的任何一个节点拿去这个文件的块。当有很多个节点都pin add这个文件时,就会增加这个文件的获取速度,也降低了文件被删除的可能。7 I, A9 L/ K4 u; w- V% C# j
> ipfs pin add
/ J$ \4 ?- `8 j8 t) k> ipfs pin ls //查看哪些文件在本地是持久化的。; J) k/ S. z0 S1 J" G) m2 W
·
9 w! I" `& ^2 V8 T% u分享文件7 z0 Y- p; q% y- o
现实中,用户习惯获取内容的方式都通过http的方式,让用户去敲get命令去或取文件恐怕只有极客们会尝试吧。回想一下,云盘分享文件的做法,生成一个http url,把链接分享给需要的人。- u3 P. T1 d: v+ d8 D
IPFS demo也提供了一个http gateway,官方(公网)用的是 http://ipfs.io ,所以分享的链接可以是:
; Z. h/ E0 \8 U2 q1 k[url=]http://ipfs.io/ipfs/, ]$ i3 _; e) q* a2 O- F( `" g
由于某些已知原因,ipfs.io这个网关在国内是没法正常使用的,因此有条件的可以在自己的服务器上部署一个IPFS gateway(Ipfs 私网),这样,分享的链接可以是
3 _! m+ f- [" L; n) t8 Z5 b4 qhttp:///ipfs/
' o' Y+ {8 P3 [- P1 B7 N% e2 a% u- |·
. e' T0 T$ w% F: ZIPNS
$ N4 `5 X% L* y0 r  w+ t* W& U- ?到现在,我们分享文件还是不断地发送一个个hash组成的url,每分享一个文件就会重新生成一个url,那么可以有一固定的"网址”给我们来看你的分享呢?当然可以。这就需要借助IPNS。具体做法是, a" _, {& L$ G6 S
> ipfs name publish
( B) @. H  v% i* Z这条命令相当于把文件的hash和IPFS的节点绑定,这样就可以通过一个不变的地址来访问publish的文件
: g. t4 R& W& a1 f5 ]8 mhttp:///ipns/# l5 A" U) c* m4 O" M6 s2 B: z
peerid即之前介绍的本节点的唯一标识。
" W+ }3 Y4 h) V3 a: l这样做的有一个很大的缺陷,就是每次这个链接指向的都是最后一条publish的内容。但是有解决方法,大家可以查看我的博客的关于页,我的IPFS主页。实现方式其实很简单,就是将将分享文件url的列表publish到ipns上。后续可能会再写一篇博文介绍做法。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

繁星如尘 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2