veryyoung's blog

Optimistic Rollup 原理

· veryyoung

前言§

21 年的时候有幸帮一家基于 Optimistic Rollup 的 layer2 团队做过一段时间的事情,时间久了都快忘记了。最近工作不太忙,抽空梳理下。

简介§

Layer2 Rollup 是用来做以太坊吞吐量扩容的典型方案,使用 Rollup 可以让交易发生在二层,同时使用以太坊一层来验证二层执行的安全性。

Optimistic Rollup 顾名思义,就是乐观的认为交易是有效的,除非有人提出欺诈证明。

二层上的用户将交易提交给排序者 Sequencer,Sequencer 在二层区块链上执行交易,并定时将交易的 Merkle tree 和状态根提交给一层。

Sequencer 的节点需要质押代币来执行,交易提交后会有一个时间窗口(一般是七天),在时间窗口内任何人都可以提交欺诈证明。欺诈证明一旦成立会扣除对应 Sequencer 的奖励,同时给与提交欺诈证明的人奖励。

代码结构§

代码分为如下五层:

l2geth:§

l2geth 是 go-ethereum 的 fork,同时里面增加了 rollup 包,实现了 layer2 上的两种角色:Sequencer 和 Verifier。

Sequencer: 监听 layer1 的跨域消息,并且将交易改为 OVMMessage 到 OVM 中运行。

Verifier: 验证 layer2 上的 Sequencer 提交的交易的正确性。

contracts:§

包含 layer1 和 layer2 上的合约。

data-transport-layer:§

通过 RPC 访问 layer1 的 RPC 接口,获取 layer1 上的合约事件,并存储在本地,提供接口供 l2geth 来获取时间。

batch-submitter:§

定时将交易的 Merkle tree 和状态根提交给一层。

message-relayer:§

监听 layer2 上的 SentMessages 事件,在 layer1 上调用 OVM_L1CrossDomainMessenger 合约的 relayMessage 方法,在一层上执行对应的操作,来完成跨域转账。

主要流程§

layer2 上执行交易,通过 batch-submitter 提交到 layer1 合约上,通过事件的方式记录下来。data-transport-layer 从 layer1 上监听事件,存储在本地,提供 RPC 接口给 layer2,layer2 和已经确定的交易进行比较,如果不一样需要提交给 layer1 上的验证者进行验证。

zk-rollup 简单介绍§

顾名思义,通过零知识证明验证来进行 Rollups 环节。 ZK 生成一个简洁的证明来确保批次中的交易有效性,无需逐一检查每笔交易。

因为生成零知识证明的难度过高,目前仅支持简单的转账交易。

OP 优缺点§

优点:

缺点:

参考资料§