IPFS - 一个点对点的超媒体协议

本文章首发于语雀!

通过各种高科技功能同步到Hajeekn的博客

IPFS's Author

IPFS's Author 是 Juan Benet

Juan Benet在 2014 年创建了 Protocol Labs (协议实验室)

协议实验室旗下的项目:

  • IPFS
  • FileCoin

协议实验室旨在如何构建下一代互联网

What's IPFS?

依照官网的介绍,总的来说,IPFS 就是一种点对点超媒体协议,它可以使网络更快、更安全、更开放

本质上来说,它就是一种去中心化互联网(Peer to Peer) ≈ P2P

没错,就是孽种 P2P 下载器

这么牛的项目怎么是 P2P 下载器呢? P2P 下载器只是个披着羊皮的狼

P2P(Peer to Peer)依靠用户群交换信息

以 number.exe 为例

当你上传后,无数个 Node(用户) 会瓜分你的 number.exe

他们将你的文件分成许多分片,瓜分分片

他们在瓜分的同时会获得奖励

是不是听起来很神奇?对的,你没有付出任何东西,别人却能获得奖励,而且你既满足储存文件的需求,储存你文件的人也能得到金钱.这种机制,叫做FileCoin.你可以把它想象成Bittorrent+BitCoin的结合物,实际上他就是这样的.当然不完全是,但核心理念就是这样的.只不过,BitCoin付出的是算力,而FileCoin付出的是硬盘.

摘自 ChenYFanのBlog

这是 IPFSの不权威原理图(来自 ChenYFanのBlog)

所以,IPFS 相对于响应式请求(HTTP(S) / FTP)不同

传统的响应式请求由一个主服务器(或主集群)处理每一个请求,并贡献内容

而 IPFS 基于 Peer to Peer 技术,让每个 Node 都贡献,没有中心服务器(去中心化)

更细致的解释

IPFS 是一个基于 Git 模型版本管理 & DHT & CBA & Hash 等的产物

它基于 DHT(分布式哈希表) 进行寻址

而传统的响应式请求由 LBA(基于位置的寻址)

而这样,响应式请求的缺点就暴露了出来

LBA(基于位置的寻址) 它在查找时所看重的信息是位置,就好比一个网址 https://blog.slqwq.cn/link/如果这个位置被删除了,链接位置转移了,他就会暴露出

404 Not Found 错误

而 IPFS 所采用的 DHT(CBA 基于内容的寻址)就没有这个缺点

它在查找时所看重的信息是内容,不管你位置在哪里,只要找到的内容符合要查找的信息,那他就是正确的

最后

基于响应式请求(中心化网络)还有一个超级大大大大的弊端

那就是

非常容易引入审查

也就是类似于我们国家的 Great Firewall of China (GFW是一个分布式的入侵检测系统,并不是一个严格意义上的防火墙)

每个国家的 gov 可以很方便的 BAN 掉某个网站或者应用

引入一个具体事例

在 2017 年, Turkey's GOV******就用国家安全的理由禁掉了维基百科**

当然,去中心化也不能避免掉 Firewall 的屏蔽,只是不那么容易屏蔽掉罢了

Use IPFS - IPFS Client

进入 IPFS-DesktopのReleases

找到需要的客户端下载并安装

弹出防火墙警报请一定要允许

在文件处可以上传文件

上传点击导入即可

接下来,重点来了!

ipfs分享文件有两种方式,是ipfs和ipns,前者采用文件hash辨别文件,文件内容一旦改变,原来的链接无法更新,链接格式为 https://ipfs.io/ipfs/QmZCvMHrE56VqsejmG53xd9bW4RZjtFpLz46QMQjA81orL ;后者采用用户id辨别,内容允许更新,但是用户在线时间过短会导致无法同步,并且有可能暴露用户信息,后者格式为: https://ipfs.io/ipfs/QmQQKZphgJdEGhTp18NRvVdSJ3RJArRst2keKk3tZvmfPz?filename=index.html .

如果你只是单个文件网页,此处比较建议使用ipfs,ipns可能离线时间过长导致无法下载。具体看个人所好。

ipfs链接获取:点击 ··· ,选择复制哈希,在前面加上网关域名即可。

ipns连接获取:点击 ··· ,选择分享,复制链接即可。

在善用技术上网的前提下访问 https://ipfs.io/ipfs/QmZCvMHrE56VqsejmG53xd9bW4RZjtFpLz46QMQjA81orL 显示目标界面

请注意,每次上传后一定要先访问一遍资源,否则文件是不会上传到ipfs服务器的!

摘自 ChenYFanのBlog

Use IPFS - IPFS Gateway

JSProxy - IPFS Gateway

因为 IPFS 默认的网关被 FW 了

所以我们可以通过 Worker JSProxy 的方式解锁你自己的网关

代码语言:javascript
复制
addEventListener(
  "fetch",event => {
    let url=new URL(event.request.url);
    url.hostname="werevless.herokuapp.com";
    let request=new Request(url,event.request);
    event. respondWith(
      fetch(request)
    )
  }
    ) 

粘贴进去,访问 Worker 地址就能看到 404 了

然后在 IPFS Client 里复制地址,接在后面就能打开你上传的文件了

JSProxy - Cloudflare IPFS Gateway

我们可以通过 Worker JSProxy 的方式解锁你自己的 CNAME

代码语言:javascript
复制
addEventListener(
  "fetch",event => {
    let url=new URL(event.request.url);
    url.hostname="cloudflare-ipfs.com";
    let request=new Request(url,event.request);
    event. respondWith(
      fetch(request)
    )
  }
    ) 

粘贴进去,就变成了基于 CIG 的你自己的 IPFS 网关

Use IPFS - Build Blog

dnslink绑定

这个方法无论你的dns服务商在哪都能绑定,只不过不在CloudFlare托管的用户要多一步。

1.将需要绑定的域名,以CNAME形式指向 www.cloudflare-ipfs.com ,比如我需要让 showtime.cyfan.top 成为ipfs出口,则这么设置。

2.使用txt记录绑定ipfs hash,新建txt记录,名字是 _dnslink.yourwebsite 一定要加上yourwebsite!比如我绑定的是 showtime.cyfan.top ,则名称一行填上 _dnslink.showtime !接着内容是 dnslink=/ipfs/ 后面接上hash,比如showtimehtml的hash是: QmWAvNck7QBhUAYAEgBFvbvvsMxDC9s55NXVJXeJTjTM1Y 则大概这么填:

3.如果你本来就是托管在CloudFlare上的,到此为止就可以了,如果不是托管在Cloudflare上,类似dnspod\alicdn之类的,那还要获取证书,进入https://www.cloudflare.com/distributed-web-gateway/ 拉到最底下

输入域名,获取证书即可。

但问题是,www.cloudflare-ipfs.com 已经被dns污染了,你用cname绑定是无法正常访问的啦!所以只能用Workers绕路啦!

JSProxy反代ipfs.io

老办法,Workersjsproxy反向代理ipfs网关,解决

依然来自 ChenYFanのBlog