# WeaveDB-一个基于Warp的NOSQL数据库

By [dan](https://paragraph.com/@dan-3) · 2023-01-09

---

     在传统的web2开发中，基本都会包含用户认证，存储，数据库，无服务函数，托管等功能模块，针对每一个功能模块，传统的Web2公司都提供了非常完善的产品，而对于web3开发而言，在用户认证，存储，无服务函数，托管都有完善的产品，但是缺乏一个适合于web3开发的数据库产品。

![](https://storage.googleapis.com/papyrus_images/81793e0087b5def3ed0abc81f1bdc8a53acae9d9b107775c7e9aa299a4eabc91.png)

WeaveDB是一个构建在Arweave上的智能合约Warp上的去中心化NOSQL数据库，它为web3的dapp带来了类似web2的流畅用户体验、复杂性和可扩展性。开发者可以为全栈式的dapp建立复杂的逻辑，而无需编写智能合约。WeaveDB项目的前身是ASTEROID，ASTEROID是Astar上一个web3社交应用，创始人Tomoya Nagasawa在开发ASTEROID过程中现有的web3基础设施无法构建大规模的web3应用，Tomoya 在发现了SCP之后，觉得通过这种模式有可能构建去具有无限扩展性的大规模应用，于是在Warp的基础上开发了WeaveDB，WeaveDB具有跨链认证，数据索引，自动签名等特性。

![](https://storage.googleapis.com/papyrus_images/7686bee3edc716af4f16036cd4305e5060441297d263db569013446acc32d7db.png)

**技术栈：**

![](https://storage.googleapis.com/papyrus_images/dca413ea7b630b003cd92dc2d7f87549937a824cd892984a21ad97bab96b56f1.png)

**SCP - 存储共识范式**

Arweave是提供去中心化的永久存储的公链，一旦交易被最终确定，它是不可改变的。这种不可变的永久性允许计算是确定性的，并与存储完全分离。当初始状态，一个函数，以及一系列用于顺序执行函数以改变初始状态的输入值，都永久地不可改变地存储在Arweave上，那么无论谁计算最终的状态都应该得出同样的结果，不管他们在哪里执行计算。换句话说，有了不可改变的永久存储，计算就可以永远是确定性的。这就是所谓的基于存储的共识/计算范式。

当计算在链下执行时几乎没有任何成本，并使无限的可扩展性成为可能。在目前的区块链模式下，可扩展性的两个最重要的瓶颈是存储和计算，因为这些是消耗gas，交易成本很高。Arweave可以通过超级便宜的永久存储和与存储分离的无限链下计算来消除这些可扩展性瓶颈。

**Warp - SmartWeave合约**

smartweave是第一个利用SCP的模式开发出来的智能合约，Redstone团队在smartweave的基础上开发了Warp，WeaveDB是一个去中心化的NOSQL数据库，本质上是通过Warp智能合约来实现的，Warp旨在让开发者使用任何语言来编写智能合约，例如JavaScript/TypeScript、Rust和Go。Redstone团队在smartweave的基础上开发了序列器，网关，智能合约浏览器，并且为开发者提供测试网开发环境以及发布了一些warp教程帮助开发者使用warp进行智能合约开发。

Warp的具体工作原理如下图所示：

排序器对SmartWeave交互进行排序，考虑到排序器的时间戳和当前Arweave网络块的高度，并以排序器的密钥进行加注。

交互通过Bundlr打包，保证交易的最终性和完整的数据上传可靠性，交易被存储在Arweave上供查询。

SmartWeave协议的懒惰评估性质的关键组成部分是快速和可靠的交互加载。通过Warp的网关，它包含了对分叉和错误的交易的内置保护，保证了交易的可靠加载。

交易可以通过Warp的SDK进行评估，也可以委托给分布式执行网络，一个专门的节点网络（DEN）。

**Bundlr - 快速最终确认和元交易**

Bundlr是Arweave上的二层网络，主要做了以下改进：

*   Bundlr允许用不同链上的代币提前支付交易费用，比如matic，sol
    
*   Bundlr通过一个简单的API即时处理交易，并保证交易最终会在AR网络上确认。
    
*   Bundlr使上传到AR的数据可以通过arweave.net即时访问。
    
*   Bundlr大大提升了AR的tps，因为Bundlr的每笔一层交易都可以包括多笔二层交易
    

序列器使用Bundler来处理智能合约交易达到即时的最终性。从技术上讲，这不是区块链上数据存储的最终性，但对排序器而言，它是智能合约处理的即时最终性，让用户感觉与合约的交互是瞬时完成的。

Dapp用户进行交易时不需要使用AR代币付费，协议或Dapp开发者可以提前付费，类似于元交易使终端用户不再需要原生代币。

由于AR生态系统一些关键的基础设施，可以在AR上建立一个去中心化的Filestore，并且具有以下优点：

*   超级便宜的不可改变的永久存储
    
*   无限的链下计算（scp）
    
*   快速的最终确认和数据可用（bundlr）
    
*   终端用户无需支付gas
    
*   使用任意语言来写智能合约（Warp）
    

**WeaveDB的特性：**

**跨链加密认证**

由于Arweave智能合约可以用任何编程语言进行无限计算，因此Arweave可以成为跨链认证的枢纽。WeaveDB在认证里面集成了以太坊账户，AR账户，以及ICP互联网身份，用户可以用多个链的钱包与基于WeaveDB开发的应用进行交互，应用天然的支持多链，开发者不需要为每条链去开发单独的应用。

![](https://storage.googleapis.com/papyrus_images/f9da1e834a8a01c6927c78981e97d6dd0045b5c3df410e07f50c33b4e6bc7b7a.png)

互联网身份认证为任何设备带来生物识别认证，无需浏览器扩展和移动应用程序，使应用更接近于web2的使用体验

**自动签名**

通过使用WeaveDB,用户与应用进行交互时不再需要使用钱包进行签名。当登录一个dapp时，用户在本地indexedDB的安全空间中创建并存储一个临时密钥对，将临时地址链接到WeaveDB的原始地址，然后此后的交易将由临时地址的私钥自动签名。

**包含语法糖的类似filestore的API**

WeaveDB API把所有的查询表示成JSON数组和对象，从而代码变得更加简单。WeaveDB能够做Filestore能做的绝大部分。

**内置数据索引用引**

传统的区块链的智能合约由于计算的昂贵不可能在智能合约上去实现索引，一般的dapp都会借助于the graph等专门的索引协议来实现数据的索引。

WeaveDB内置了数据索引，WeaveDB会自动会存储的数据的每一个字段自动创建索引，并支持开发者可以利用WeaveDB创建多字段组合索引

![](https://storage.googleapis.com/papyrus_images/c3864d5e772d7d4db2faee475d3f19cd6a74229047a22ece4bb9d4367d31a575.png)

**数据模式&访问控制规则**

去中心化的数据库与中心化的对应数据库有很大的不同，即使它们看起来功能相似。在中心化数据库中，通常只有一个网关认证，用于少数具有编辑角色的授权用户。只要你能确保管理员不会因为编程故障而弄乱数据，你就不必定义详细的数据和访问规则。

一个去中心化的数据库可以被无权限地访问，任何人都可以尝试向它写入任何错误的数据。因此，你需要设置对数据方案和访问控制规则的完全控制。为了解决这个问题，WeaveDB创建了基于JSON的函数式变成语言FPJSON.FPJSON是一种JSON数组，开发者可以使用函数式编程语言写复杂的逻辑。FPJSON让复杂的算法可以存储为智能合约的状态因为所有的东西都是JSON对象，并且包含了250个Ramda 函数，另外还可以与JSONLogic进行组合去构建非常复杂的逻辑来控制数据验证和访问控制。

![](https://storage.googleapis.com/papyrus_images/b6e16c843c27b62806409332607a34c26810e1b4373e99e6d6f88176826f4a20.png)

FPJSON的使用非常简单，下图就是一个使用FPJSON实现两个数相加的例子

![](https://storage.googleapis.com/papyrus_images/514007751ab7acfb507f4548a5432534400b0d4cf2c64470bdccb2b079941c15.png)

使用FPJSON和JSONLogic来实现定义数据模式和设置模式也非常简单，下图定义了一个数据模式，要求每个Document必须包含article\_id,date,user\_address三个字段，并且定义了article\_id和user\_address是字符串类型，date是数字类型

![](https://storage.googleapis.com/papyrus_images/0ad0bd1c0098a4aa9cd5a6d6bf219520132124b3177c046301b4dd188cf132f7.png)

下图定义了一个访问规则，当创建Document的时候要求user\_address是钱包签名用户，date是区块的时间戳，done为false，更新Document的时候要求必须是签名用户和user\_address一致才可以进行更新，并且将done设置为true，删除Document的时候要求签名用户和user\_address一致才可以删除

![](https://storage.googleapis.com/papyrus_images/c9e6f89be1904c9f53be375f849d0ffae41bd773dd0ccc56032fb49ee811ed34.png)

**计划的Cron作业**

FPJSON和类似JSON的简单查询API与Arweave智能合约的确定性的强大结合，使得运行预定的cron作业成为可能，而无需定期发送交易来执行。

首先，DB查询和任何要执行的逻辑都可以表达为JSON对象，并存储为智能合约状态。

其次，使用SCP的计算总是确定性的，所以一旦cron作业被定义和存储，WeaveDB可以找出插入cron计算的位置，并在执行最新请求的查询之前自动执行这些计算到当前的时间戳。

它基本上像Lisp（但只是JSON），你可以定义宏，在不发送交易的情况下在智能合约上定期自动执行。

例如，我们的社交书签dapp使用一个cron job来自动计算哪些文章在过去2周内是流行的。但它不需要发送任何交易。只有cron job被定义了一次，它就会一直定期对文章进行排名。

下图就是一个简单的定义cron的一个例子，该cron从一个指定的时间开始执行，每隔12小时执行一次，总共运行10次，每一次执行都会将执行次数加1

![](https://storage.googleapis.com/papyrus_images/95ebe54a9315d809395263356c422a76800bcd82081626d44be000428a0ec3c0.png)

**REPL & Web控制台**

WeaveDB提供了命令行REPL和WEB控制台方便开发者本地开发，通过web控制台，开发者可以为dapp建立复杂的逻辑，而无需编写智能合约。你所要做的就是在web UI上配置DB实例。

下图是REPL的操作界面

![](https://storage.googleapis.com/papyrus_images/297c43b907270750a438f89f39f96b9242c332298ca9f100099fbba531822f05.png)

下图是web控制台的操作界面

![](https://storage.googleapis.com/papyrus_images/b5c64b375cbed4208636a6ab65e9e4c8c92bc983f21900d228a2c68959139ac5.png)

**gRPC node&轻客户端**

为了提供类似web2的用户体验，DB查询的处理速度应该非常快。SmartWeave将计算带到了客户端，但这意味着每个客户端都需要建立整个合约的缓存，计算成为客户端的负担。

Warp正在研究一个委托评估网络（DEN）来解决这个问题，但我们正在建立另一个计算层来为dapp用户实现更好的性能。WeavdDB可以设置一个gRPC节点，并通过WeaveDB Light Client连接到它，以便从客户端移除计算和缓存。这将读取查询的执行时间减少到1秒以下，写入查询的执行时间减少到3秒以下。

![](https://storage.googleapis.com/papyrus_images/e1c43da4b18690cc250482ee64af7883afcbf78006a4c4a9cd18f6897e582e9f.png)

**如何通过WeaveDB构建一个dapp：**

使用如下命令进行合约部署

![](https://storage.googleapis.com/papyrus_images/ba9d3082e321dd5efd9cac2c527c002683ff264ed411c735e3f1c41bf0361ecc.png)

部署成功后的界面如下，fn-KTt8XMHCcP5T8Gv6xHNTlVdesIIFpvkaeE50nKZo就是部署的成功合约地址

![](https://storage.googleapis.com/papyrus_images/8b087f28b57c979a5b6c93c265fdfd4f03a08191171a272dd3e292a81317b81c.png)

**设置数据模式**

![](https://storage.googleapis.com/papyrus_images/fbc07536fdfec2a5c9ff0c6821408efa09c32fe099be5038b0e31ada84c4d583.png)

上面代码定义了一个集合，对集合中的每一个Document要求有四个字段，分别为字符串，数字，布尔类型。

**设置访问控制规则**

![](https://storage.googleapis.com/papyrus_images/c9e6f89be1904c9f53be375f849d0ffae41bd773dd0ccc56032fb49ee811ed34.png)

*   user\_address必须被设置为签名者
    
*   日期必须是block.timestamp
    
*   done必须默认为false
    
*   只有任务拥有者（user\_address）可以将 done 更新为 true。
    
*   只有任务拥有者（user\_address）可以删除该任务
    

要设置模式和规则，你可以简单地运行 repo 中的预定义脚本。

![](https://storage.googleapis.com/papyrus_images/8c890c5c770fd56afcffd0e7aae22a4a37ccdc72819ccc8004d03d96bdd66de6.png)

用部署好的合约地址代替CONTRACT\_TX\_ID，成功部署WeaveDB后就会在控制台打印出日志。

![](https://storage.googleapis.com/papyrus_images/9224e1a79dec617d7f3495ddf05db10c5a8b76e37ee5363ff5468ed9827c2279.png)

**查询数据**

建立一个新任务

![](https://storage.googleapis.com/papyrus_images/2fb31e220c2c8d9fc1e7ae7d279d5616eb66f8ef946dcc188cb346663facf861.png)

标记一个任务完成

![](https://storage.googleapis.com/papyrus_images/72e709891466eaf34c8366a310dbe2735099399ad1af9f293238a38c0c5af14d.png)

返回一个用户的所有任务

![](https://storage.googleapis.com/papyrus_images/a8005d85748adea725bce35babaf2e75756d38322890492a63c4b01b32e74f56.png)

这些查询将会在前端进行实现

**创建前端Dapp**

建立一个next.js项目，取名为todos

![](https://storage.googleapis.com/papyrus_images/4828968383f9c17ba5754955e0058254ad9e06815d6724c221bd0c3eba1c1745.png)

做完以上的步骤，打开浏览器，输入地址

[http://localhost:3000](http://localhost:3000/).然后就可以连接钱包，进行任务创建，删除，标记任务完成等操作。

![](https://storage.googleapis.com/papyrus_images/3e4480358913d7ef404cc4d74ee4a1d11790719830bc7811f950601d7e60ca7c.png)

具体的前端代码实现可以参考[https://docs.weavedb.dev/docs/examples/todos](https://docs.weavedb.dev/docs/examples/todos)

**应用实例：**

**ASTEROID**

[https://asteroid.ac/](https://asteroid.ac/)

ASTEROID是一个社交书签平台，这个APP可以让用户收藏mirror的文章，并且可以对文章的流行程度进行排序。

![](https://storage.googleapis.com/papyrus_images/dcdea39ba0655098b6e155c1c0943118898916707d47dd2cebface2c12c58e8e.png)

**WALL**

[https://xdiw4-hiaaa-aaaai-qnnbq-cai.ic0.app/](https://xdiw4-hiaaa-aaaai-qnnbq-cai.ic0.app/)

wall是一个社交Dapp，前端部署在ICP的canister上，用户可以使用ICP互联网身份，metamask和ARconnect进行登录。

![](https://storage.googleapis.com/papyrus_images/43fe9bcf2ac9c77635fb9e139fc202146e13cfcf245da8e82cd692f91e9b1705.png)

**TODO**

[https://weavedb-todos.asteroid.ac/](https://weavedb-todos.asteroid.ac/)

TODO是一个在线待办事项管理器，用户可以创建任务，删除任务，标记任务完成。

![](https://storage.googleapis.com/papyrus_images/234f318dc9d3cfc1459ccf32d83895e1050f730db0558c3e487238d6b1844b3b.png)

**总结：**

![](https://storage.googleapis.com/papyrus_images/0a58fcac19c5ad51acacc5450846ca0ed2a36d123488f6d80a490e72a7e0014d.png)

WeaveDB可以通过部署一个智能合约的方式来创建一个去中心化的无许可的NOSQL数据库，并且充分利用了AR的生态系统内其他的生态基础设施，使通过WeaveDB构建的DApp能够在链下处理交易，大大提高了应用的可扩展性，从而处理百万级甚至千万级用户web3的社交类应用可能会通过这种方式来实现，另外WeaveDB提供了类似于Filestore的API接口，以及FPJSON来定义数据模式和访问控制规则，并且WeaveDB提供了非常完善的文档告诉开发者如何使用WeaveDB从零搭建一个Dapp程序，可以说WeaveDB将原生的web2开发者迁移到web3开发的门槛变得非常低。使用WeaveDB进行开发，对开发者而言完全不需要写智能合约，开创了新的一种web3开发模式，并且由于计算放在链下，可以构建一些逻辑复杂的应用程序。另外通过WeaveDB构建的Dapp用户可以同时支持不同链的钱包，从而可以让开发者只需要开发一次就可以让不同链的用户同时使用，大大降低了开发的工作量。

对于普通用户而言，WeaveDB集成了ICP互联网身份，用户可以不需要下载器钱包就可以与用户进行交互，由于WeaveDB集成了bundlr，用户的交易能够立即处理，并且gas费用由Dapp负责支付，大大改善了用户体验。并且通过WeaveDB构建的应用，使得用户真正可以拥有自己的数据。

虽然WeaveDB有可能大大提高应用的扩展性，最终WeaveDB是否能够构建拥有大量用户的社交应用还需要市场验证，当真正有大规模用户和交易的时候，可能对bundlr和arweave网关造成很大的压力，不确定bundlr和arweave是否能够应付。另外Arweave生态还处于发展早期，开发者还较少，一些生态工具的完善还是需要一定的时间。

**资源：**

**GitHub Monorepo** [https://github.com/weavedb/weavedb](https://github.com/weavedb/weavedb)

**Website**

[https://weavedb.dev/](https://weavedb.dev/)

**Docs**

[https://docs.weavedb.dev/](https://docs.weavedb.dev/)

**FPJSON**

[https://fpjson.asteroid.ac/](https://fpjson.asteroid.ac/)

---

*Originally published on [dan](https://paragraph.com/@dan-3/weavedb-warp-nosql)*
