跳到主要内容

· 阅读需 37 分钟
Jolestar

作为一个 Move 的鼓吹者,每次给开发者推广 Move 的时候都会遇到这样的问题。Move 有什么优势吗?为什么是 Move?

就像你给好友介绍自己的新恋人,总会遇到类似的问题。但这种问题其实不易回答,如果一条一条列举优缺点,总是会有人质疑,毕竟新语言的生态都不成熟,选择只能基于它的潜力来判断。

我先说一个论断: Move 是最有潜力构建出像 Solidity 这样的生态系统,甚至超越 Solidity 的智能合约编程语言

目标读者:开发者以及对区块链领域的技术感兴趣的朋友。本文希望尽量以通俗的方式说明智能合约当前遇到的难题以及 Move 的一些尝试,尽量少用代码,期望不懂编程语言的朋友也能大致理解,希望读者给一点反馈。 本文写于 2022年5月,当时 Move 初露头角,尚无当前的规模。现在转载于此,重新做了一些词汇上的润色,原始链接

智能合约的两条路

如果把时间拖回到几年前,新公链上支持图灵完备智能合约的编程语言主要有两种方式:

一种是基于现有的编程语言进行裁剪,然后运行在 WASM 等通用的虚拟机里。这种方案的优势是可以沿用当前编程语言以及 WASM 虚拟机的生态。

另一种是新造一个专门的智能合约编程语言,以及虚拟机,从头构造语言以及虚拟机生态。Solidity 就是这条路线,Move 也是这条路线。

那时候大家普遍不太看好 Solidity&Evm 生态,觉得 Solidity 除了用来发 Token,貌似也没有什么用,性能也不好,工具也孱弱,像是个玩具。很多链的目标是让开发者用已有的语言来进行智能合约编程,觉得前一条路更被看好,很少有新公链直接复制 Solidity&Evm。

但经过几年的发展,尤其 DeFi 崛起之后,大家突然发现 Solidity 的生态不一样了。而走前一条路的智能合约生态反倒没有成长起来,为什么呢?我总结有几个原因。

  1. 区块链的程序运行环境和面向操作系统的程序运行环境区别很大,如果抛弃掉操作系统的系统调用,文件 IO,硬件,网络,并发等相关的库,再考虑链上的执行成本,已有的编程语言能和智能合约共享的代码库非常少。
  2. 第一种方案理论上能支持的语言很多,但实际上带有 Runtime 的编程语言编译到 WASM 类似的虚拟机后文件会非常大,不适合区块链场景使用,能用的也主要是 C,C++,Rust 等没有 Runtime 的语言。而这几种语言的学习门槛实际上并不比 Solidity 这种专门的智能合约编程语言的成本更低,并且同时支持多个语言可能会导致早期生态的割裂。
  3. 各链的状态处理机制不一样,即便都用 WASM 虚拟机,各链的智能合约应用也不能直接迁移,无法共享一个共同的编程语言以及开发者生态。

对应用开发者来说,直接面对的就是智能合约编程语言、编程语言的基础库,以及有没有可复用的开源库。DeFi 的安全性要求智能合约代码要经过审计,而经过审计的代码每一行都代表着钱,大家基于已有的代码略做修改进行复制,就能降低审计成本。

现在看来 Solidity 虽然走了一个看起来慢的路,但实际上更快地构建出了生态。现在很多人已经认为 Solidity&EVM 就是智能合约的终点了,很多链都开始兼容或者移植 Solidity&Evm。这时候,新的智能合约编程语言需要证明自己有更强的生态构建能力,才能说服大家关注并学习使用。

那新的问题就是,一个编程语言语言,如何衡量它的生态构建能力?

编程语言的生态构建能力

编程语言的生态构建能力,简单的来说就是它的代码的复用能力,主要体现在两个方面:

  1. 编程语言模块之间的依赖方式。
  2. 编程语言模块之间的组合方式。“可组合性”是智能合约标榜的一个特性,但实际上编程语言都有组合性,我们发明的 Interface、Trait 等都是为了更方便地组合。

先说说依赖方式,编程语言实现依赖主要通过三个方式:

  1. 通过静态库(Static-Libraries)的方式,在编译期静态链接,将依赖打包在同一个二进制文件中。
  2. 通过动态库(Dynamic-Libraries)的方式,运行时动态链接,依赖并不在二进制中,但要预先在目标平台上部署。
  3. 通过远程调用(RPC)在运行期依赖。这里泛指各种可以远程调用的 API。

方式 1 和 2 一般都用在通用基础库的场景下。基础库一般是无状态的,因为应用如何处理状态,比如写到哪个文件里,还是存到哪个数据库表里,基础库是很难假设的。这种调用是在同一个进程同一个方法调用的上下文里,共享调用栈,共享内存空间,没有安全隔离(或者说隔离很弱),需要可信环境。

方式 3 实际上调用的是另外的进程或者另外的机器上的进程,互相通过消息通信,各进程负责自己的状态,所以可以提供状态的依赖,调用也有安全隔离。

这三种方法各有优劣。方式 1 在最终二进制中包含依赖的库,优点是对目标平台的环境无依赖,但缺点是二进制比较大,方式 2 的优势是二进制比较小,但对运行环境有前置要求,方式 3 可以构建跨语言的依赖关系,一般用在跨服务、跨机构合作的场景中,为了方便开发者调用,一般通过 SDK 或者代码生成模拟成方法调用。

技术历史上,很多编程语言,操作系统平台都花费了很大的精力想弥合远程调用和本地调用之间的差异,想实现无缝的远程调用和组合。随便举一些著名的技术词汇,COM(Component Object Model)/CORBA/SOAP/REST 等等,都是为了解决这些问题。虽然实现无缝调用的梦想破灭了,大家最后还是靠工程师人力拼接口,把整个 Web2 的服务给拼接在一起,但梦想的火种还在。

而智能合约,给应用间的依赖方式带来了新变化。

智能合约带来的改变

传统的企业应用之间的依赖方式可以用下图表示:

web2 system rpc call

  1. 系统之间通过各种 RPC 协议把运行在不同的机器上的服务连接在一起。
  2. 机器之间有各种技术的、人工的“墙”进行隔离,保证安全。

而智能合约的运行环境是链的节点给构造出的沙箱环境,多个合约程序是运行在同一个进程内的不同的虚拟机沙箱中,如下图所示:

blockchain smart contract call

  1. 合约之间的调用是同一个进程内不同的智能合约虚拟机之间的调用。
  2. 安全依赖于智能合约虚拟机之间的隔离。

我们以 Solidity 为例子,Solidity 的合约(表明为 contract 的模块)将自己的函数声明为 public,然后其他合约就可以直接通过这个 public 方法调用该合约。以下图的一个 RPC 调用过程为例:

rpc

图片来源 https://docs.microsoft.com/en-us/windows/win32/rpc/how-rpc-works

链实际上接管了上图中,Client 和 Server 之间通信的所有过程,自动生成 stub,实现序列化和反序列化,真正让开发者感觉到远程调用就像本地方法调用一样。

当然,技术并没有银弹,没有一劳永逸的方案,新的方案总带来新的难题需要解决。

智能合约的依赖难题

通过前面的分析,我们理解了智能合约之间的调用实际上是一种类似于远程调用的方法。那如果像要通过库的方式进行依赖调用呢?

在 Solidity 中,表明为 library 的模块,就相当于静态库,它必须是无状态的。对 library 的依赖会在编译期打包到最终的合约二进制文件中。

这样带来的问题就是如果合约复杂,依赖过多,导致编译后的合约过大,无法部署。但如果拆成多个合约,则又无法直接共享状态,内部依赖变成远程服务间的依赖,增加了调用成本。

那是不是可以走第二条动态库加载的路呢?比如 Ethereum 上的大部分合约都依赖了 SafeMath.sol 这个库,每个合约都包含了它的二进制,既然代码都在链上了,为什么不能直接共享呢?

于是 Solidity 中提供了 delegatecall 的方法,类似于动态链接库的解决方案,把另外一个合约的代码,嵌入到当前合约的上下文中执行,让另外一个合约直接读写当前合约的状态。但这就有两个要求:

  1. 调用和被调用方要是完全信任的关系。
  2. 两个合约的状态要对齐。

非智能合约开发者可能不太理解这个问题,如果是 Java 开发者可以这样理解:Solidity 的每个合约都相当于一个 Class,它部署后运行起来是一个单例的 Object,如果想在运行时,加载另外一个 Class 的方法来修改当前 Object 里的属性,那这两个 Class 里定义的字段必须相同,并且新加载的方法相当于一个内部方法,Object 的内部属性完全对它可见。

这样就限制了动态链接的使用场景和复用程度,现在主要用来做内部的合约升级。

因为上面的原因,Solidity 很难像其他编程语言一样提供一个丰富的标准库(stdlib),需要提前部署到链上由其他合约依赖,只能提供有限的几个预编译方法。

这也导致了 EVM 字节码的膨胀。很多本来可以通过系统合约代码从状态中获取的数据,被迫实现成了通过虚拟机指令。比如 BLOCKHASH,BASEFEE,BALANCE 等指令,编程语言本身不需要知道链相关的信息。

这个问题是所有的链和智能合约编程语言都会遇到的问题。传统编程语言并没有考虑同一个方法调用栈内的安全问题,搬到链上之后,也只能通过静态依赖,和远程依赖的方式解决依赖关系,一般连类似于 Solidity 中的 delegatecall 方案都很难提供。

那我们如何才能做到在智能合约之间实现类似动态库链接的方式调用?合约之间的调用可以共享同一个方法调用栈,并且可以直接传递变量?

这样做带来两个安全性方面的挑战:

  1. 合约状态的安全性要通过编程语言内部的安全性进行隔离,而不能依赖虚拟机进行隔离。
  2. 跨合约的变量传递需要保证安全,保证不能被随意丢弃,尤其是表达资产类型的变量。

智能合约的状态隔离

前面说到,智能合约实际上是把不同组织机构的代码放在同一个进程中执行,那合约的状态(简单理解就是合约执行时生成的结果,需要保存起来,供下次执行的时候使用)的隔离就是必要的了,如果直接允许一个合约读写另外一个合约的状态,肯定会带来安全问题。

隔离方案理解起来其实也很简单,就是给每个合约一个独立的状态空间。执行智能合约的时候,将当前智能合约的状态空间和虚拟机绑定,这样智能合约就只能读取自己的状态了。如果要读取另外的合约,则需要前面提到的合约间的调用,实际上是在另外一个虚拟机里执行。

但如果想要通过动态库的方式进行依赖的时候,这样的隔离就不够了。因为实际上,另外一个合约是在当前合约的执行栈中运行的,我们需要基于语言层面的隔离,而不是虚拟机的隔离。

另外,基于合约的状态空间的隔离同时带来的一个问题是状态所有权的问题。这种情况下,所有的状态都属于合约,并没有区分合约的公共状态和用户的个人状态,给状态计费带来难题,长远来看会有状态爆炸的问题。

那如何在智能合约语言层面做状态隔离呢?思路其实也很简单,基于类型。

  1. 利用编程语言对类型提供的可见性的约束,这个特性大多数编程语言都支持。
  2. 利用编程语言对变量提供的可变性约束,许多编程语言区分引用的可变与不可变,比如 Rust。
  3. 提供基于类型为 Key 的外部存储,限制当前模块只能用自己定义的类型作为 Key 来读取外部存储。
  4. 在编程语言层面对类型提供声明 copydrop 的能力,保证资产类的变量不可以被随意复制和丢弃。

Move 语言就是用了以上解决方案,其中第 3,4 点是 Move 特有的。这个解决方案其实也比较容易理解,如果不能在虚拟机层面给每个智能合约程序一个单独的状态空间,在合约内部做状态隔离,基于类型是比较容易理解的方式,因为类型有明确的归属和可见性。

这样在 Move 中,智能合约之间的调用变成如下图所示:

move module call

不同组织的程序,通过动态库的方式,组合成同一个应用运行,共享同一个编程语言的内存世界。组织之间不仅可以传递消息,同时也可以传递引用资源。组织之间的交互规则和协议,只受编程语言的规则约束。(关于资源的定义后文中有描述。)

这个改变同时带来几个方面的优势:

  1. 编程语言以及链可以提供一个功能丰富的基础库,提前部署到链上。应用直接依赖复用并不需要在自己的二进制中包含基础库部分。
  2. 由于不同组织之间的代码在同一个编程语言的内存世界状态里,可以提供更丰富和复杂的组合方式。这个话题在后面会详述。

Move 的这种依赖方式虽然和动态库的模式类似,但它同时利用了链的状态托管的特性,给编程语言带来了一种新的依赖模式。

这种模式下,链既是智能合约的运行环境,同时也是智能合约程序的二进制仓库。开发者通过依赖将链上的智能合约自由组合起来提供一个新的智能合约程序,并且这种依赖关系是链上可追踪的。

当然 Move 现在还很早期,这种依赖方式提供的能力尚未充分发挥出来,不过雏形已经出现。可以设想,未来肯定可以出现基于依赖关系的激励机制,以及基于这种激励模式构建出的新的开源生态。后面我们继续谈一谈可“组合性”的问题。

智能合约的可组合性

编程语言模块之间的可组合性是构建编程语言生态的另外一个重要特性。可以说,正因为模块之间有可组合性,才产生依赖关系,而不同的依赖方式也提供了不同的组合能力。

根据前面对依赖方式的分析,在 Solidity 生态谈论智能合约的可组合性的时候,实际上主要说的是 contract 之间的组合,而不是 library 之间的组合。而我们前面也说了,contract 之间的依赖是一种类似与远程调用的依赖,互相传递的实际上是消息,而不能是引用或者资源

这里用资源(resource)这个词,主要是强调这种类型的变量在程序内不能随意的复制(copy)或者丢弃(drop),这是线性类型带来的特性,这个概念在编程语言中还不普及。

线性类型来自于线性逻辑,而线性逻辑本身是为了表达经典逻辑无法表达的资源消耗类的逻辑。比如有“牛奶”,逻辑上可以推导出“奶酪”,但这里没办法表达资源消耗,没办法表达 X 单位的“牛奶”可以得出 Y 单位的“奶酪” 这样的逻辑,所以才有了线性逻辑,编程语言里也有了线性类型。

编程语言中首先要处理资源就是内存,所以线性类型的一个应用场景就是追踪内存的使用,保证内存资源被正确的回收,比如 Rust。但如果将这个特性普遍推广,我们就可以在程序中模拟和表达任意类型的资源

那为什么组合时能进行资源传递非常重要呢?我们先来理解一下当前的基于 Interface 的组合方式,大多数编程语言,包括 Solidity 都是这样的组合方式。

我们要将多个模块组合起来,最关键的是约定好调用的函数以及函数的参数和返回值类型,一般叫做函数的“签名”。我们一般用 Interface 来定义这种约束,但具体的实现由各方自己实现。

比如大家常说的 ERC20 Token,它就是一个 Interface,提供以下方法:

function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)

这个接口的定义中,有给某个地址转帐的方法,也有查询余额的方法,但没有直接提款(withdraw)的方法。因为在 Solidity 中,Token 是一个服务,而不是一种类型。下面是 Move 中定义的类似的方法:

module Token{
struct Token<TokenType>{
value: u128,
}
}
module Account{
withdraw(sender: &signer, amount):Token<STC>;
deposit(receiver: address, token: Token<STC>);
transfer(sender, receiver, amount);
}

可以看出,Token 是一种类型,可以从账号提取(withdraw)出来一个 Token 对象。有人要问,这样做有什么意义呢?

我们可以通过一种比较通俗的类比来比较二者的组合方式的区别。Token 对象类似于生活中的现金,你想去一个商场购买东西,有两种支付方式:

  1. 商场和银行对接好接口,接入电子支付系统,你支付的时候直接发起请求让银行划账给商场。
  2. 你从银行取出现金,直接在商场支付。这种情况,商场并不需要提前和银行对接接口,只要接受这种现金类型就行。至于接收现金后,商场是将现金锁在保险柜里,还是继续存到银行中,这个由商场自己解决。

而后一种组合类型,可以称做基于资源类型的组合,我们可以把这种在不同组织的合约之间流动的资源叫做“自由状态”。

基于自由状态的组合方式,更像是物理世界中的组合方式。比如光碟和播放机,各种机器的配件。这种组合方式和基于接口的组合方式也并不冲突。比如多个交易所(swap)想对外提供统一的接口,方便第三方集成,则使用接口的组合方式更合适。

基于自由状态的组合的关键优势有两个:

  1. 可以有效地降低基于接口组合的嵌套深度,对这个感兴趣的朋友可以参看以前我一次分享中关于闪电贷的例子。考虑到有的读者对闪电贷背景不清楚,这里就不详述了。
  2. 可以明确的将资源的定义和基于资源的行为拆分开来,这里有一个典型的例子是灵魂绑定的 NFT。

灵魂绑定的 NFT 这个概念是 Vitalik 提出的,想用 NFT 来表达一种身份关系,而这种关系不应该是可以转让的,比如毕业证,荣誉证书等。

而 ETH 上的 NFT 标准,都是一个接口,比如 ERC721 的几个方法:

function ownerOf(uint256 _tokenId) external view returns (address);
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;

如果想扩展新的行为,比如绑定,就需要定义新的接口。还会影响旧的方法,比如转让 NFT 的时候,如果 NFT 已经灵魂绑定了,就无法转让,势必带来兼容性问题。更难的是开始允许转让流通,但绑定后就无法流通的场景,比如部分游戏道具。

但如果我们把 NFT 设想成一个物品,这个物品本身只决定了它如何展示,有哪些属性,至于能否转让,这个应该是上层的封装。

比如下面是用 Move 定义的 NFT,它是一种类型。

struct NFT<NFTMeta: copy + store + drop, NFTBody: store> has store {
creator: address,
id: u64,
base_meta: Metadata,
type_meta: NFTMeta,
body: NFTBody,
}

然后我们可以把上层封装设想成不同容器,不同的容器有不同的行为。比如 NFT 放在个人展览馆里的时候,是可以拿出来的,但一旦放到一些特殊容器中,想要拿出来则需要有其他规则限制,这就实现了“绑定”。

比如 Starcoin 的 NFT 标准实现了一种灵魂绑定 NFT 的容器叫做 IdentifierNFT

/// IdentifierNFT 中包含了一个 Option 的 NFT,默认是空的,相当于一个可以容纳 NFT 的箱子
struct IdentifierNFT<NFTMeta: copy + store + drop, NFTBody: store> has key {
nft: Option<NFT<NFTMeta, NFTBody>>,
}

/// 用户通过 accept 方法初始化一个空的 IdentifierNFT 在自己的账号下
public fun accept<NFTMeta: copy + store + drop, NFTBody: store>(sender: &signer);

/// 开发者通过 MintCapability 给 receiver 授予该 nft,将 nft 嵌入到 IdentifierNFT 中
public fun grant_to<NFTMeta: copy + store + drop, NFTBody: store>(_cap: &mut MintCapability<NFTMeta>, receiver: address, nft: NFT<NFTMeta, NFTBody>);

/// 开发者也可以通过 BurnCapability 将 `owner` IdentifierNFT 中的 NFT 取出来
public fun revoke<NFTMeta: copy + store + drop, NFTBody: store>(_cap: &mut BurnCapability<NFTMeta>, owner: address): NFT<NFTMeta, NFTBody>;

这个箱子里的 NFT,只有 NFT 的发行方可以授予或者收回,用户自己只能决定是否接受,比如毕业证书,学校可以颁发和收回。当然开发者也可以实现其他规则的容器,但 NFT 标准是统一的。对这个具体实现感兴趣的朋友,可以参看文末链接。

这段阐述了 Move 基于线性类型带来的一种新的组合方式。当然,只有语言的特性优势并不能自然带来编程语言的生态,还必须有应用场景。我们继续来讨论 Move 语言的应用场景扩展。

智能合约的应用场景扩展

Move 最初作为 Libra 链的智能合约编程语言,设计之初就考虑到了不同的应用场景。当时 Starcoin 正好在设计中,考虑到它的特性正好符合 Starcoin 追求的目标,就将其应用在公链场景里。再后来 Libra 项目搁浅,又孵化出几个公链项目,在几个不同的方向上探索:

  • MystenLabs 的 Sui 引入了不可变状态,试图在 Move 中实现类似 UTXO 的编程模型。
  • Aptos 在探索 Layer1 上的交易的并行执行,以及高性能。
  • Pontem 试图将 Move 带入 Polkadot 生态。
  • Starcoin 在探索 Layer2 乃至 Layer3 的分层扩容方案。

同时 Meta(Facebook)的原 Move 团队在尝试将 Move 运行在 Evm 之上,虽然会损失合约之间的传递资源的特性,但有助于 Move 生态的扩展以及 Move 生态和 Solidity 生态的融合。

当前 Move 项目已经独立出来,作为一个完全社区化的编程语言。现在面临几个挑战:

  1. 如何在不同的链的需求之间寻找最大公约数?保证语言的通用性。
  2. 如何让不同的链实现自己的特殊语言扩展?
  3. 如何在多个链之间共享基础库和应用生态?

这几个挑战同时也是机遇,它们之间有冲突,需要有取舍,需要在发展中寻找平衡,还没有一种语言做过这种尝试。这种平衡可以保证 Move 有可能探索更多的应用场景,而不仅仅是和区块链绑定。

这点上,Solidity 通过指令和链交互带来的一个问题是 Solidity&EVM 生态完全和链绑定了,运行就需要模拟一个链的环境。这限制了 Solidity 拓展到其他场景。

关于智能合约编程语言的未来,有许多不同的看法,大体上有四种:

  • 不需要图灵完备的智能合约语言,Bitcoin 的那种 script 就够用了。没有图灵完备的智能合约,就很难实现通用的仲裁能力,会局限住链的应用场景。这点可以看我以前的一篇文章《开启比特币智能合约的「三把锁」》。
  • 不需要专门的智能合约语言,用已有的编程语言就够了,这个观点我们上面已经分析了。
  • 需要一种图灵完备的智能合约语言,但应用场景也仅仅在链上,类似于数据库中的存储过程脚本。这是大多数当前智能合约开发者的观点。
  • 智能合约编程语言会推广到其他场景,最终变为一种通用的编程语言。

最后一种可以称做智能合约语言最大化主义者,我个人持这种观点。理由也很简单,在 Web3 世界里,无论是游戏还是其他应用,如果遇到争议,需要有一种数字化的争议仲裁方案。而区块链和智能合约关键的技术点就是关于状态和计算的证明,当前这个领域摸索出来的仲裁机制,完全可以使用到更通用的场景中去。当用户安装一个应用,担心应用不安全,希望应用能提供状态和计算证明的时候,也就是应用开发必须要选择用智能合约实现应用核心逻辑的时候。

总结

这篇从链上智能合约的实现途径上,以及当前智能合约在依赖和组合性上遇到的难题,用尽可能通俗的语言阐述了 Move 在这个方向上做的尝试,以及基于这些尝试带来的生态构建的可能性。

考虑到文章也比较长了,很多方面还没表述到,我会基于这个题目写一个系列,探讨 Move 在安全方面以及应用构建等方向的更多优势。

后记:写这篇文章的时候 Rooch 项目尚未创建,但关于分层以及 DApp 构建的设想已经在脑海里酝酿许久。Rooch 是对如何用 Move 构建 DeFi 之外应用的一个回答,详细请参看文章《Rollup Layer2 的模块化演进之路》。

相关链接

  1. https://github.com/move-language/move Move 项目的新仓库
  2. awesome-move: Code and content from the Move community 一个 Move 相关项目的资源集合,包括公链以及 Move 实现的库
  3. Soulbound (vitalik.ca) Vitalik 关于 NFT 灵魂绑定的文章
  4. SIP22 NFT Starcoin 的 NFT 标准,包括 IdentifierNFT 的说明
  5. 开启比特币智能合约的「三把锁」(jolestar.com)

· 阅读需 31 分钟

本文尝试从演化角度讨论 Rollup Layer2 的发展以及演进,主要解答以下几个问题:

  1. Rollup 是如何工作的
  2. Rollup 的模块化演进
  3. 模块化带来的可能性
  4. 模块化应用的技术趋势
  5. 总结

Rollup 是如何工作的

区块链的“三难问题”一直是困扰业界的一个难题,如果我们认为 Layer1 区块链应该首先保证“去中心化”和“安全”,那将“扩展性”方案从 Layer1 迁移出来就是自然的选择了,于是有了 Layer2。那新的难题就是如何通过 Layer1 来保证 Layer2 的安全。

最初有一种想法是定时将 Layer2 应用的状态树根写到 Layer1,这样可以通过状态证明来校验应用的状态,类似于交易所储备金证明。但这种方式第三方无法通过公开的方式验证两次状态转换是正确的。

为了更深入的探讨这个问题,我们抽象一下,任何程序的状态都可以通过一个状态转换公式表达:

σt+1 ≡ Υ(σt, T)

这个公式来自于 Ethereum 黄皮书,但它可以代表任意的程序。在这里 Υ 代表程序,σ 代表状态。状态 σt+1 由程序 Y 通过状态 σt 和交易 T 计算得出。交易 T 代表程序的输入。任意时候,如果 σt 是确定的,程序 Y 是确定的,T 是确定的,那 σt+1 就是确定的。

所以要提供公开的可验证性,关键是 Y 要公开可用,历史上所有的 T 要公开可用并且顺序确定,中间的状态可通过 Y 和 T 重新计算得到。而程序的公开可用我们可以通过开源来实现,关键是 T 公开可用如何保证,这就引入了数据可用性(DA)的概念。

数据可用性需要有个公开的不可篡改的账本来记录应用的交易。自然想到,区块链账本就是这样一个系统,于是将 Layer2 的交易写回 Layer1,保证数据可用性,这也就是 Rollup 名称的来源。

所以 Layer2 系统中需要有个角色收集用户的交易,进行排序并写入到 DA,这个角色叫 定序器(Sequencer)。这里的交易序列叫 Canonical Transaction Chain

保证了数据的可用性,每个人都可以通过自己运行程序执行交易来得到最终的状态。但这里并没有达成共识,因为每个人不确定自己得到的结果是否和其他人的结果一致,毕竟软件或者硬件故障也可能导致数据不一致。所以需要另外一个角色将交易执行后的状态树根定时公布出来,供大家校验自己的状态,这个角色叫 提案者(Proposer)。这里每次提交的状态也构成了一个状态序列,和交易序列对应,叫 State Commitment Chain

到这里,我们达到了应用的可验证性。如果某个人运行的结果和 Proposer 提交的状态不一致,并确定不是自己的问题,那就是 Proposer 作弊或者出错了,那怎么让别人也知道呢?这就需要引入仲裁者(Arbitrator)的角色。仲裁者需要是一个可信第三方,链上合约正好可以承担这个角色。

仲裁有两个方案:

  1. Proposer 每次提交状态的时候,同时提供与前一次状态之间的状态转换有效证明(Validity Proof),链上的仲裁合约进行校验。有效证明一般通过 Zero knowledge 技术生成,这种叫 ZK Rollup。
  2. 先假定 Proposer 的结果是对的,但如果发现不一致,则提交欺诈证明(Fraud Proof),由仲裁合约进行判定。如果仲裁合约判定 Proposer 作弊,则对 Proposer 进行惩罚,并将 State Commitment Chain 回滚到欺诈交易之前的状态。当然,为了保证安全,一般会设置一个比较长的挑战周期来达到链上交易结算的最终确定性。这种叫 Optimistic Rollup。

我们还需要实现 Layer1 和 Layer2 之间的资产互通。于是构建一个 Layer1 到 Layer2 之间的桥,通过状态证明来进行资产结算。而 Layer2 在 Layer1 的状态根由 Layer1 的仲裁合约保证,我们可以认为这个桥的安全也受仲裁合约保证。

至此,我们得到了一个由 Layer1 保证安全,并且可以和 Layer1 进行资产互通的 Rollup Layer2 方案。

Rollup layer2

当然,Rollup 方案也做了一些妥协:

  1. 将交易写入 Layer1,也就代表 Layer2 的扩展性依然受 Layer1 区块大小限制。以 Ethereum 为例,某个 Layer2 完全占据 Ethereum 的所有区块,能提供的平均 TPS 也才数百,扩展性受 DA 限制。
  2. 为了节省 Gas 费,Sequencer 会将交易批量写入 DA,而在写入 DA 之前,Sequencer 有可能通过调整交易的顺序来作弊。

这里总结一下 Layer2 的安全以及交易的最终确定性:

  1. 如果用户自己运行了一个 Layer2 的节点,并且忠实地按照 DA 的交易顺序执行,用户可以认为交易是即时确认并且达到最终确定的,因为如果用户执行的结果和 Proposer 不一样,说明 Proposer 作弊,需要回滚链上的状态,最终会和用户自己的节点执行的结果一样。 这里主要的风险点在于前面提到的,如果实时从 Sequencer 同步数据, Sequencer 调整尚未写入 DA 的交易的顺序带来的风险。
  2. 如果用户自己无法运行节点,需要依赖一个 RPC 提供方,用户需要承担一定的信任风险。但这个风险和用户信任 Layer1 的 RPC 节点带来的风险类似。这里额外的风险依然是 Sequencer 丢弃交易或者重排交易带来的风险。
  3. 如果 Proposer 出错,但没有节点发起挑战,超过了挑战期,这时候错误的状态无法回滚,只能通过社会共识硬分叉方式来修复状态。

Rollup 的模块化演进

根据前面的分析,Rollup 解决方案中,链上的多个合约承担不同的职能,代表不同的模块。那自然想到,能否将模块拆分到多个链,从而获得更高的扩展性。这就是模块化区块链以及模块化 Rollup 的思路。

模块化在这里有两层含义:

  1. 通过模块化设计,让系统变为一个可拔插的系统。开发者可以通过模块的组装,满足不同的应用场景需求。
  2. 基于 1 提供的能力,模块层的实现并不绑定在同一个 Layer1 上,从而得到更好的扩展性。

我们可以认为有三个主要的模块层:

  • 数据可用层(Data Availability): 保证执行层的交易数据可以通过公开的方式获取,以及保证交易的序列。
  • 结算层(Settlement):实现 Layer1 和 Layer2 之间的资产和状态结算。它包含 State Commitment Chain 和 Bridge。
  • 仲裁层(Arbitration):校验欺诈证明,并做出裁决(Optimistic)或者校验有效证明(ZK)。仲裁层要有能力操控 State Commitment Chain。

DA 模块化

将 DA 职能迁移出来,用一个独立的解决方案,获得的首要好处是 Layer2 的交易 Gas 费至少降低一个数量级。

从安全方面来看,即便是 DA 链的去中心化弱于 Ethereum,但 DA 层对安全的保证主要是挑战期内的交易,过了挑战期后,DA 主要是为了方便其他节点同步数据,对安全并没有保障作用,所以去中心化的要求可以降低一个层次。

DA 专用链可以提供更高的存储带宽和更低的存储成本,并且针对多个应用共享 DA 进行专门的设计。这也是当前如 Celestia、Polygon Avail 这样的 DA 链的立足点。

将 DA 层拆分出去后,我们得到了下图的架构:

Modular Rollup layer2

上图中由 DA 来承担保存 Canonical Transaction Chain 的职责,而给 Layer1 留了一个 L1ToL2 Transaction Queue 来实现 Layer1 和 Layer2 之间的消息通信,用户也可以直接写交易给这个 Queue,确保 Layer2 的 Permissionless,Sequencer 无法审核用户或者交易。

但这里会引入一个新的难题,如果 Sequencer 写入 DA 的交易序列和 Proposer 执行的交易序列不一致,仲裁合约如何判定?一种方案是 DA 链和仲裁链之间有一个跨链桥,实现在仲裁合约中校验 DA 链提供的数据证明。但这种方案依赖 DA 和其他链之间的跨链桥的实现,DA 的方案选型会受限制。另外一种方案是引入排序证明。

排序证明(Sequence Proof)

我们可以认为 Sequencer 实际上也属于 DA 方案的一部分,它相当于一个 App-Specific 的 DA,主要基于以下理由:

  1. Sequencer 需要提供批量写入 DA 链之前这段时间内的 DA 保证。
  2. Sequencer 需要负责交易的验证,排序,以及最终写入 DA。

如果要求 Sequencer 给每个交易生成一个 Sequence Proof,则可以解决两个问题:

  1. 对尚未写入 DA 链的交易提供了保证,使 Sequencer 不敢随意调整交易的顺序或者丢弃交易。
  2. 如果 DA 链和仲裁链之间没有跨链桥,则可以通过 Sequence Proof 的挑战机制来保证数据可用。

Sequence Proof 具有以下特性:

  1. 它携带 Sequencer 的签名,证明它是某个 Sequencer 发出的。
  2. 它可以证明某个交易在全部交易序列中的位置。
  3. 它是累加器(Accumulator)证明的一种。每个交易累加后会生成新的累加结果,与该交易之前所有历史交易相关,使得其难以篡改。累加器的可选方案之一是默克尔累加器(Merkle Accumulator),累加结果表现为默克尔树的根。

Sequence Proof 的工作原理:

Sequence Proof

用户或者执行节点提交交易给 Sequencer,Sequencer 将 Sequence Proof 返回给用户,同时同步给其他节点。如果 Sequencer 在提交给 DA 之前丢弃或者篡改了交易的顺序,用户或者其他节点可以提交 Sequence Proof 给仲裁合约,从而惩罚 Sequencer。仲裁合约需要从 State Commitment Chain 合约中读取交易累加器的根,从而校验 Sequence Proof。

分场景探讨一下:

  1. Sequencer 丢弃或者重排了用户交易。这会导致 Sequencer 在同一个位置生成了两个 Sequence Proof。用户提交 Sequence Proof 给仲裁合约,Sequencer 需要提供该交易被包含在最新的交易累加器的根中的证明,如果不能给出,则惩罚 Sequencer。
  2. Sequencer 没有正确地将交易写入 DA 链,和 Proposer 合谋隐藏交易。如果仲裁链和 DA 链有桥,则通过桥来验证,惩罚 Sequencer。否则用户可以发起挑战,要求 Sequencer 给出某个位置的交易的证明以及原始信息。但这种情况仲裁合约无法判断用户是否是恶意挑战,所以如果 Sequencer 给出数据则不惩罚 Sequencer。而对用户来说,恶意挑战损人损己,也缺少经济动力。

我们通过引入 Sequence Proof 让 Layer2 的协议变得更安全。

交易流水线(Transaction Pipeline)以及并行执行(Parallel Execution)

将 Sequencer 划分给 DA,只负责交易的验证和排序,带来的另外一个好处是容易实现交易的流水线以及并行执行。

Transaction Pipeline

验证交易时,需要验证签名和是否有足够的 Gas 费,而 Gas 费的校验需要依赖状态。如果我们为了保证验证交易不会被执行交易阻塞,允许 Sequencer 验证交易依赖的状态和最新状态之间有一定的延迟(秒级),会导致 Gas 校验会不太准确,有被 DDoS 攻击的风险。

但我们认为 Sequencer 属于 DA 是一个正确的方向,所以值得我们进一步研究。比如可以将交易费中 DA 部分拆分出来,通过 UTXO(Sui Move Object) 表达,则可以降低 Gas 费检测成本。

Sequencer 给交易排序然后输出成交易流水线,然后同步给 Proposer 以及其他节点。每个节点可以根据自己的服务器情况来选择并行方案。每个节点需要保证:只并行没有因果关系的交易,有因果关系的交易必须按 Sequencer 的顺序执行,那最终的结果就是一致的。

Proposer 需要定时提交状态树的根,以及累加器的根到链上的 State Commitment Chain 合约中。

于是我们得到了一个低 Gas 费,高 TPS,并且更安全的模块化 Layer2: Rooch

Rooch Architecture

  • MoveOS:它包含 MoveVM 以及 StateDB,是系统的执行以及状态存储引擎。StateDB 由两层稀疏默克尔树构建,可以提供状态证明。根据前面的分析可得出,状态树以及状态证明是 Rollup 应用不可或缺的组件。
  • RPC:对外提供查询,提交交易,以及订阅服务。可以通过代理方式兼容其他链的 RPC 接口。
  • Sequencer:验证交易,给交易排序,提供 Sequence Proof,将交易流式输出到 Transaction Pipeline。
  • Proposer:从 Transaction Pipeline 获取交易,批量执行,定期提交到链上的 State Commitment Chain。
  • Challenger:从 Transaction Pipeline 获取交易,批量执行,和 State Commitment Chain 比较,决定是否发起挑战。
  • DA & Settlement & Arbitration Interface:对不同的模块层的抽象和封装,保证在不同的实现之间切换时不影响上层业务逻辑。

支持多链的交互式欺诈证明

Optimistic Rollup 方案中,链上的仲裁合约如何判定链下的交易执行出错,一直是一个难题。最初的想法是 Layer1 上重新执行一遍 Layer2 的交易,但这种方案的难题是 Layer1 的合约要模拟 Layer2 的交易执行,成本很高,也会限制 Layer2 交易的复杂度。

最后业界摸索出一种交互式证明的方案。因为任何复杂的交易,最终会转换成机器指令执行,如果我们找到产生分歧的指令,则只需要在链上模拟执行指令即可。

还用上面那个状态转换公式:

σt+1 ≡ Υ(σt, T)

这里 Υ 代表指令,T 代表指令输入,σ 代表指令所依赖的内存状态。如果在执行过程中,给每个 σ 都生成一个状态证明。 控辩双方可以通过交互,发现双方的分歧点 m,将 m-1 的状态 σ 以及指令 m 提交到链上仲裁合约模拟执行,仲裁合约执行后就可以给出判定。

所以剩下的问题就是通过什么方式来生成证明,主要有两个方案:

  1. 直接在合约语言虚拟机中实现,比如 Arbitrum 的 AVM,Fuel 的 FuelVM。
  2. 基于已有的指令集实现一个模拟器,在模拟器中提供证明能力。如 Optimism 的基于 MIPS 指令的 cannon,Arbitrum 新的基于 WASM 指令的 Nitro,以及 Rooch 的基于 MIPS 指令的 OMO。

OMO

OMO 是一个拥有单步状态证明能力的通用字节码模拟器,为多链执行环境设计。有了 OMO 的支持,可以实现仲裁层的模块化。任意支持图灵完备合约的链,都可以在合约中模拟 OMO 的指令,作为仲裁层。

ZK + Optimistic 组合方案

业界一直在争论 Optimistic Rollup 和 ZK Rollup 孰优孰劣,但我们认为将二者结合起来可以兼得两种方案的优点。

ZK + Optimistic

在前面的 Optimistic 方案基础上,我们再引入一个新的角色,ZK Prover。它批量给 Proposer 提交的交易状态生成有效证明,并提交给仲裁合约。仲裁合约验证后,就可以判定该交易在 Layer1 上达到了最终确定性,可以进行 Layer2 到 Layer1 的提款交易的结算。

这种方案的优点:

  1. 不会因为 ZK 的性能问题限制 Layer2 的整体吞吐。
  2. 可以通过 ZK 缩短 Optimistic 的挑战周期,提升用户体验。

在 ZK 的方案以及硬件加速成熟之前,我们可以先通过 Optimistic 构建生态,同时模块化方案可以让 ZK 最后无缝接入进来。

多链结算

如果我们进一步思考模块化的趋势,自然想到,既然 DA 可以迁移到别的链,那结算层是否也可以部署到别的链?

Layer1 和 Layer2 之间的资产结算主要依赖两个组件,一个是 Bridge,一个是 State Commitment Chain,从 Bridge 结算的时候,需要依赖 State Commitment Chain 校验 Layer2 的状态证明。 Bridge 当然可以部署到多个链,但 State Commitment Chain 只能有一个权威的版本,由仲裁合约保证安全。

Multi chain Settlement

这个方向还需要深入研究,但有个初步的方案。其他链上的 State Commitment Chain 都是仲裁链(Ethereum)上的镜像。这个镜像并不需要同步全部的 Layer2 State Root 到其他链,而是用户按需通过 Ethereum 的状态证明做映射。

当然,其他链上还需要能校验 Ethereum 上的状态证明,所以需要知道 Ethereum 上的状态根。当前,将 Ethereum 上的状态根同步到其他节点有两个方案:1. 依赖 Oracle。2. 嵌入 Ethereum 轻节点,校验 Ethereum 的区块头。

Multi chain Settlement

这样我们就可以得到一个支持多链结算,但安全由 Ethereum 保证的 Layer2 方案。

这种方案和跨链的区别:

  1. 如果是依赖中继链的跨链方案,可以认为 Layer2 替代了中继链,是一个安全受仲裁合约保证的中继层。
  2. 如果是链间互相校验状态证明的跨链方案,多链结算方案和它共享状态根同步的技术方案,但简化了许多。因为在多链结算方案中,状态根的同步需求是单向的,只需要从仲裁链同步到其他链,不是两两互相同步。

模块化带来的可能性

通过模块化,开发者可以通过 Rooch 组合出不同的应用。

  1. Rooch Ethereum Layer2 = Rooch + Ethereum(Settlement+Arbitration) + DA
    这是 Rooch 首先要运行的网络。提供一个由 Ethereum 安全保证的,可以和 Ethereum 上的资产互通的 Move 运行平台。未来可以扩展到多链结算。
  2. Rooch Layer3 Rollup DApp = Rooch + DApp Move Contract + Rooch Ethereum Layer2(Settlement + Arbitration) + DA 如果应用把自己的结算和仲裁部署到 Rooch Layer2,它就是一个 Rooch 的 Layer3 应用。
  3. XChain Rollup DApp = Rooch + DApp Move Contract + XChain(Settlement + Arbitration) + DA 任意链都可以通过 Rooch 来给开发者提供一套基于 Move 语言的 Rollup DApp 工具包。开发者只需要通过 Move 语言编写自己的应用逻辑,就可以运行一个安全受 XChain 保障的,资产可以和 XChain 互通的,独立环境的 Rollup 应用。当然这个需要和各公链的开发者来协同开发。
  4. Sovereign Rollup DApp = Rooch + DApp Move Contract + DA 应用也可以将 Rooch 作为 Sovereign Rollup SDK,不部署 Bridge 以及 Arbitration 合约,State Commitment Chain 也保存在 DA,保证可验证性,由社会共识保证安全。
  5. Arweave SCP DApp = Rooch + DApp Move Contract + DA(Arweave) SCP 和 Sovereign Rollup 思路类似,SCP 要求应用程序的代码也要保存到 DA。而 Rooch 中合约部署和升级都是交易,合约代码在交易中,都会写到 DA 层,所以我们认为符合 SCP 的标准。
  6. Move DApp Chain = Cosmos SDK + MoveOS + DApp Move Contract MoveOS 可以作为一个独立的 Move 运行环境嵌入到任意的链的运行环境中,去构建应用链或者新的公链。
  7. 非区块链项目 非区块链项目,可以把 MoveOS 作为一个可以带有数据校验能力以及存储证明能力的数据库使用。比如用它做一个本地的博客系统,数据结构和业务逻辑通过 Move 表达。等未来基础设施成熟,则可以直接和区块链生态对接起来。再比如可以用它做云计算中的 FaaS 服务,开发者通过 Move 编写 FaaS 中的 Function,平台托管状态,用户间的 Function 还可以互相组合调用。更多的可能性需要大家探索。

Rooch 的模块化方案可以适应于不同类型以及阶段的应用。比如开发者可以先通过部署合约在 Rooch Ethereum Layer2 上验证自己的想法,等成长起来后,将应用迁移到独立的基于 Rooch 搭建的 App-Specific Rollup 中。

再或者开发者直接通过 Sovereign Rollup 方式启动应用,因为应用早期对安全性要求不高,也没有和其他链互通资产的需求,先做到可验证。等应用成长起来,有了互通资产的需求,对安全性要求变高,这时候可以启用结算以及仲裁模块从而保证资产的安全。

模块化应用的技术趋势

DA 层潜力尚待挖掘

由前面的分析可以看出,无论哪种组合方式,都依赖 DA。DA 在去中心化应用中扮演的角色类似于 Web2 系统的日志平台,可以用来做审计,支持大数据分析,进行 AI 训练等。未来会有很多应用和服务围绕 DA 建立起来。当前已有 Celestia,Polygoin avail,未来还会有 EigenLayer,Ethereum danksharding 等。

根据前面的分析,我们得出 Sequencer 的角色应该属于 DA 的一部分,如果 DA 层能为应用提供交易校验能力,并且有足够的性能,实际上完全可以由 DA 来承担 Sequencer 的职责,用户直接写交易到 DA。当然能否使用应用的 Token 付 DA 的 Gas 费是另外一个需要解决的问题。

DApp 编程语言会爆发

新的应用形态会促使新的编程语言爆发,这在 Web2 时代已经验证。而 Move 会成为构建 Web3 DApp 的最佳语言。除了 Move 本身的语言特性外,还基于以下理由:

  1. DApp 用同一种语言可以快速积累应用所需要的基础库,形成生态聚集效应。所以一开始支持多语言不是个好策略。
  2. 去中心化应用至少要保证可验证性,而智能合约语言可以让开发者在保证可验证性方面减少许多心智负担。
  3. Move 的平台无关性,可以让它很容易适配到不同的平台,不同的应用中。
  4. Move 的状态是结构化的,有利于 DApp 的数据结构表达以及存储检索。

总结

我在 17 年底进入区块链领域,当时业界有非常多的团队尝试在区块链领域构建应用。可惜当时基础设施尚不完备,业界尚未摸索出一个可复制的构建应用的模式,大多数应用类项目以失败告终,打击了开发者和投资者。区块链上的应用应该如何构建出来?这个问题一直让我思考了五年。

而现在,随着 Layer1,Layer2 以及智能合约,模块化基础设施的成熟,这个问题的答案也逐渐清晰起来。

希望在即将到来的 Web3 DApp 爆发潮中, Rooch 可以助开发者一臂之力,让应用更快的构建,真正的落地。

· 阅读需 2 分钟

logo配色图 Rooch Network is delighted to announce its partnership with zkMove! Rooch will work closely with zkMove to bring its zk-rollup solution to Rooch’s fully interoperable, multi-chain ecosystem. Moreover we will explore new dApp usages and build the Move community together.

Zero-knowledge rollups or zk-rollups are a next-gen Layer2 scaling solution that enable blockchains to validate transactions faster and maintain low gas fees compared to traditional Layer 1s via a combination of on and off-chain processes.

zkMove is a zk-proof friendly Move language runtime environment. The initial idea of zkMove is to improve the programmability and composability of zk-proofs technology.

Some highlights of zkMove:

  1. A type safe zero-knowledge proof-friendly bytecode virtual machine
  2. No compromise on performance while pursuing Turing completeness
  3. Safe and efficient scaling and privacy engine

For those readers interested in a deep dive into zkMove, there is a wealth of high quality information available at the zkMove medium (https://zkmove.medium.com/). The project is also hiring qualified engineers (https://www.zkmove.net)!

Rooch Network is committed to its partnership with zkMove, and together we will work to deliver the holy grail of blockchain on Rooch~ a fully interoperable, multi-chain ecosystem supported in part by zkMove’s layered solution.

· 阅读需 1 分钟

logo-4 Rooch Network will partner with MoveBit to ensure the highest possible level of security independently verified by an expert third party. Founded by experts and professors in security, MoveBit is a blockchain security company focused on Move ecosystem security. MoveBit will soon be a household name in the security audit sector of the blockchain industry.

“MoveBit is a security audit company for the Move ecosystem with a vision to make the Move ecosystem the most secure Web3 destination. The MoveBit team is comprised of security leaders from academia and enterprise with 10 years of security experience. The team was one of the earliest contributors to the Move ecosystem, working with Move developers to set the standard for secure Move applications.”

Some of MoveBit’s recent audits include Aptos, Starcoin, Starcoin DAO, PolyNetwork, Starswap, Transit Finance, OmniBTC, MoveDID, and Cetus.

Rooch will secure independent formal verification through MoveBit audits during key stages of project development to ensure the utmost security and to create an atmosphere of trust for ecosystem participants. Security audits will be published in conjunction with MoveBit.

· 阅读需 1 分钟

movefuns Rooch Network has an established partnership with MoveFunsDAO, "A DAO for Move developers, with the main goal of uniting the developer community to build across multiple Move chain ecosystems." At the date of this posting, MoveFunsDAO has gathered more than 250 Move developers for the purpose of collective action and learning within the broader Move ecosystem, including Aptos, Starcoin, and Sui.

Most notably, MoveFuns has already organized a CTF MOVEment in December 2022 alongside organizers Aptos, Pontem Network, and Movebit, and we expect it to foster many great opportunities for developers rushing to Move.

MoveFunsDao & Rooch will keep a close relationship with the goal of empowering developers so the greater Move ecosystem can flourish while we grow an ever larger developer community.

· 阅读需 7 分钟

while

很久很久以前,在一个遥远的银河系中,等等——2009年1月3日,比特币在主网上线了其创世块的开采,区块链诞生了。直到 2015 年,以太坊 1.0 才崭露头角,带来了改变智能合约的格局。自此区块链行业快速迭代。今天,Layer1 的万神殿已经脱颖而出,提供了一套复杂的功能和应用场景,这些功能和应用场景已经开始颠覆我们所知的传统金融。

区块链需要迭代,以寻求加密技术的最佳表达。圣杯是去中心化的原生多链结算,它在追求吞吐量、安全性或中心化方面毫不牺牲。如果我告诉你 Rooch Network 可以实现这个最美好的愿望呢?

Rooch 是最早专注于分层解决方案和 Move 生态系统的基础架构团队之一。2018年团队专注于比特币闪电网络的 Layer2 解决方案,2019年在 Libra 上构建第一个基于 Move 的状态通道后,我们团队构建了第一个 Move 公链:Starcoin,然后到2022年创建了 Starcoin Framework,DeFi 应用场景、链桥、MoveJS、MovefunsDAO 和 DAOspace。2022年,Rooch 团队设计了 OMO,这是一种具有每步状态证明的通用字节码模拟器,可用于为 optimistic rollup 生成欺诈证明。OMO 将通过 zkMove 部署在 Rooch 上,zkMove 是一个与我们建立了合作伙伴关系的 ZK-rollup 项目。 Rooch 的架构通过其 ZK Prover 结合了 Optimistic 和 ZK,实现了这两种解决方案的优势。

像 Rooch 这样的项目还不存在是有原因的……只有 Rooch 的团队拥有将如此规模的项目推向市场的技术能力和经验。

Rooch 核心团队因强调权力下放而变得强大,其核心创始成员分散在世界各地。 Jolestar 是我们的 Move Master Jedi,Starcoin 的架构师,一位致力于崇高理想的天才创始人。 Triplex 是一位 Einstein Quant 开发人员,在分布式存储方面拥有多年经验,并且拥有与此相关的大脑。Chirstina Li 在 Rooch 担任过许多职务,在将自己的技能应用于 Helium 的 web3 之前,她在金融科技领域拥有丰富的投资经验(图,klarna)。Rooch 的核心成员 Joe Chen 翻译了 Move 的书籍 —— MoveBook。Haichao 是我们团队的粘合剂,是来自 Algorand & Aptos 的成功 DevRel。 Ren 是 Rooch 的营销主管,拥有多家企业的企业家和出版作家,以优异成绩毕业于 LMU,获得工商管理学士学位。 Lerencao 是 Starcoin 的核心开发者,是 Rooch OMO 的架构师,拥有多年的区块链经验。Sven 是我们的常驻 Web2 专家,制作了 Web2 游戏,并且是 DAOspace 的开发者。我们有 MoveJS 的架构师 Owen WU,一位身经百战的 Move 开发人员和全栈开发人员,以及 0xpause,一位前 AI 工程师,他在 Starcoin 帮助构建了 Starcoin 框架和 DAOspace。 WillQ 是编译器、EVM 和 Rust 方面的专家。Lshoo 是一名高级开发人员和架构师,拥有超过 10 年的 Web2 开发经验,在 Scala、Rust、WebAssembly 和 Move 方面的深厚能力以及在 Cosmos 和 Substrate 的工作经验为后盾。Roy Lieu 是 VM 方面的专家,具有多年的 VM 开发经验。

Rooch 是一个独特的团队,可以利用其应用技术经验创造区块链技术的奇迹:Rooch Network:一个模块化的 Layer2,具有由 Move 语言提供支持并由以太坊保护的多链结算。几乎所有的 Web2 App 都可以通过 Rooch 模块化框架重构为 Web3 DApp。

Rooch 将实施一个通用且可验证的合同执行环境。整体思路受到 Cannon 的启发,部分实现借鉴了 Qiling 框架。该网络拥有 100,000 TPS 的吞吐量。

在其第 2 层,Rooch 支持去中心化 ID,这是一种即插即用的 DAO 框架,支持完全链上投票和治理,由于 Move、DEX、DeFi 协议和市场,钱包具有更高的安全性。对于建立在 Rooch 上的项目需要大规模发行 NFT 的情况,例如 NFT 铸币数千万或数亿发行量,Rooch 将让从收集计划到铸币到未来交易的整个过程完全上链,并且始终可追踪。因此,如果 Instagram 希望每天将其所有图片制作成 NFT,Rooch 可以做到。此外,对于 Rooch 上 GameFi 项目中的 NFT 道具,我们将能够使道具升级或升级为更强大的物品,同时确保整个过程和物品功能在链上保持一致。

Rooch 的 Layer3 以其即时交易确认和分布式 P2P 网络开辟了一个新领域。Web2 的面包和黄油,小额支付,为区块链起死回生。任何应用程序都可以利用支持 Rooch 的 P2P 网络来实现微交易,他们所要做的就是按字节支付网络费用,不需要存储证明。Rooch 的模块化 DApp 框架允许项目在规划阶段扩大其目标市场,而移动语言及其模块缩小开发窗口以加快上市时间。

Rooch 是缺失的一环,是实现去中心化、快速和安全、多链世界的“古老”承诺的金鹅。

Rooch banner