Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

IPFS实践之初体验

繁星如尘
104 0 0
IPFS的全称是InterPlanetary File System(星际文件系统),从名称上看,这是一个很炫酷、很有野心的项目。简单地说它就是一个点对点的分布式文件系统。官网和github都可以找到所有的相关资料。建议从它的白皮书,和直译中文版本开始了解,后面我们会慢慢地认识它。白皮书上指出了多个应用场景:
/ [( F) K/ v. L7 x( R5 kAs a mounted global filesystem, under /ipfs and /ipns.
6 B6 _& D' W5 }) x$ HAs a mounted personal sync folder that automatically
: D$ f; z' u+ \5 ^versions, publishes, and backs up any writes.( u: ~( m. _. A9 V/ K, y
As an encrypted file or data sharing system.9 \7 R' K. @+ Y# r
As a versioned package manager for all software.+ N" ]- b* p9 c
As the root filesystem of a Virtual Machine.
5 H: r; m$ p# A6 t6 CAs the boot filesystem of a VM (under a hypervisor).- F" e# w' Y; o6 u
As a database: applications can write directly to the5 u. b  A6 l# x3 L- s
Merkle DAG data model and get all the versioning,
2 E* m3 B! l! a9 L! P0 k# i" ecaching, and distribution IPFS provides.1 ]" |9 ?% N! L' ^
As a linked (and encrypted) communications platform.3 |& V" O3 b9 t. H
As an integrity checked CDN for large files (without. g. P% _/ X3 r$ E& m
SSL)., p3 e' b8 Y) g& S7 G8 `1 g6 K3 Q! m
As an encrypted CDN.
" ^: y( F& y; e9 K4 OOn webpages, as a web CDN.
. q$ S) T/ f" o- r4 d* AAs a new Permanent Web where links do not die.4 d4 H, k! \; D$ Y7 E
·1 R% P0 E$ o) i5 s/ T
体验) `& F! d# @0 [9 D
我想从第一个应用场景开始,开启我们的应用旅程。
6 V. W$ X1 S" ~2 [# d这个场景可以把它想象成一个特别的"云盘",这个"云盘"不依赖任何云存储商,不依赖任何平台账号,不用担心云盘提供商的内容审核,不用担心个人隐私的泄密,不用担心内容丢失或被篡改。这些特性希望通过后面的介绍,大家能够自己体会到。可以先试想下,平常我们使用云盘的几个基本需求:
/ \/ B! t; j$ x- [上传文件下载文件分享文件- w/ k: a/ p/ m9 [
下面我们看IPFS如何作为一个“云盘”,来满足这些基本需求的。参考官方的get-start.' r' S; i; b. {% d9 ^% g# F

0 k8 M1 S% E' \' u/ Z1 z·
# P/ D( y7 ~# e/ z下载Daemon3 K1 f2 B7 U% v: e
首先下载官方提供了IPFS的Demo,比较完整的版本是Go实现的,目前最新版本是0.4.15,包含多个平台的版本,以windows 64bit系统为例,下载go-ipfs_v0.4.15_windows-amd64\go-ipfs,由于网络限制,可能有些同学无法下载,我这边上传了一个到IPFS网络上,有需要的同学可以直接下载。1 d% S5 q# i, Q- j& m
这个demo中提供了Node/Cli/Http api/Http Gateway/Library/webUi功能,本文中暂使用CLI的来体验IPFS的基本功能,为了方便在cmd直接执行IPFS命令,可以将Go-ipfs加入环境变量path中。& I; N# U$ n! z1 H
初始化
, D6 Z* Y: E2 P& T# p, {, _, c# [' U> ipfs init) _/ G. i8 M- a8 M  T
执行初始化之后,user路径下会多了一个.ipfs的文件夹,其中有一个config文件,记录的是IPFS的配置,配置内容后续的讲述中会慢慢涉及,此刻我们先了解的是IPFS节点的身份标识Identity,其中peerid,是本机IPFS的地址,下文中IPNS的使用中会涉及到peerid。当然,peerid可以通过命令行直接查看:
- j9 w( g* o. ^3 R> ipfs id, x& `- b/ R: @1 W" S) C* r, w' z
·
3 E9 U. S: ~/ q  W1 t- j启动Deamon
/ I# g* o! F% w' p3 K执行
$ @& N) _0 `2 `+ E5 s" W> ipfs daemon
: q* c/ p2 p+ Y+ T4 u开启deamon之后,会启动demo中包含的IPFS服务,至此,本机就可以作为一个"个人云盘"来使用了。- z# ?- Q4 b% b7 n' ?8 r& R+ |) f
·% Z9 I) o* ?$ M
上传文件
/ }7 u: A+ S  o> ipfs add  //添加文件- @# G  ^# r5 E4 ]! y6 c
> ipfs add -r  //添加文件
$ w" S6 a8 ]* t  L文件添加时,大文件会按照256KB的大小去分块,分块内容存储在.ipfs repo下的blocks文件夹下,每一个块都对应一个hash。文件添加完成之后,会返回一个文件hash,文件夹是递归添加的,会将每一个文件的hash返回,最后一个返回文件夹hash。由于IPFS中,文件都是基于内容寻址的,用户不需要关心这些文件放在哪,这些hash就是用来查找和得到文件的索引。# h$ R; E$ h  j2 o  n
·2 e: l( X& V! S4 U- b! W0 n* f
下载文件' t& q: g- l4 P6 b7 P2 E  ^
想要拿到一个IPFS上的文件,只需要知道文件的hash即可。6 T+ m4 @9 A, [% C
下载命令:
+ K2 j: k$ H9 S( }) d! n' ?> ipfs get  -o : l# ]3 J: ~# f  ^/ {
或者查看命令:
% r7 u3 t" a; m" y- z! I: |: [> ipfs cat
2 Q: m) _6 f( i  H7 d% T$ IIPFS 的所有文件都是在本地的,Pin add可以将远端节点的文件长期保留在本地,不被垃圾回收。通过 add 添加的文件默认就是pin过的。
+ b0 O" V! i7 Y5 Rpin还有一个作用,pin add之后,这个节点就可以同add这个文件的节点一样,作为整个文件的服务节点。其他节点在get或pin add的时候理论上可以从这2个节点的任何一个节点拿去这个文件的块。当有很多个节点都pin add这个文件时,就会增加这个文件的获取速度,也降低了文件被删除的可能。
3 `& |5 }6 O0 {' i  F( |> ipfs pin add
8 h8 W& G% G/ h; Z* \> ipfs pin ls //查看哪些文件在本地是持久化的。
9 G8 R! e7 B) e. t/ z·$ W" O# W2 U2 e$ K) M: D
分享文件
4 j: c6 o. a4 H+ [" `% @现实中,用户习惯获取内容的方式都通过http的方式,让用户去敲get命令去或取文件恐怕只有极客们会尝试吧。回想一下,云盘分享文件的做法,生成一个http url,把链接分享给需要的人。
4 T9 x  Q9 t7 ?, I' O. HIPFS demo也提供了一个http gateway,官方(公网)用的是 http://ipfs.io ,所以分享的链接可以是:
( F! i( i7 y" O& r[url=]http://ipfs.io/ipfs/
+ ^  g: s* U* P由于某些已知原因,ipfs.io这个网关在国内是没法正常使用的,因此有条件的可以在自己的服务器上部署一个IPFS gateway(Ipfs 私网),这样,分享的链接可以是6 p8 n4 ]& i5 x6 X
http:///ipfs/
2 s- v3 P* N. O' h·
* i! a( C* M/ ~  F, P* d! N5 D; ?) CIPNS
: x' b$ H% X! I到现在,我们分享文件还是不断地发送一个个hash组成的url,每分享一个文件就会重新生成一个url,那么可以有一固定的"网址”给我们来看你的分享呢?当然可以。这就需要借助IPNS。具体做法是
8 l+ H" H, @8 T# A5 r> ipfs name publish 9 b7 U& Q5 L& ?. X4 y
这条命令相当于把文件的hash和IPFS的节点绑定,这样就可以通过一个不变的地址来访问publish的文件
" F( u5 Q% T) a/ i6 F2 T6 ~+ r" {6 }http:///ipns/
9 W& @, Q9 |3 I0 m/ y: i5 V$ zpeerid即之前介绍的本节点的唯一标识。  `1 a, a$ J. H  w
这样做的有一个很大的缺陷,就是每次这个链接指向的都是最后一条publish的内容。但是有解决方法,大家可以查看我的博客的关于页,我的IPFS主页。实现方式其实很简单,就是将将分享文件url的列表publish到ipns上。后续可能会再写一篇博文介绍做法。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

繁星如尘 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2