文因互联的前端&数据工程师
林东吴
分享主题:
Service Worker技术来做一个桥接互联网跟IPFS之间的网关。
这个IPFS网关,我们要明确一下它的定义,它是让用户能通过互联网技术来访问IPFS网络上面的资源的一种程序,这张图上是一个我们一般说的一个网关,它是一个反向代理,右边是你的浏览器,你去访问一个网站,比如说文因互联的官网首页,这时候其实浏览器访问是我们的反向代理服务器,就图上这个地方,其实我们真实的服务器是被挡在代理服务器后方的,我们所有的页面资源实际上是存在这个地方,而用户通过这个网关来访问它们。
对于IPFS上的资源我们也是通过类似的方式,可以看到右边有一大串的网址,它们是之前曾经可以使用IPFS网关地址,现在很多都不能用了。这边挡在网关后面的IPFS上的一些一些节点,它们上面有些存储在IPFS上面的数据,那现在你的浏览器在右边,通过互联网访问这个IPFS网关的话,就可以让这个网关去访问挡在后面的IPFS网络,到IPFS网络上去取数据。
现在大家可能都会去使用这个IPFS官方提供的网关,主要原因是因为第三方网关很多都挂掉了,那怎么样才能让世界上有更多这种第三方网关,不让它们一个一个的挂掉,那我们就需要降低第三方维护网关的成本。
Service Worker也是一种网关,只不过这个网关不是运行在服务器上,它是运行在浏览器上。当我们打开这个网页,右边这个可以看做是后端服务器暴露API的地方,那么在后端程序员开发的API服务器和浏览器中间其实还隔了个Service Worker,Service Worker是W3C提出的一个规范,现在大部分浏览器都已经实现了。一般我们可以在设备上面去做一个反向代理服务器,在党在这个我们的浏览器跟API之间,但现在你看,我们可以在这边直接从IPFS网络上取数据,反回给前端。
这就是基于Service Worker的IPFS网关的基本原理,那为什么要做这个Service Worker网关呢?是因为运行在服务器上的网关有这几个缺陷,它很难scale up,比如说你只有一台服务器,那这时候有七八十万个人同时来访问一个爆款资源,都通过你的网关访问,如果它们访问都是不同的文件的话,这时候你你的这个节点就要把一大堆文件,从IPFS网络上都先load到你的服务器上,再通过这个你的网关去传给用户的浏览器,那这时候你这个服务器负载就非常大。
而且如果部署这样的服务器,你必须要有一个能运行够或者JS或者是Go的环境。那这就意味着你服务器配置不能很低,不能运行在一个比如说树莓派或者是ruff这种开发板上面。那当然它有一些好处,比如说它可以pin住一些文件,比如 pin 住一些热点文件,它就可以类似于变成一个静态服务器,可以很快地做一些响应。这是它的好处。
我们就可以想 Service Worker 在浏览器上,而不是运行在服务器上,那如果在浏览器上做的话,真正的服务器只需要是一个静态服务器,它只需要把页面还有一段带有 Service Worker 的JS脚本发送给浏览器,让浏览器来执行,也说服务器本身是不执行任何东西,它只是一个静态服务器,所以说你可以用开发版来做这样的服务器,那唯一的成本你需要买一个https的证书,还有个域名了。
唉当然它有一些坏处,比如说我们在服务器上的网关它可能会有一些缓存机制,那当前这个缓存机制我们还没有在 Service Worker 上开发出来。还有它只能给人类的用户使用,因为 Service Worker 它是一个浏览器上的规范。那如果说你通过一个程序,把它当做一个 REST API ,通过在程序里面写 AJAX 调用的话,那你是取不到东西了,因为 AJAX 调用的时候,你不能运行这个 Service Worker 。
还有一些可能的缺陷,我还没有测试过,有些网页它可能也使用了Service Worker。毕竟 Service Worker 已经是一种被广泛使用的技术,它可以把一个网页,变成一个桌面端的APP。像饿了吗好像在使用这种技术,你在手机上打开网页版饿了吗,会弹出一个提示让你把网页保存到首页,变成一个手机 APP 的应用图标,你再点这个首页上这个图标的话,它并不是打开的网页浏览器,而是打开一个像真的饿了吗 APP 一样的一个东西,叫 PWA 的东西。这种 Progress Web APP 中的核心技术Service Worker,那如果通过 Service Worker IPFS网关来访问饿了吗部署在 IPFS 上的应用,那可能它那就不会正常工作,这个我还没有测试过。因为饿了吗它们还没有把应用部署到IPFS上面……
这边可以看一下,这个绿色的是已经支持这项技术的浏览器,可以看到大部分的浏览器都是支持的。
那这个网关我来先来说一下它具体的实现原理:
它原理非常简单,主要就分为两个部分,第一部分:你看左边这边是一个人,它通过浏览器来访问这个网址,比如说 ipfsgateway.xyz/ipfs/somehash,它把这个东西输入到浏览器之后访问,而这时候第一步是访问这个网页,它上面带有一个 Service Worker 的 JS 脚本,这个JS脚本就开始安装到它的浏览器上面。
安装完之后,这个脚本就开始就开始启动了一个挡在它的手机和真正互联网之间的代理服务器。就在它手机上面运行的一个小服务器,反正代理服务器。这层代理服务器有两个部分的程序,第一个是有向无环图的这个遍历器,还有一个是各种不同类型文件的解析器。具体的实践原理如下:
我写的这个网关是参考IPFS官方JS网关,只做了一些适配 Service Worker 的改动。如果你是其他区块链项目的开发者,你也可以试着在 Service Worker 这一层去适配你的区块链网络,也就是说这一层可以做古典互联网和其他区块链网络的桥接,这一用法可能是一开始这个提出 Service Worker 这一规范的人都并没有想到的吧。
以上是我今天今天分享的全部内容,谢谢大家的聆听。