Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

IPFS实践之初体验

繁星如尘
164 0 0
IPFS的全称是InterPlanetary File System(星际文件系统),从名称上看,这是一个很炫酷、很有野心的项目。简单地说它就是一个点对点的分布式文件系统。官网和github都可以找到所有的相关资料。建议从它的白皮书,和直译中文版本开始了解,后面我们会慢慢地认识它。白皮书上指出了多个应用场景:* {5 w6 u( J- C2 L" }, b
As a mounted global filesystem, under /ipfs and /ipns.- o" C& Z. ~5 b; I. o0 L
As a mounted personal sync folder that automatically
* {  @+ Q  B, Zversions, publishes, and backs up any writes.
) [9 M) ~  ?* s+ Y% {$ }As an encrypted file or data sharing system.
* Q, s" V6 o, M' oAs a versioned package manager for all software.6 h0 N+ n1 l' t' z
As the root filesystem of a Virtual Machine.
6 {, X, c8 Z1 g3 X. i0 H: D  Q. n6 [As the boot filesystem of a VM (under a hypervisor).
. \) `0 S3 o' G. F6 M: |+ LAs a database: applications can write directly to the
; \; O; r4 Y8 m. `7 eMerkle DAG data model and get all the versioning,
! Z5 y. ?# O7 X4 e( x  q# g6 |caching, and distribution IPFS provides./ q4 r1 i! x& s# J% i
As a linked (and encrypted) communications platform.& Y. \0 `& s. [# Z( l
As an integrity checked CDN for large files (without
  {/ e  w0 n/ t$ N0 u8 G" RSSL).
, X, q- V! L7 M5 z3 bAs an encrypted CDN.0 }2 z, f3 H3 o+ q; e, ]
On webpages, as a web CDN.( S4 A' `. q- y* M
As a new Permanent Web where links do not die.7 X+ Q9 d9 [! u
·
9 W3 Y/ H; N, E; J( v+ X7 s体验( @( K6 }# {0 B9 i$ p
我想从第一个应用场景开始,开启我们的应用旅程。
; ~" v3 E, H9 J8 l这个场景可以把它想象成一个特别的"云盘",这个"云盘"不依赖任何云存储商,不依赖任何平台账号,不用担心云盘提供商的内容审核,不用担心个人隐私的泄密,不用担心内容丢失或被篡改。这些特性希望通过后面的介绍,大家能够自己体会到。可以先试想下,平常我们使用云盘的几个基本需求:
7 W' E( N0 o3 A) x0 P( c# M  l上传文件下载文件分享文件
) I* `2 B$ s2 k6 b1 c# X7 \下面我们看IPFS如何作为一个“云盘”,来满足这些基本需求的。参考官方的get-start.8 r$ Q* }( E3 k% ^" L4 B
' C, k7 E6 B6 p! h' p, y
·+ b0 q# g: `# c5 @' [& H
下载Daemon
; G9 t) ^# c! ~7 s% h* p首先下载官方提供了IPFS的Demo,比较完整的版本是Go实现的,目前最新版本是0.4.15,包含多个平台的版本,以windows 64bit系统为例,下载go-ipfs_v0.4.15_windows-amd64\go-ipfs,由于网络限制,可能有些同学无法下载,我这边上传了一个到IPFS网络上,有需要的同学可以直接下载。
1 r1 |- }/ e0 g8 {6 i) ]这个demo中提供了Node/Cli/Http api/Http Gateway/Library/webUi功能,本文中暂使用CLI的来体验IPFS的基本功能,为了方便在cmd直接执行IPFS命令,可以将Go-ipfs加入环境变量path中。$ M: i! N9 c/ I* t+ s# h. \5 r
初始化' ^& z0 @6 E/ J' @7 C
> ipfs init: I2 [! G% w9 M& v5 R1 e
执行初始化之后,user路径下会多了一个.ipfs的文件夹,其中有一个config文件,记录的是IPFS的配置,配置内容后续的讲述中会慢慢涉及,此刻我们先了解的是IPFS节点的身份标识Identity,其中peerid,是本机IPFS的地址,下文中IPNS的使用中会涉及到peerid。当然,peerid可以通过命令行直接查看:2 ?6 d( f! ~' [* g8 Z
> ipfs id
2 G. G* n/ A5 H& h7 G·7 ^) c1 D4 K* o
启动Deamon
* W2 A& [# u5 l* D( M% G执行# S  f7 R9 {: r& m4 _7 b8 k* F
> ipfs daemon
$ x0 W# b; s" ]* k8 K3 ?开启deamon之后,会启动demo中包含的IPFS服务,至此,本机就可以作为一个"个人云盘"来使用了。
& f+ A" q) D9 m$ P2 A4 b4 v% ^·
4 m( c# v' Z( i  k0 I/ F1 P上传文件
) c$ ?& U9 K" L* t& P* N! s7 F. b> ipfs add  //添加文件
5 v: A5 K4 ^8 W+ h) W6 N6 y  F> ipfs add -r  //添加文件% y; @- n. @6 }! j
文件添加时,大文件会按照256KB的大小去分块,分块内容存储在.ipfs repo下的blocks文件夹下,每一个块都对应一个hash。文件添加完成之后,会返回一个文件hash,文件夹是递归添加的,会将每一个文件的hash返回,最后一个返回文件夹hash。由于IPFS中,文件都是基于内容寻址的,用户不需要关心这些文件放在哪,这些hash就是用来查找和得到文件的索引。
/ G! n) F; V! E5 F4 `. `; Y% K! M·  x) b0 o) d2 {) Q* q! r  F
下载文件
7 P# ?3 \- X5 u4 D& u& t! _' H' f想要拿到一个IPFS上的文件,只需要知道文件的hash即可。7 ?% ^% i/ G) q
下载命令:: N# ?. k- v- v. t- A
> ipfs get  -o
/ }) X9 h  m, b或者查看命令:1 @* f. H& Q, [  v1 d" S
> ipfs cat
4 b0 _# b' B) @# a- e+ c, x6 \/ VIPFS 的所有文件都是在本地的,Pin add可以将远端节点的文件长期保留在本地,不被垃圾回收。通过 add 添加的文件默认就是pin过的。2 @/ W& M1 c& }2 f( y9 R% a# \- f
pin还有一个作用,pin add之后,这个节点就可以同add这个文件的节点一样,作为整个文件的服务节点。其他节点在get或pin add的时候理论上可以从这2个节点的任何一个节点拿去这个文件的块。当有很多个节点都pin add这个文件时,就会增加这个文件的获取速度,也降低了文件被删除的可能。, p/ ^: L7 _& p! X
> ipfs pin add / F; M8 r; {" i" g
> ipfs pin ls //查看哪些文件在本地是持久化的。+ G" H: Z8 ]; \4 @1 x
·! q5 `! N8 I, [& `& k# V6 t8 a
分享文件
4 S/ w" z4 L: ?2 E现实中,用户习惯获取内容的方式都通过http的方式,让用户去敲get命令去或取文件恐怕只有极客们会尝试吧。回想一下,云盘分享文件的做法,生成一个http url,把链接分享给需要的人。! D. n. `8 P+ _0 @/ r
IPFS demo也提供了一个http gateway,官方(公网)用的是 http://ipfs.io ,所以分享的链接可以是:
  E  h! ^! C+ Z2 Y+ v[url=]http://ipfs.io/ipfs/
9 v4 c2 s" n( `- A. ^/ {0 N! L由于某些已知原因,ipfs.io这个网关在国内是没法正常使用的,因此有条件的可以在自己的服务器上部署一个IPFS gateway(Ipfs 私网),这样,分享的链接可以是
- U* k# p& y9 Y; S3 n- Y) qhttp:///ipfs/
" @  S, C; S1 @; w- ^/ J' m·, F+ L$ Z7 o) A6 e, Q7 q" a
IPNS
" H+ K/ c* @4 L9 S9 {7 ~到现在,我们分享文件还是不断地发送一个个hash组成的url,每分享一个文件就会重新生成一个url,那么可以有一固定的"网址”给我们来看你的分享呢?当然可以。这就需要借助IPNS。具体做法是
& d- V7 z3 l+ p% F4 ?6 D6 `7 m" S> ipfs name publish " K9 k6 u3 P. O% L4 a' W- i2 m
这条命令相当于把文件的hash和IPFS的节点绑定,这样就可以通过一个不变的地址来访问publish的文件1 u8 Y9 S2 B( H  @" J3 z
http:///ipns/: m/ i) t% ~) K; K1 m2 G
peerid即之前介绍的本节点的唯一标识。5 Z! v8 Z$ {1 ]) L
这样做的有一个很大的缺陷,就是每次这个链接指向的都是最后一条publish的内容。但是有解决方法,大家可以查看我的博客的关于页,我的IPFS主页。实现方式其实很简单,就是将将分享文件url的列表publish到ipns上。后续可能会再写一篇博文介绍做法。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

繁星如尘 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2