Skip to content

Latest commit

 

History

History
185 lines (144 loc) · 13.2 KB

0.编译并部署DIYOOD.md

File metadata and controls

185 lines (144 loc) · 13.2 KB

简介

非常感谢您阅读《Hello,CYFS》系列教程!

基于我们多年来对工程师的了解,这应该是您决定“认真”使用CYFS后认真看的第一篇文章。而且,您期望这个系列里没有什么虚无缥缈的道理,都是务实的实操性内容。

是的,在《Hello,CYFS》系列教程中,我们不会要求您阅读过其它CYFS相关的文章,也不需要您拥有丰富的Web3行业背景知识。我们只假设您已经拥有下列知识:

  1. 能比较熟练地使用Linux操作系统
  2. 会JavaScript,能读懂TypeScript(我们强烈推荐每一个JavaScript开发者都学会使用TypeScript)
  3. 熟悉常用JS脚手架
  4. 对HTTP协议有基本的了解

本教程将手把手地指导您用最快的速度创建一个可用的标准CYFS Object URL(cyfs://o/$owner_id/$obj_id),简单粗暴地理解CYFS如何实现Web3的“拥有”的理念,理解Web3是如何实现“拥有是指每个人都拥有在网络中保存内容、发布内容、并通过内容获得直接收入的能力”。

什么是CYFS Object URL

今天广泛使用的HTTP协议有着简洁的设计:http://$host/$path ,其逻辑含义为指向$host所代表的计算机文件系统中$path保存的文件。这个设计有几个众所周知的缺点:

  1. 404问题,不管是host指向的计算机网络故障,还是其存储结构调整,都会导致404
  2. 无法发现大量不同的URL指向相同的内容
  3. URL的生成是后置的,必须先拥有域名和服务器,完成部署后才能生成
  4. 没有内容验证,$host的拥有者可以随意修改URL指向的内容
  5. 没有内容验证,只能使用来源可信:相信持有证书的服务器返回的所有内容

在这些缺点的影响下,站长们为了提高网站的访问体验,在构建内容的时候越来越不喜欢使用外链($host是别人的URL),最终,链接万物的Web蜷缩成了一个个信息孤岛。

解决上述问题,让信息之间可以重新互联是cyfs://代表的Web3 URL的首要任务。我们使用“Content base URL”来解决这个问题。一个典型的CYFS URL定义如下:

cyfs://o/$owner_id/$obj_id

域名段的o表示这是一个CYFS Object Link,Object Link指向一个确定的内容(我们称作NamedObject)。$owner_id代表这个内容拥有者的地址,可以简单的理解成公钥的Hash,$obj_id则可简单理解成内容的Hash。这意味着,只要内容和内容的作者确定,就能构建一个合法的CYFS Object Link。这是一个简洁的,拓扑无关的URL构造。相比HTTP URL有如下优点:

  1. 拓扑无关,可以离线构造URL
  2. 从任何服务器上返回的内容只要Hash正确都是有效的
  3. 内容可校验,不用担心被篡改

CYFS Object URL的解析

理解CYFS Object URL的基本原理后,我们知道通过密码学就可以简单地为任意文件构造CYFS Object URL,但这个URL是如何被打开的呢?我们不使用缓慢的DHT来进行去中心的内容寻址,而是在网络拓扑中引入了一个被称作OOD(Owner Onine Device)的新节点来简单的解决这个问题。常规的步骤如下:
Step1: 通过$owner_id注册在区块链上的信息,得到其OOD的DeviceId
Step2: 通过DeviceId建立到OOD的P2P链接,请求$obj_id
Step3: DeviceId返回对应$obj_id对应的内容

似乎和标准的HTTP协议解析过程差别不大,但这里我们避免使用了中心化的域名系统和 CA 系统。我们还通过在 Step3 引入 NDN 理论,让系统拥有了极强的自动负载平衡能力。不过这只是一篇快速的入门文章,我们就不展开介绍了。

理解上述步骤后,我们思考可知,要创建一个能被访问的CYFS Object URL总共需要3步。

  1. 创建密码学身份,我们通常称为创建PeopleObject
  2. 创建OOD,并在区块链上将OOD与密码学身法绑定
  3. 计算文件的Hash,并把文件上传到OOD上

搭建 DIYOOD

我们先从相对比较慢的事情开始:准备OOD。OOD在技术层面,可以认为是运行了特定服务,有比较良好网络接入环境(能被P2P链接成功)的个人计算节点。我们先准备这个计算节点,我们推荐Linux系统的VPS(内存有4G),或则一台闲置的Linux主机,这个主机最好有比较不错的网络环境(IPv6 或 IPv4有比较好的NAT)。

在准备好的计算节点上部署相关服务,让其称为一个OOD,可以选择:

  1. 使用我们的预编译二进制安装包安装
  2. 从源码编译自己的OOD Service组件,并自行部署

使用预编译的二进制安装包

CYFS将会有三条不同的版本线,这三条版本线的默认是互相隔离的。使用不同版本线的CYFS节点间不互通。我们不保证三条版本线间的数据兼容性

  • Nightly: Nightly版本是更新最频繁的版本,所有的新特性和新修改都会在Nightly版本上最先体现出来。CYFS Core Dev Team使用Nightly版本进行开发。Nightly版本间不保证数据和协议的兼容性和可靠性
  • Beta: 一般意义上的测试版,会定期合并Nightly版本上的功能。推荐外部开发者使用该版本进行早期的测试开发。Beta版本间尽量保证数据和协议的兼容性和可靠性。
  • Stable: 稳定版本。会定期合并Beta版本上的功能。Stable版本间会尽量保证数据和协议的兼容性和可靠性。目前CYFS目前还没发布稳定版。

可以从download.md或我们的官网https://cyfs.com/download,下载对应系统的OOD二进制安装包。下载后,直接执行安装包即可。这个安装包会做以下事情:

  • 如果是非Windows系统,检查libc版本,确保满足我们预编译的二进制要求
  • 如果系统未安装node.js,安装node.js的LTS版本。安装包并不会检查已安装的node.js版本
  • 如果是非Windows系统,且系统未安装docker,安装最新的docker-ce版本
  • 从当前版本线的官方Service Repo服务器下载最新的OOD Service组件(nightly 版本更新的非常频繁)
  • 将OOD Service部署到本地,并启动

预编译的二进制安装包在以下系统上进行过测试:

  • Windows 10/11
  • Ubuntu 18/20
  • Centos 7/8
  • Debian 9

其他未列出的Windows、Ubuntu、Debian、RedHat也可能支持。 我们并没有在更多的系统上进行过完整测试。

安装完成后,系统里增加了如下目录。刚刚安装完成后,有些目录可能不会出现,此处只是作为示例:

{cyfs_root}
    ├── app
    │   └── web
    ├── data
    ├── etc
    │   ├── acl
    │   ├── desc
    │   ├── gateway
    │   └── ood-daemon
    ├── log
    │   ├── app
    │   ├── ood-daemon
    │   ├── ood-daemon-monitor
    │   └── panic
    ├── run
    ├── services
    │   ├── app-manager
    │   ├── chunk-manager
    │   ├── dsg-service
    │   ├── file-manager
    │   ├── gateway
    │   └── ood-daemon
    └── tmp
        └── repo
  • {cyfs_root}: CYFS OOD组件的根目录。OOD相关的所有数据都会放在这个目录下。目录的具体位置:
    • ${cyfs_root}具体路径:
    • Windows: c:\cyfs
    • MacOS: ~/Library/cyfs
    • 其他系统: /cyfs
  • app: 存放Dec App的程序。Dec Service部分存储在{DEC_ID}子文件夹下,Dec Web部分存储在web\{DEC_ID}子文件夹下
  • data: 本地数据存放目录,OOD的各种服务,和Dec Service的本地数据都会放在这个文件夹下
  • etc: 配置存放目录。各种配置文件和OOD的身份文件都存放在这个目录下
  • log: 日志存放目录,OOD服务的日志存放在{service_name}子目录下,Dec Service的日志一般存放在app\{app_name}子目录下
  • services: 存放OOD服务的程序。我们可以看到当前一共有6个OOD服务程序,这些程序都分别存放在以service_name命名的子文件夹下
  • run: 储存进程锁文件的目录
  • tmp: 临时目录,存放一些OOD服务运行中产生的临时文件

在安装完成后,未绑定之前,只会有一个ood-daemon进程在运行,等待绑定OOD。我们可以用top等进程管理工具来确认这一点。当OOD绑定后,6个OOD服务程序都会运行。我们会在下一章说明如何绑定OOD。

从源码编译自己的OOD Service组件,并部署

如果您的目标系统没有在支持列表中,也可以选择自己编译并部署OOD Service。CYFS OOD理论上支持绝大部分Windows和Linux/类Unix系。 如果你用的系统不在上述列表中,比如你打算用自己的树莓派来搭建OOD,这个时候就需要自己编译代码。对树莓派的官方二进制支持在准备中。 如果不想用预编译的二进制文件,或者你对代码进行了自己的改动,我们也支持自己编译OOD需要的所有组件,并自行部署到安装任何系统机器。

编译前准备

目前,我们提供的编译脚本还不支持交叉编译,但是您可以改造我们提供的脚本,实现交叉编译。

OOD Service的编译需要满足以下需求:

  • Node.js 14或以上版本:执行编译脚本所需,如果不使用编译脚本,不需要此依赖。我们的大量编译脚本都用typescript编写,在CYFS的生态中,rust和typescript是我们提供了完整支持的语言。
  • rustc 1.57或以上版本
  • Apple M1/M2机型:需安装Rosetta。一些编译工具暂未原生支持Apple M1/M2平台

从脚本编译OOD Service

可以通过checkout不同的分支,来获取不同版本线使用的源代码:

  • nightly版本线:main分支
  • beta版本线: beta分支
  • stable版本线:尚未准备

先在源码的根目录(./src/)下,执行命令npm i,安装脚本需要的各种依赖包。

脚本在编译过程中,需要创建${cyfs_root}文件夹。如果当前系统或当前用户没有权限创建该文件夹,需要事先手工创建${cyfs_root}文件夹,并将读写权限赋予当前用户。(正式环境中,OOD System的所有组件和数据都会安装到${cyfs_root})

${cyfs_root}具体路径:

  • Windows: c:\cyfs
  • MacOS: ~/Library/cyfs
  • 其他系统: /cyfs

在源码的./src/文件夹下,执行命令node ../scripts/build-standalone.js, 这个脚本会编译OOD Service和本地部署需要的工具,并完成本地初步部署。最后生成安装器ood-installer

编译前,可以通过VERSIONCHANNEL两个环境变量,指定小版本号和Service使用的版本线。CHANNEL的可选值当前为nightlybeta。如果不指定这两个环境变量,默认小版本号为0,版本线为nightly。

注意: 无论checkout了哪个分支,都必须在编译前通过CHANNEL变量来指定版本线,版本线和分支不匹配可能导致编译出的程序运行出错。

编译的具体步骤,可以参考build-standalone.js代码。

部署OOD Service

编译完成后,会

  1. 生成${cyfs_root}/repo_store目录,这个目录按照一定格式,保存本地编译出来的OOD Service二进制文件。
  2. src文件夹下,生成ood-installer安装器。

安装前,需要自行准备OOD的依赖环境:

  • Node.js LTS版本

如果是非Windows环境,还需要:

  • 安装docker-ce最新版本,配置开机启动
  • 执行命令docker pull alexsunxl/cyfs-base,拉取运行Dec Service所需的docker基本镜像

执行命令./ood-installer --target solo,就会使用本地编译的二进制作为OOD Service

编译完成的OOD Service组件,可以用来部署到同系统的其他机器上:

${cyfs_root}/repo_store目录,拷贝到新机器的相同目录下,将ood-installer程序拷贝到新机器的任意目录下,配置好依赖环境,执行上述的安装命令即可。 也可以通过搭建自己的 OOD Service Repo Server的方法,给一个环境里大量机器部署自己编译的OOD Service,其操作方式会在更高阶的文档里介绍。

其它搭建OOD的方法

除了自己搭建DIYOOD,我们还提供了3种更适合普通人的获得OOD的方法:

  1. 购买开机即用的实体OOD。这也是未来最主流的方式,目前已经有多家CYFS生态企业正在CYFS开源系统之上定制自己品牌的OOD硬件,很快就可以在市场上买到。
  2. 订阅基于VPS实现的立即可用的VirtualOOD, VirtualOOD是门槛最低开通速度最快的OOD方式,相信会是大部分普通用户第一次的选择。
  3. 在符合性能要求的主流NAS系统上安装相应的软件,让NAS设备变身成一台OOD。CYFS生态组织里有一些NAS爱好者正在制作针对特定型号NAS的OOD套件包。

上述几种OOD的使用,在CYFS 官方钱包 CyberChat的添加OOD界面都有直观的引导,开发者不用担心终端用户无法获得OOD。

小结

本章我们介绍了CYFS的一些基本原理,尤其重点的介绍了CYFS架构设计的关键创新:OOD。本章结束后您已经拥有了自己的OOD,并对CYFS的开源代码有了一些基本的了解。下一章里我们会讨论如何拥有一个有效的密码学身份。