Rooch v0.1 发布,完成“萌芽|Sprouting”里程碑

Rooch v0.1 发布,这是“萌芽|Sprouting”里程碑的一部分。

萌芽|Sprouting 里程碑的目标是发布第一个 Rooch 容器预览版本,提供基本的开发者工具,让开发者可以基于 Rooch 容器进行开发。

Rooch v0.1 的关键特性

这个版本主要提供了以下主要特性:

Rooch 命令行工具

用来启动 Rooch 容器,创建,编译,部署 Move 项目,查询应用合约的状态、交易以及交易执行结果等。可以支撑一个应用的完整开发周期和需求。 CLI 支持的命令以及参数请参看:Rooch 命令行工具

MoveOS

MoveOS 是对 MoveVM 的封装,给 MoveVM 提供了标准化的状态树以及状态证明,封装了交易的验证以及执行流程。未来,MoveOS 还可以用在其他的想支持 Move 运行环境的使用场景中。

Move 标准库以及框架

Rooch 内置了 MoveStdlibMoveosStdlibRoochFramework 三个 Move 标准库,其中 MoveStdlib 是 Move 语言的标准库,MoveosStdlib 是 MoveOS 的标准库,RoochFramework 是 Rooch 的应用框架。

  1. MoveStdlib 使用地址 0x1。直接复用 Move 语言的标准库。
  2. MoveosStdlib 使用地址 0x2,提供了对 MoveStdlib 的扩展,以及应用状态存储的抽象,和数据结构封装:TableTypeTableObjectObjectStorageAccountStorage 等。
  3. RoochFramework 使用地址 0x3,包含 Rooch 的账户(Account)、交易验证、多链地址映射等模块。

Rooch 的这种基础库地址分配方式,一方面避免了模块的命名冲突,方便扩展。另外一方面也提供了这样一种可能,生态项目也可以直接给 Rooch 内置 Framework,比如 DAO、DeFi、Gaming、Social 等。下个阶段 Rooch 会发布 Framework 共建的计划,敬请关注。

Move 存储抽象

Rooch 在 Move 基础上实现了存储抽象,同时提供了 ObjectStorageAccountStorage 两种状态存储模式,废弃了 Move 原有的全局存储指令,用 AccountStorage中的方法替代,下面是二者的映射表。

Move 全局存储指令AccountStorage 中的方法
move_to<T:key>(&signer,T)context::move_resource_to<T:key>(&mut StorageContext,&signer,T)
move_from<T:key>(address)context::move_resource_from<T:key>(&mut StorageContext,address)
borrow_global<T:key>(address)context::borrow_resource<T:key>(&mut StorageContext,address)
borrow_global_mut<T:key>(address)context::borrow_mut_resource<T:key>(&mut StorageContext,address)

这样做主要有两个目的:

  1. 通过合约来定义状态的存储,通过底层的 Key-Value 接口统一 ObjectStorageAccountStorage。为未来扩展状态存储提供可能,比如提供应用专用的存储空间。
  2. 解决了 Move 的引用难题。开发者无法在自己的方法中返回通过 borrow_global<T> 指令借用的引用,因为这个引用是凭空创造的,不能作为方法的返回值。而如果通过 StorageContext 借用,则可以达到这个目标,该引用的生命周期和 StorageContext 的生命周期绑定。

同时,为了保证状态存储的安全性,让 AccountStorageObjectStorage 的方法遵循和 Move 全局状态指令一样类型安全规则,Rooch 引入了 #[private_generics(T)] 注解(annotation)。这个注解可以加在方法上,表示该方法的泛型参数 T 必须定义在调用方的当前合约中,遵循 Move 全局存储指令一样的约束。

关于状态存储的详细设计请参看:存储抽象

Rooch 的 JSON RPC

应用可以通过 JSON RPC 来提交交易以及查询应用合约的状态。

Rooch 提供一种基于统一的访问路径(AccessPath)的状态查询接口 rooch_getStates,返回 Move 状态的 BCS 序列化结果。同时,Rooch 还提供 rooch_getAnnotatedStates 接口,返回 Move 状态的 JSON 结构,方便不支持 BCS 的编程语言直接使用。

这个版本提供了 Ethereum RPC Proxy 的演示版本,用户可以通过 MetaMask 和 Rooch Container 进行交互。

Rooch 当前支持的接口请参看:Rooch JSON RPC

Sequencer 以及 Proposer 原型实现

Sequencer 以及 Proposer 这个版本中只包含了一个原型实现,主要表达了 Rooch 中的交易的执行流程,以及即时确认的特性。关于 Rooch 中的交易执行流程请参看:交易执行流

示例

这个版本中,提供了一些简单的示例项目,包括:

  1. counter (opens in a new tab):一个简单的计数器,并且初步实现了和 MetaMask 的交互界面。
  2. basic_object (opens in a new tab):简单的 Object 示例。
  3. complex_struct (opens in a new tab):展示复杂的 struct 结构在 JSON RPC 中的输出结果。
  4. event (opens in a new tab):展示 Event 的使用。
  5. entry_function_arguments (opens in a new tab):展示 entry function 支持的参数类型。
  6. kv_store (opens in a new tab):一个简单的 KV 存储。
  7. blog (opens in a new tab):一个简单的博客应用,带有评论。

这些项目可以让开发者快速上手 Rooch,了解 Rooch 的基本特性。

下一步的目标

下一步,Rooch 主要从三个方向进行改进:

  1. 继续完善开发者工具,改进 Rooch 的存储和检索接口,探索支持 SQL 查询的检索接口,让 Rooch 成为最高效易用的 Web3 原生应用开发框架。
  2. 实现多链结算,让 Rooch 的合约可以直接校验并处理其他链上的交易。进一步完善多链的 RPC Proxy 接口,改进钱包使用体验。
  3. 实现 Token/NFT 标准以及多链资产映射,完成账户抽象(AccountAbstraction),实现 Gas 代付,SessionKey,以及 Web2 账户登陆。

基于以上特性,Rooch 这个阶段主要从 Rooch 即后端服务(Rooch as a Backend Service) 角度探索可落地的应用场景。让任何想接入区块链的应用直接使用 Rooch 作为后端服务,开发者只需要掌握前端技能以及 Move 语言。虽然当前只是一个中心化的方案,但未来应用可以通过接入 Rooch 主网来实现去中心化。

它比基于 Web2 的开发框架有以下优势:

  1. 内置的多链支持,包括签名校验,区块头验证,地址映射以及钱包支持。
  2. 丰富的检索能力,不需要进行二次开发。
  3. 支持基于 Gas 的防 DDoS 攻击。
  4. 支持即时确认,以及 SessionKey 可以实现类似于 Web2 的用户体验。

一些具体场景:

  1. Web3 Blog,Web3 Forum 等。比如将 Rooch 作为 nostr 协议的一种实现。
  2. Rooch 作为 Bitcoin 铭文协议(BRC20)的 Index Service。
  3. Rooch 作为类 Wiki 的公共数据平台,通过治理实现数据的更新。
  4. Rooch 作为全链游戏的后端服务。

更多的可能性,等待开发者的探索。我们即将发布 Rooch 脑洞大赛,敬请关注。

总结

Rooch 的里程碑遵循应用场景驱动的原则,以开发者和用户的使用体验为中心,尝试拓展 Web3 应用的边界,探索 Web3 大规模采用落地的可能。想了解并试用 Rooch,请参看文档:新手入门。 Rooch v0.1 详细的发布说明请参看:Rooch v0.1 (opens in a new tab)。感谢参与贡献的十多位开发者,如果想进一步了解和参与 Rooch,请加入 Rooch Discord (opens in a new tab)