一、项目回溯
希望能自研一些存储需求方属性的C端应用。
这种C端类型的Killer级应用,暂选定为具有端到端加密、文件分片、种子高速下载、用户间分享、外部文件导入等特性的网盘和云协作工具,因此我们启动了这个项目。
二、目标
- 为客户提供可演示的个人数据中心Demo
- 验证IPFS-Libp2p分布式上传下载的传输效率
- 积累业务相关技术,培养团队默契
三、业务模型
graph LR
start[登录] --> conditionA{校验}
conditionA -- YES --> conditionC{拉取用户所有信息}
conditionA -- NO --> conditionB{提示注册}
conditionC -- YES --> printA1[分片加密上传]
conditionC -- YES --> printA2[分片解密下载]
conditionC -- YES --> printA3[密钥管理]
conditionC -- YES --> printA4[配置管理]
conditionB -- YES --> printC[生成密钥信息]
conditionB -- YES --> printD[分配存储空间]
conditionB -- YES --> printE[保存用户信息]
printA1 --> stop1[结束]
printA2 --> stop1[结束]
printA3 --> stop1[结束]
printA4 --> stop1[结束]
printC --> stop[结束]
printD --> stop[结束]
printE --> stop[结束]
四、整体架构
4.1 前端
webpack
- build
- config
vue
- oss-server
- pb
- store
- router
- src
- views
- components
- element-ui
- utils
- keystore
- libp2p
4.2 后端
@徐潇
五、成果&完成度
基于libp2p网络传输协议封装(文件上下传,Node状态、接口通信)
libp2p的Vuex状态管理
src/store/modules/libp2p.js
基于libp2p的PB协议通信
src/utils/libp2p/index.js
账户状态与路由控制(登录、注册、注销)
src/permission.js
端多密钥对生成功能
src/utils/keystore/crypto.js
前端文件/文件树操作(新增文件、新增文件夹)
src/views/fileexplorer/index.vue
文件传输状态控制(上传、下载、暂停、速度计算)
src/utils/uploader.js
src/utils/downloader.js
六、疑难杂症&解法
异步语义转为同步语义
promise,async,await
WebCrypto的好处以及限制
好处:浏览器原生支持,效率和兼容性最好,支持最全,最标准
限制:需要在https下使用。
https及wss浏览器限制
必须https,所以必须wss,导致存储端必须用nginx代理证书,增加横向扩展成本。
使用worker实现浏览器中上传、下载、分片、加密
浏览器是单线程模型,使用worker执行异步串行任务,防止UI阻塞
asmcrypto.js的加密提速(40倍)
基于asm.js和WebCrypto的AES\RSA加密实现,提速更快。
asm.js最早由Mozilla牵头发起,从页游提速需求而来,是一个JavaScript的严格的子集,编译器可以将 C / C++ 代码编译成这种叫做 asm.js 的 JavaScript 变体,执行编译速度逼近本地原生应用。
目前比较火的WebAssembly就是Mozilla,Google,Microsoft, ,Apple对asm.js的标准化过程,适合浏览器端的强计算密集型场景。
并行传输速度精度调参策略
- 网络连接建立之初(植入头数据,使得速度曲线抖动平滑)
- 分片零界点有跳跃
七、可复用经验点
-
如果我们未来有做云端文件管理系统,可以复用。
-
前端工程可为未来的雾存储和计算PaaS平台提供一个基本的MIS框架。
-
libp2p + Protocol Buffer的传输解决方案。
-
存储端(分布式)- 控制端(中心式)调度架构。
八、QA & 未来计划
- webcrypto补充实现(历史遗留)
- 文件删除功能(期望能补上)
- 入驻libp2p社区项目(PR素材)
Comments | NOTHING