本系列文章是针对 https://blog.csdn.net/weixin_43668031/article/details/83962959 内容的实现所编写的。开发经历包括思考过程、重构和推翻重来。
这些天一直在纠结关于应用的节点问题,采用以PC节点作为主力节点的方案效率较低,随着移动互联网的发展,移动的ipfs节点将成为主力,这里选用移动Android作为主力传输节点,服务节点仍然是以pc,x86的服务器作为主力。Ipfs跑在Android上,我选用的是go-ipfs作为代码核心,因为go语言的编译支持编译出x86平台,arm平台,arm64平台,并且arm的编译版本已经在Android平台调试过了,已经验证过了这个想法可行。
我的ipfs移动应用构想:这个应用app,是一个平台,是一个载体,是ipfs网络的落地应用平台,这样设计有很多好处,可以提供基础的高级接口给应用的开发者。这类似ipfs提供的接口或者说类似js-ipfs客户端,提供了与ipfs网络的交互接口,但是还是太底层,在sdk和应用之间还可以做一层高级接口的封装,这样一来让应用开发效率更高。
这里阐述的高级接口将是我应用的主要组成部分,这些接口分为2类,BASE_API安卓应用平台的基础接口,将提供给业务应用使用,在多个业务应用之间共享,多个业务应用可以调用这些平台基础接口。APP1_API我的第一个业务应用独享的应用接口,这个接口不包含我业务的具体实现过程,仅仅包含简单的实现过程,这样子抽离应用的功能模块能让业务应用开发更加高效简洁。
这是一个获取内容的函数,主要是在节点不够多的情况下使用,以及在应用初期使用。需要达成一些效果:
①在编译时更新本地gw列表;
②应用启动时更新列表;
③可用列表合并;
④选出列表里返回最快的那一项。
做这个函数的原因之前写过了https://blog.csdn.net/weixin_43668031/article/details/100174147,但是在安卓平台上将更加细化,需要达成一些效果:
①除了本地解析外可用使用ipfs gateway去捕获header信息来解析,这是多并发的任务,只要其中一个返回就可以结束其他的请求,在应用推广初期这及其适用、实用;
②函数可用传入是否使用cache,cache的持久时间是多少;
③函数要支持异步调用,传入回调函数可用完成异步处理结果的目的;
这里需要实时去轮询ipfs的几个接口,可以每秒触发,目前我关心几个参数:
①实时数据当前一秒内流出多少流量,当前一秒内流入多少流量,当前连接的对等节点有多少个;希望可以通过悬浮窗、状态栏、应用内的悬浮窗来显示这几个实时数据;
②本地ipfs缓存有多少,启动后运行了多久,启动后一共流入多少,启动后一共流出多少。
目前想到几个参数是要放给用户去设置的:
①ipfs缓存目录变量IPFS_PATH,也叫ipfs repository,要支持移动,Android应用启动时默认使用外储存的.ipfs 目录作为数据储存目录,允许用户移动这个这个数据目录;
②本地ipfs缓存限制,这个限制不是硬限制,ipfs允许pin超过这个限制的内容,但不pin的可以gc回收,默认值10G。
Ipfs应用就要靠ipfs网络来更新,APK更新由一个ipfs的key来管理和控制,更新机制,数据的组织方式参考传统应用http应用的关系方式,但是这个数据是ipfs网络上的数据。在ipfskey绑定的目录中需要有一个version.json的文件,里面定义了last res的apk版本号和对应的更新信息。
{
"last":"v0.0.2",
"version_list":{
"v0.0.2":{
"title":"VS2",
"changelog":"1.fix aaa. 2.fix bbb",
"arch":{
"arm64":"apk/io.ipfs.vs-v0.0.2.apk",
"x86":"apk/io.ipfs.vs-x86-v0.0.2.apk",
}
},
"v0.0.1":{
"title":"VS1",
"changelog":"1.fix aa. 2.fix bb",
"arch":{
"arm64":"/ipfs/QmdJaMWDAdu7LkUPCRqb4NepUBXgmBdfegT6zjUyjVFUTb/io.ipfs.vs-v0.0.1.apk",
"x86":"apk/io.ipfs.vs-x86-v0.0.1.apk",
}
},
}
}
区别于传统的apk有集中的应用商店下载,ipfs的下载就更加随意一些,主要包含:
①运行的人下载后通过第三方传输工具传给需要安装的人,
②通过gw生成下载引导界面展示二维码让需要安装的人扫描下载;
③通过gw生成apk直接的下载路径展示二维码让需要安装的人扫描下载;
应用会不时的检测本地是否pin了一些资源,主要包括:
①应用本身的apk和应用相关的资源,方便分享与下载;
②通过ipfs key控制一些热门资源缓存在用户移动节点上,但是需要注意的是在流量不收费的wifi和移动网络下进行,不然肯定会得到用户的反感。
需要能扫描二维码,解析字符串后需要进行ipfs内容过滤,支持识别以下内容:
①识别内容类型(hash内容已经压缩),hash需要支持V0版本和V1版本:
V0:QmWGqmbfgP2TJRXkyNsmU8qqDKCVoNc7C9fx8NeVsUdm2C
V1:bafkreid4dzwiglj7goy22jmqumhnf2mmaole2trr6sfhtdulxt6un4mwza
直接Hash式 | 子文件夹式 | 子文件式 | |
---|---|---|---|
ipfs协议开头 | ipfs://Qm…Tb | ipfs://Qm…Tb/files/ | ipfs://Qm…Tb/files.json |
dweb协议开头 | dweb:/ipfs/Qm…Tb | dweb:/ipfs/Qm…Tb/files/ | dweb:/ipfs/Qm…Tb/files.json |
ipns协议开头 | ipns://Qm…Mm | ipns://Qm…Mm/files/ | ipns://Qm…Mm/files.json |
ipfs网关开头 | https://ipfs.io/ipfs/Qm…Tb | https://ipfs.io/ipfs/Qm…Tb/files/ | https://ipfs.io/ipfs/Qm…Tb/files.json |
ipns网关开头 | https://ipfs.io/ipns/Qm…Mm | https://ipfs.io/ipns/Qm…Mm/files/ | https://ipfs.io/ipns/Qm…Mm/files.json |
ipfs网关前缀 | https://Qm…Tb.ipfs.cf-ipfs.com | https://Qm…Tb.ipfs.cf-ipfs.com/files/ | https://Qm…Tb.ipfs.cf-ipfs.com/files.json |
ipfs路径 | /ipfs/Qm…Tb | /ipfs/Qm…Tb/files/ | /ipfs/Qm…Tb/files.json |
ipns路径 | /ipns/Qm…Mm | /ipns/Qm…Mm/files/ | /ipns/Qm…Mm/files.json |
②识别是否为本平台的应用,将会匹配本平台的应用特征,如果是将跳转到本平台应用上
③识别是否不是本平台的,但是是ipfs的资源,一般还是以网页web形式展现(目录里判断是否存在index.html),提供gw选优服务,跳转到外部浏览器打开,如果目录里不包含index.html 提供目录浏览界面,文件夹里的内容匹配后缀名可以在其他应用里打开,如果为文件显示文件信息(大小,块大小)
④如果没有匹配到ipfs应用,判断是否是传统web应用,是的话用外部浏览器打开,
这个接口主要为信息跨设备连接提供,特别是安卓移动设备。