什么是IPFS?IPFS与区块链有什么关系
1.什么是IPFS?
IPFS
是Inter Planetary File System
(星际文件系统)的缩写,是一个典型的点对点分布式文件系统, 旨在用同一个文件系统连接所有的计算设备。这时候有些小伙伴可能会问,为什么要使用分布式文件系统,我将我的文件存储在本地笔记本上,或者上传到云端(典型的云端提供商有AWS S3, Azure Cloud 等等)保管就好了呀,可用性高而且一般不会丢。其实对区块链技术有一点了解的小伙伴不难想到,这种中心化的服务器模式,很容易造成单点故障(服务提供商中断服务或者以违反规定为由,移除/屏蔽你的文件)。此外,随着文件存储数量的增加,存储成本也将变得越来越昂贵。在这种背景下,IPFS应用而生。在 IPFS 的世界里,这些服务提供商将不再是中心化服务器,而是 P2P 网络里的计算机。与任何人都可以 运行一个以太坊节点一样,任何人也都可以运行一个 IPFS 节点,并加入网络来形成全球的文件系统。 文件可以在很多节点间复制,几乎不可能出现无法访问文件的情况(IPFS 没有单故障点, 节点不需要相互信任)。附上两种文件系统的对比图。
此外,IPFS也被称为颠覆HTTP协议的协议,目前已成为事实上的分布式HTTP协议的工业标准。之所以这么讲是因为,目前我们所使用的WEB网络(即日常浏览的各大网站:百度,github,淘宝等等)都是基于HTTP协议的,HTTP底层基于TCP协议,是一种典型的中心化的网络,即无论内容分发如何分布式进行,无论有多少服务器分布在世界各地。中心化的本质仍然存在。为了从根本上解决这种中心化的模式,IPFS将相同的文件进行了hash计算,确定了其唯一的地址。说的再直白点就是,我们平时所浏览的每一个网页其实都是前端工程师对文字、图片、声音、视频等一系列文件的打包处理,如果我们将这些文件放到IPFS进行哈希计算唯一化处理,则我们以后直接使用这个哈希地址对同一份文件进行访问,无论从任何设备,任意地点,地址的唯一性都可以帮助我们找到相同的资源。此外,文件在IPFS中是可共享的。你的邻居如果访问过相同的网站,你就可以从他那里直接获取,而不需要再访问云端,物理距离更近,打开速度也更快。有了IPFS,我们或不再需要中心化的WEB服务器,一切资源可以去中心化的发布。将网页,图片,脚本等等资源,提交到IPFS进行唯一化发布,得到了这些地址,便可以访问你的网站。地址太长不好记,还可以生成一个短地址,就像现在的网站域名(此说法来自 IPFS:下一代分布式文件系统(filenet))。至于用户的登录验证等功能,则可以使用智能合约来完成 (msg.sender=owner)。
2.IPFS在区块链中的应用
正如文档中所说,因在以太坊中存储数据需要gas,如果存储的文件过多,则花费十分昂贵,由于以太坊虚拟机的限制, 有时甚至是不可行的。以分布式电商系统为例,如果我们将用于商品展示的图片和描述超文本都存储在以太坊上的话,则会给以太坊网络造成很大的压力,消耗大量的带宽。因此,为了减缓区块链的存储压力,我们可以将商品图片和商品描述信息等信息存储在 同样去中心化的星际文件系统(IPFS
)中,而仅仅在链上保存这些数据的ID
。
需要注意的是,在IPFS中只关心文件内容,而不关心文件的名称。也就是说只要两个文件的内容一样,即使是不同的文件名,也将得到同样的 哈希值。这对于医疗数据分享这种应用场景下,是十分重要且必要的。
3.IPFS节点软件安装与自定义设置
3.1软件安装
- 下载地址:https://dist.ipfs.io/#go-ipfs (读者可以选择自己需要的版本)
~$ wget https://dist.ipfs.io/go-ipfs/v0.4.13/go-ipfs_v0.4.13_linux-amd64.tar.gz
- 解压
~$ tar xzvf go-ipfs_v0..13_linux-.tar.gz
- 配置环境变量(类似于java中的jdk配置)
~$ echo "export PATH=$HOME/go-ipfs:$PATH" >> .bashrc
~$ source .bashrc
3.2自定义设置
- 初始化仓库
IPFS的实现与Git相似,在开始使用前都需要初始化一个本地仓库进行工作。
~$ ipfs init
默认情况下,init
命令将在当前用户主目录下建立.ipfs
目录作为本地仓库根目录。 如果你希望设置一个其他的目录作为仓库根目录,可以使用环境变量IPFS_PATH
来指向期望 的目录,如下图所示:
~$ export IPFS_PATH=/path/to/ipfsrepo
~$ ipfs init
- 节点配置
IPFS节点软件提供了REST API接口,默认在本地5001端口监听,但也可以自己设置。通过设置监听地址和CORS(允许跨域资源共享),可以在其他主机的浏览器中通过AJAX技术访问到这个API.
~$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
~$ ipfs config --json Addresses.API '"/ip4/0.0.0.0/tcp/"'
配置默认网关(该网关可以让我们通过HTTP协议访问IPFS网络中的文件),默认是8080。由于我们项目中的默认web服务器端口也是8080,因此,为了避免冲突,我们最好设置一个新的值,在这里我设置为5000
~$ ipfs config --json Addresses.Gateway '"/ip4/0.0.0.0/tcp/"'
3.3加入IPFS网络
~$ ipfs daemon
4. IPFS网络的文件上传与下载
4.1 文件上传
类似于Git,在IPFS中,文件的添加是在本地仓库中进行的。而且 和Git一样,都是使用add
命令向本地仓库中添加文件。假设我们现在要将一个写着 “Hello IPFS!!!”的文件hello.txt 上传到IPFS网络。
可以注意到系统为该文件返回了一个唯一的hash索引。
在 上面 2.IPFS在区块链中的应用 中我们有提到,IPFS只关心文件的内容,而与文件名无关,即相同的内容必定会是相同的哈希值,让我们在这里验证一下这个神奇的功能。
4.2 文件的下载
在IPFS中,你要获取一个文件的唯一办法,是知道它的哈希值。使用唯一的哈希值进行文件下载的方式有两种:命令行使用cat 或者HTTP网关(这里我们的端口是5000)访问远程容器
参考文献:
IPFS:下一代分布式文件系统(filenet)
什么是IPFS?IPFS与区块链有什么关系的更多相关文章
- 一场IPFS引领下的共享之风正在走向区块链
中国互联网的高速发展 已经接近10年,小编完整的经历这个过程.这一切我们从一个小网站 饭否 说起... 互联网 2006年3月16:Twitter上线 2007年5月12: 饭否上线 饭否是中国第一 ...
- 以太坊开发DApp实战教程——用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台(一)
第一节 简介 欢迎和我们一起来用以太坊开发构建一个去中心化电商DApp!我们将用区块链.星际文件系统(IPFS).Node.js和MongoDB来构建电商平台类似淘宝的在线电商应用,卖家可以自由地出售 ...
- 区块链(Blockchain)
一 .什么是区块链? 区块链(Blockchain)是由节点参与的分布式数据库系统[1],它的特点是不可更改,不可伪造,也可以将其理解为账簿系统(ledger).它是比特币的一个重要概念,完整比特币区 ...
- Factom(公证通)--基于区块链的存证系统
Factom这个Solution在2014年的时候就已经推出了,现在已经2018年了,我才来写这一篇分析文章可能有些迟了,但是它是十分具有参考价值的.因为现阶段来开区块链虽然炒得火热--养猫.养狗.草 ...
- 使用Go语言编写区块链P2P网络(译)(转)
转自:https://mp.weixin.qq.com/s/2daFH9Ej5fVlWmpsN5HZzw 外文链接: https://medium.com/coinmonks/code-a-simpl ...
- IMCASH:2019年区块链不会风平浪静,至少还有10件事值得期待
当我们在说2019年是值得期待的一年时,我们还是得做到有根有据.那么,2019年在区块链行业都会发生哪些引导行业风向.影响整个行业的事件呢? 今天,白话区块链带着大家顺着时间线梳理一下. 01 第一季 ...
- 200行Go代码实现自己的区块链——区块生成与网络通信
go启动后,可以用telnet登录访问. 注意端口配置写在.env里面. 源码:https://github.com/mycoralhealth/blockchain-tutorial/tree/ma ...
- 只用120行Java代码写一个自己的区块链-3挖矿算法
在本系列前两篇文章中,我们向大家展示了如何通过精炼的Java代码实现一个简单的区块链.包括生成块,验证块数据,广播通信等等,这一篇让我们聚焦在如何实现 PoW算法. 大家都无不惊呼比特币.以太坊及其他 ...
- 区块链入门级别认知(blockchain)
区块链入门级别认知(blockchain) 前言:今天参加了迅雷关于区块链的大会,学习和感受总结一下 之前的认知在:几个混迹互联网圈关于区块链 耳熟能详的 热词 “比特币” “区块链” “挖矿” ,知 ...
随机推荐
- 「快学springboot」SpringBoot多环境配置文件
前言 我们都知道springboot的配置卸载application.properties配置文件上(或者application.yml).但是,如果想要把不同的环境(如开发环境,测试环境,生产环境) ...
- Django学习 之后端视图与ajax
一.Ajax简介 在此之前你一定需要先学习下JavaScript JSON 可见: 前端学习 之 JavaScript 之 JSON 1.简单介绍 我们以前知道的前端向后端发送数据的方式有: GET: ...
- python 基础之列表的操作和列表的相关函数
一.列表的相关操作 1.列表的拼接 list1 = [1,2]list2 = [3,4]listvar = list1 + list2print(listvar) 2.列表的重复 lst = [1,2 ...
- SpringBoot项目中自定义注解的使用
1.定义注解接口 @Documented @Retention(RUNTIME) @Target(METHOD) public @interface MyLog { String value() ...
- UniGui安装(01)
UniGui安装.Delphi10和uniGUI1.90.0.1509 1]下载 2]安装 3]目录说明 1]下载 在我百度网盘里 uniGUI1-90-0-1509.zip https://pan ...
- session存取时 getOutputStream()和getWriter()问题
情况1: 在使用httpResponse的getWriter()会写json是出现 getWriter() has already been called for this response,经我查看 ...
- HashMap ( Java 8)
HashTable是早起java提供的基于hash表的实现,不允许存放null键和值,是同步的,影响开销,不太被推荐. HashMap行为上和HashTable差不多,不是同步的,允许键和值为null ...
- Intend之属性extra
我们这次想要实现的功能是从A活动跳到B活动时,A活动中有一个输入框和一个按钮,当点击按钮是时会跳到B活动,然后把A活动中的输入框的内容传到B活动中,且在B活动中的TextView中显示 A活动中先添加 ...
- LinkedList学习:API调用、栈、队列实现
参考的博客 Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例 如果你想详细的区了解容器知识以及本文讲的LinkedList,我推荐你去看这篇博客和这个做个的容器系列 Lin ...
- 微软结合Veritas,使用Azure云中的混合存储
导读 在与Symantec(Symantec)脱离10年(通常令人不愉快的关系)一周年之际,Veritas Technologies在2月22日宣布与Microsoft Corp. 建立了多年战略全球 ...