IPFS初窥
虽然区块链有很多令人兴奋的特性,但是也有其固有的缺点。比如,文件或者长度较长的文本信息就不适合存储在链上。那么如何解决这个缺点呢?一个解决方案就是IPFS(Interplanetary File System)——星际文件系统。
本文作为简介篇不打算涉及网络及数据结构相关知识(比如什么是协议、什么是树、什么是图……),不过我相信各位看官既然能找到本文网络基础应该不是问题。
为什么需要IPFS?
说这个之前,我们看看现在互联网基石 —— HTTP协议,网址(URL)由几部份构成:
- 协议
- 服务器地址(IP地址,或者域名)
- 端口
- 路径
- 参数
HTTP是路径(位置)导向的、中心化的,而IPFS则是资源导向的、分布式的。以网站举例,如果某个网站服务器关闭,那么如果没有其他三方对其进行过快照的话,基本就是再也看不到上面的内容了。而IPFS则不然,只要IPFS网络中有对应的副本,则不会因为某个”人”删除资源而导致无法访问。(单点问题)
老司机应该觉得眼熟,这不就和BT种子类似么?是的,IPFS结合了Git版本系统、Bittorrent、DHT等技术。也正因如此,IPFS刚好可以用来弥补区块链不适合存储文件或长文本这个缺陷。
基于路径导向还会导致某些安全问题,假定你需要下载http://www.aa.com/file.zip
这个文件,如果这个文件被替换成木马病毒一类的,客户端是无法判断数据是否被更改的。换言之,客户端只知道”在哪里”,而不知道”是什么”。
此外,随着媒体类资源如音频、视频越发流行,带宽资源也越发成为限制HTTP传输速度的瓶颈。而如果你需要的资源在IPFS存在,则会自动选择一个最近的下载,传输速度大大提升。
什么是IPFS?
官网原话:
IPFS aims to replace HTTP and build a better web for all of us.
翻译过来就是:IPFS是来干掉现有HTTP协议、带领农奴翻身的。所以咧,官网就被”墙”了。但从技术角度,更好的解释在白皮书中。
白皮书标题就3点:
- 内容寻址:通过文件内容生成唯一哈希值来标识文件,而不是通过文件保存位置来标识。相同内容的文件在系统中只会存在一份,节约存储空间。
- 版本化:可追溯文件修改历史。(参照git、svn)
- 点对点文件系统:P2P保存各种各样类型的数据。
涉及的技术点有5个:
- 分布式哈希表(DHT)
- 块交换
- Merkle DAG
- 版本控制系统
- 自验证文件系统(SFS)
上面的技术点基本每个都能写一系列文章,这里就简单说一下,如果有时间以后再补充完善。(没错,我又开始挖坑了!)
DHT被广泛用于维护协调p2p网络的元数据,比如BitTorrent中的MainlineDHT
就追踪了torrent网络中节点的集合。而IPFS中则是结合了Coral DSHT
和S/Kademlia DHT
,这两个都是Kademlia DHT
的扩展。(再简单说就是用来查找节点的。)
块交换,IPFS在BitTorrent的基础上实现了更通用的版本——BitSwap
,这也是Filecoin的基础。
Merkle DAG,如果涉及过轻钱包应用的应该知道Merkle Tree,在Merkle Tree中每个父节点的值都是其子节点值的哈希。Merkle DAG则是Merkle Tree和有向无环图(DAG)的结合体,广义上所有数据都在Merkle DAG进行建模,这是保证数据正确、安全传输的关键点。
版本控制,这个不用多说了吧?
自验证文件系统(Self-certifying File System,SFS)是一种不需要特殊权限的分布式文件系统,因为每个用户上传是生成的文件名已经是经过其私钥签名过的了。在这个基础上,又可以引出星际命名空间(InterPlanetary Name Space,IPNS)的概念。之前说过IPFS上的文件哈希后都是唯一识别的,推广开来,每个节点也有公钥、私钥和节点ID,节点ID是其公钥的哈希值,节点可以使用私钥来对其发布的数据签名,其他用户检索时,可以检查发送者的公钥来验证数据真实性。
如何使用IPFS?
首先下载go-ipfs,我这里直接使用linux版本的,解压后执行:
1 |
go-ipfs❯ sudo sh install.sh |
建议使用提示中的哦命令看看quick-start
,常用操作都在里面了。
然后启动ipfs服务:
1 |
go-ipfs❯ ipfs daemon |
然后访问http://localhost:5001/webui
可以查看系统信息、创建文件夹、添加文件等。
添加个文件:
1 |
~ » mkdir roy_test |
然后测试下文件是否添加成功:
1 |
ipfs ls QmUK6CHzQyn2CWpHumysxhQXjzi4dA373DYLD2zgj8n7kx |
也可以通过本地网关访问http://localhost:8080/ipfs/QmTbyi4XTyG8PrJo7KDcexNGxBJNKfJCwjfmY4HmtENqYd
。
然后我们来修改一下文件:
1 |
echo "www.hi-roy.com" >> roy_test/roy.txt |
注意,修改文件后哈希值发生了变化,原来的文件依然存在。但每次更新文件都有一个新哈希也太麻烦了,这时可以使用上面说的IPNS
了:
1 |
ipfs name publish QmUK6CHzQyn2CWpHumysxhQXjzi4dA373DYLD2zgj8n7kx |
这里我把文件夹的哈希值作为根发布,然后就可以使用ipns
查看文件了:
1 |
ipfs cat /ipns/QmcWR5hMnF7LNqNJBC6fxSBdXRUBgJEnXca3MHWN8kpdXC/roy.txt www.hi-roy.com |
以后更新文件后再publish就可以了。不过 使用ipns会很慢。
使用IPFS时应该注意?
永久性(Permanence)不等同于持久性(Persistence)。
Objects are permanent。
也就是说,你在IPFS网络中上传了某个文件,指向你这个文件的链接是永久不变的,但如果每个节点都觉得这个文件没什么价值而将其删除,那么这个文件是会”消失”的。
IPFS的应用领域?
白皮书3.8节提到了12个应用场景:
- 作为全球文件系统挂载到
/ipfs
和/ipns
下。 - 作为个人同步文件夹自动控制版本、推送、备份。
- 作为加密文件或者数据共享系统。
- 作为所有软件的版本控制器。
- 作为虚拟机的根文件系统。
- 作为VM的引导文件。
- 作为数据库:程序可以直接写入Merkle DAG数据模型,并获得IPFS提供的版本控制、缓存、分发功能。
- 作为一个加密的通信平台。
- 作为一个大文件完整性校验的CDN平台(不需要SSL)。
- 作为加密CDN。
- 作为网站CDN。
- 作为一个永远不会消失的网站。
利用IPFS的项目比较多,但大多处于探索阶段,杀手级的目前还没出现。这里给大家介绍我认为比较有意思的:
- akasha,号称下一代社交网络,测试玩的话chrome浏览器可以装个
MetaMask
插件,并将网络设置为Rinkeby Test Network
。 - 基于IPFS的维基百科,维基百科镜像。
- livepeer,去中心化流媒体平台,可以贡献自己的带宽获取token。
IPFS的缺点?
目前觉得缺点有2个:
域名不友好,比如
ipfs.io/ipns/Qmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/
。当然可以引入域名系统DNS,但又会面临现有DNS系统的各种缺陷,比如域名污染等。数据节点没动力维持网络数据的长期备份,如果所有的数据节点都将某份数据清除来节省空间,理论上这个文件最终会”消失”。为了缓解这个问题,引入了
FileCoin
来为IPFS添加经济激励,毕竟有句话叫做”无利不起早”么。
写到这让我想起了《人月神话》中的经典台词:
没有银弹。
IPFS初窥的更多相关文章
- Scrapy001-框架初窥
Scrapy001-框架初窥 @(Spider)[POSTS] 1.Scrapy简介 Scrapy是一个应用于抓取.提取.处理.存储等网站数据的框架(类似Django). 应用: 数据挖掘 信息处理 ...
- 初窥Kaggle竞赛
初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...
- scrapy2_初窥Scrapy
递归知识:oop,xpath,jsp,items,pipline等专业网络知识,初级水平并不是很scrapy,可以从简单模块自己写. 初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数 ...
- WWDC15 Session笔记 - Xcode 7 UI 测试初窥
https://onevcat.com/2015/09/ui-testing/ WWDC15 Session笔记 - Xcode 7 UI 测试初窥 Unit Test 在 iOS 开发中已经有足够多 ...
- Java发送邮件初窥
一.背景 最近朋友的公司有用到这个功能,之前对这一块也不是很熟悉,就和他一起解决出现的异常的同时,也初窥一下使用Apache Common Email组件进行邮件发送. 二.Java发送邮件的注意事项 ...
- 【软件工程】week5-个人作业-敏捷开发方法初窥
敏捷开发方法初窥 引言:本周的软件工程个人博客作业是阅读关于敏捷开发方法的文章(http://martinfowler.com/agile.html),并撰写自己的读后感.文章内容非常丰富,对敏捷开发 ...
- 网页3D效果库Three.js初窥
网页3D效果库Three.js初窥 背景 一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手 ThreeJs官网 ThreeJs-github; 接下来我会陆续翻译 ...
- iOS视频直播初窥:高仿<喵播APP>
视频直播初窥 视频直播,可以分为 采集,前处理,编码,传输, 服务器处理,解码,渲染 采集: iOS系统因为软硬件种类不多, 硬件适配性比较好, 所以比较简单. 而Android端市面上机型众多, 要 ...
- php面向对象(一) 初窥
初窥php面向对象 1.类:类就是属性和方法的集合 是一个抽象的概念比如生活中的“人”,"汽车"2.对象:对象是具体的事物 比如一叫“小强”的人 一辆叫“奥迪a7”的汽车3.类和对 ...
随机推荐
- Docker添加root用户
0 环境 系统环境:centos7 服务器:阿里云 1 正文 1 进入rabbitmq容器中 docker exec -i -t 563 bin/bash 2 添加用户(用户名和密码) rabbitm ...
- [HNOI2019]鱼(计算几何)
看到数据范围n<=1000,但感觉用O(n^2)不现实,所以考虑方向应该是O(n^2logn). 一种暴力做法:用vector存到1点相同的2点和到2点相同的1点,然后枚举A,枚举BC,再枚举D ...
- 43)PHP,mysql_fetch_row 和mysql_fetch_assoc和mysql_fetch_array
mysql_fetch_row 提取的结果是没有查询中的字段名了(也就是没有键id,GoodsName,只有值),如下图: mysql_fetch_assoc 提取的结果有键值,如下图: mysq ...
- 微软不将《帝国时代》终极版上架Steam的原因到底是什么?
毋庸置疑的是,<帝国时代>绝对是一款经典游戏.作为一款RTS名作,在过去的20年时间中<帝国时代>销量超过2000万部.数以千万计的玩家都沉溺于这款游戏中,<帝国时代&g ...
- 关于vyos 防火墙配置
VyOS是一个基于Debian的网络操作系统,是Vyatta的社区fork.Vyatta是博通的企业级的产品,通过这套系统,能在x86平台提供路由,防火墙和×××的功能. 这个系统提供了和其他诸如Ci ...
- iOS传感器集锦、飞机大战、开发调试工具、强制更新、Swift仿QQ空间头部等源码
iOS精选源码 飞机大作战 MUPhotoPreview -简单易用的图片浏览器 LLDebugTool是一款针对开发者和测试者的调试工具,它可以帮... 多个UIScrollView.UITable ...
- vue项目中net::ERR_CONNECTION_TIMED_OUT错误
我出错的原因时network地址与我本机ip地址不一致 Network: http://192.168.13.30:8080/ 处理方法: 在vue项目中新建一个vue.config.js文件 配置上 ...
- Django ORM单表查询必会13条
必知必会13条 操作下面的操作之前,我们实现创建好了数据表,这里主要演示下面的操作,不再细讲创建准备过程 <1> all(): 查询所有结果 <2> filter(**kwar ...
- mysql 事务处理 (转)
事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操作大都需要用到事务处理.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如 ...
- 网络TCP/IP分层、子网掩码等基本概念
一.TCP/IP分层: OSI七层网络模型 TCP/IP四层概念模型 对应网络协议 应用层(Application) 应用层 HTTP.TFTP, FTP, NFS, WAIS.SMTP 表示层(Pr ...