Rooch v0.1 发布,这是“萌芽|Sprouting”里程碑的一部分。
萌芽|Sprouting 里程碑的目标是发布第一个 Rooch 容器预览版本,提供基本的开发者工具,让开发者可以基于 Rooch 容器进行开发。
Rooch v0.1 的关键特性
这个版本主要提供了以下主要特性:
Rooch 命令行工具
用来启动 Rooch 容器,创建,编译,部署 Move 项目,查询应用合约的状态、交易以及交易执行结果等。可以支撑一个应用的完整开发周期和需求。 CLI 支持的命令以及参数请参看:Rooch 命令行工具。
MoveOS
MoveOS 是对 MoveVM 的封装,给 MoveVM 提供了标准化的状态树以及状态证明,封装了交易的验证以及执行流程。未来,MoveOS 还可以用在其他的想支持 Move 运行环境的使用场景中。
Move 标准库以及框架
Rooch 内置了 MoveStdlib
、MoveosStdlib
和 RoochFramework
三个 Move 标准库,其中 MoveStdlib 是 Move 语言的标准库,MoveosStdlib 是 MoveOS 的标准库,RoochFramework 是 Rooch 的应用框架。
MoveStdlib
使用地址0x1
。直接复用 Move 语言的标准库。MoveosStdlib
使用地址0x2
,提供了对 MoveStdlib 的扩展,以及应用状态存储的抽象,和数据结构封装:Table
、TypeTable
、Object
、ObjectStorage
、AccountStorage
等。RoochFramework
使用地址0x3
,包含 Rooch 的账户(Account
)、交易验证、多链地址映射等模块。
Rooch 的这种基础库地址分配方式,一方面避免了模块的命名冲突,方便扩展。另外一方面也提供了这样一种可能,生态项目也可以直接给 Rooch 内置 Framework,比如 DAO、DeFi、Gaming、Social 等。下个阶段 Rooch 会发布 Framework 共建的计划,敬请关注。
Move 存储抽象
Rooch 在 Move 基础上实现了存储抽象,同时提供了 ObjectStorage
和 AccountStorage
两种状态存储模式,废弃了 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) |
这样做主要有两个目的:
- 通过合约来定义状态的存储,通过底层的 Key-Value 接口统一
ObjectStorage
和AccountStorage
。为未来扩展状态存储提供可能,比如提供应用专用的存储空间。 - 解决了 Move 的引用难题。开发者无法在自己的方法中返回通过
borrow_global<T>
指令借用的引用,因为这个引用是凭空创造的,不能作为方法的返回值。而如果通过StorageContext
借用,则可以达到这个目标,该引用的生命周期和StorageContext
的生命周期绑定。
同时,为了保证状态存储的安全性,让 AccountStorage
和 ObjectStorage
的方法遵循和 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 中的交易执行流程请参看:交易执行流。
示例
这个版本中,提供了一些简单的示例项目,包括:
- counter (opens in a new tab):一个简单的计数器,并且初步实现了和
MetaMask
的交互界面。 - basic_object (opens in a new tab):简单的
Object
示例。 - complex_struct (opens in a new tab):展示复杂的
struct
结构在 JSON RPC 中的输出结果。 - event (opens in a new tab):展示
Event
的使用。 - entry_function_arguments (opens in a new tab):展示 entry function 支持的参数类型。
- kv_store (opens in a new tab):一个简单的 KV 存储。
- blog (opens in a new tab):一个简单的博客应用,带有评论。
这些项目可以让开发者快速上手 Rooch,了解 Rooch 的基本特性。
下一步的目标
下一步,Rooch 主要从三个方向进行改进:
- 继续完善开发者工具,改进 Rooch 的存储和检索接口,探索支持 SQL 查询的检索接口,让 Rooch 成为最高效易用的 Web3 原生应用开发框架。
- 实现多链结算,让 Rooch 的合约可以直接校验并处理其他链上的交易。进一步完善多链的 RPC Proxy 接口,改进钱包使用体验。
- 实现 Token/NFT 标准以及多链资产映射,完成账户抽象(AccountAbstraction),实现 Gas 代付,SessionKey,以及 Web2 账户登陆。
基于以上特性,Rooch 这个阶段主要从 Rooch 即后端服务(Rooch as a Backend Service) 角度探索可落地的应用场景。让任何想接入区块链的应用直接使用 Rooch 作为后端服务,开发者只需要掌握前端技能以及 Move 语言。虽然当前只是一个中心化的方案,但未来应用可以通过接入 Rooch 主网来实现去中心化。
它比基于 Web2 的开发框架有以下优势:
- 内置的多链支持,包括签名校验,区块头验证,地址映射以及钱包支持。
- 丰富的检索能力,不需要进行二次开发。
- 支持基于 Gas 的防 DDoS 攻击。
- 支持即时确认,以及 SessionKey 可以实现类似于 Web2 的用户体验。
一些具体场景:
- Web3 Blog,Web3 Forum 等。比如将 Rooch 作为 nostr 协议的一种实现。
- Rooch 作为 Bitcoin 铭文协议(BRC20)的 Index Service。
- Rooch 作为类 Wiki 的公共数据平台,通过治理实现数据的更新。
- 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)。