一个用于离线和分散的Web应用程序的框架

2020-11-16 01:07:36

Concords是一个MVP框架,用于构建离线和分散的Web应用程序,并采用基于文件的方法来存储数据。它没有服务器或数据库,是一个用Javascript和HTML构建的静态应用程序,所有代码都是在浏览器中运行的,没有任何东西存储在浏览器或下载的文件之外。

SaaS应用程序在具有数据库的服务器上运行。与用户界面的每次交互都会将信息从浏览器发送到服务器,然后服务器很可能会从一个集中的数据库中写入或提取一些内容。

维护服务器和数据库既昂贵、复杂又耗时,而且我对软件的这一方面并不真正感兴趣。我不想要管理依赖的数据的责任,这既不是我的技能,也不是我的激情所在。我喜欢把注意力集中在前端体验上。

我开始为基于文件的SAAS应用程序构建一个框架。多用户协作应用程序,具有数据驱动的用户流和高级用户界面。但离线运行并将状态保存到文件系统的应用程序,不会将其发送到基于云的数据库。为用户提供对其数据的完全所有权和可见性,而不依赖于互联网连接。采取循序渐进的方式实现互联互通,利用它丰富体验,但不依赖它。

这款MVP展示了一个在协作Web应用中实现真正离线和分散体验的基本解决方案。这是一个静态的应用程序,所以只有Javascript和HTML,没有服务器或后台运行的数据库。这是一款先进的网络应用程序,有一名服务人员,完全可以在浏览器中运行。因此,一旦执行了初始加载,剩下的体验就可以完全脱机工作了,数据存储在文件中,通过用户界面下载和上传。

一款董事会应用程序涵盖了SAAS应用程序中常见的许多功能,我认为它是证明这项技术的一个很好的基准。

使用协和协议,身份验证全部在浏览器中完成,无需与服务器或外部资源进行任何通信。

在协和认证系统中,我们会发布一个可下载的公共配置文件,其中包括您的公钥和一些基本用户信息。我把我的MVP留在了我的个人领地上。Https://ternent.dev/concords/sam-ternent.profile.concords.json

任何可以访问我的公钥的人都可以为我加密数据,只有我可以用我的私钥读取这些数据。我只是把它储存在我的个人电脑里。它从来没有在网上出现过,其他人也不知道。

此键用于将用户登录到应用程序,只有有效的组合键才能登录和访问软件。

对于我的MVP来说,这足以完成一个像样的身份验证流程。我们可以使用可识别的配置文件/密码组合的用户体验来构建登录系统,同时设置加密的多用户数据流。

我知道要求用户自己存储加密密钥的两个部分是一件痛苦的事情。如果私钥丢失,它将无法恢复,该密钥的任何加密数据也将无法恢复。但我不能在这方面妥协,只有这样才能保持事情的分散化。但这是一个可以通过软件解决的问题,它不一定非要由我的软件来解决--我们正在分散处理,但密钥管理软件会解决这个问题。

大致了解我需要构建什么来证明这个概念,并且已经实现了用户配置文件和身份验证流,我选择实现的关键特性是:

默认情况下,新用户无权编辑文档。为了MVP的目的,我们在左边的工具栏上放了一个加盟按钮。单击此选项将把用户作为条目添加到数据存储中,并解锁编辑。目前,这个概念已经涵盖够了,但是我们能够通过公钥/私钥身份验证实现直接加密,因此这将是在MVP上下文之外进一步探索的一个有趣途径。

该框架的核心是用打字稿写成的。它是一组功能实用程序,覆盖了应用程序的数据端。它运行一个内部区块链来写入数据,并映射到一个用于读取的IndexDB实例。

该图书馆的核心是Merkel Tree解决方案。我们的Merkle Tree(如在BlockChain和Git中使用的)是一个功能库,在浏览器中充当JSON对象结构中的区块链节点。

在此基础上构建的是CRUD API,应用程序将与该API进行交互。当在应用程序中执行操作时,会为区块链创建带时间戳的事务。一旦提交,所有挂起的事务就会被添加到链上的一个块中。一旦区块被添加到区块链中,基于散列的数据结构就可以确保应用程序状态的完整性。

{";类型";:";任务";,";操作";:";创建";,";数据";:{";标题";:";任务名称";,";描述";:";任务描述";,";已完成";:FALSE,";到期日";:";2020-11-02";,";Assigned_to";:";a72e75a898db9247be59d1aaf9d4c54459e1d24faa43d9f5da0a5a9611a19eb";,";Column";:";2bb6a2b737381377fd962b1bda0771d084abd3cab270648c78b7e06566e6b5";,";id";:";d2e25d4d6c77b34fbe87da5f387cf8c3bec25ffc76673e84bf76dbf2aa15754f";,";Timestamp";:1604144654690},";User";:{";FirstName";:";Sam";,";姓氏";:";Ternent";,";头像URL";:";https://ternent.dev/concords/avatar.jpeg";,";组织";:";Team Concords";,";id";:";a72e75a898db9247be59d1aaf9d4c54459e1d24faa43d9f5da0a5a9611a19eb";},";签名";:";未发布";}。

区块链的另一边是DB层。当它接受区块链上的交易时,我们解析事件并在浏览器中对IndexedDB实例执行操作。事务在进入时被记录,因此我们不会重复事务,并最大限度地减少对数据库的写操作次数。

只要我们有区块链数据对象,我们就能全面了解我们的应用和数据状态。我们可以根据受保护的事务历史记录,完全准确地删除并重新创建数据库。这是只读图层。

这里的一个快速跳跃是使用电子将其构建成一个桌面应用程序。一些小事情,比如将散列保存到密钥链,直接读写文件系统。我很高兴能尝试运行DAT项目,使P2P连接能够提供实时协作体验。

我的首要目标是权力下放。我并不反对将数据存储在云上,我只是希望能够自己选择在哪里存储数据。我最初想尝试的突出集成是与Dropbox的集成,将文件系统中的文件夹同步到Dropbox将使我们能够引入Git中的推/拉(Push/Pull)方面。(=。

我需要围绕冲突解决做进一步的研究。我有完整区块链的基础,包括工作证明和共识,以确保底层数据结构的有效性,但它不能保护或处理应用程序内的数据冲突。视觉差异和冲突是各种其他应用程序中解决的问题,有大量的研究可用。我还不确定它会是什么样子,但它应该是一个有趣的问题来解决。

使用我们的数据结构,用户角色和权限是可以实现的。通过使用应用程序级别的权限密钥,我们可以加密特定用户的访问密钥。然后,他们将有权访问该权限级别下的任何数据。