# Layer2的理解与思考

By [Renaissance Labs](https://paragraph.com/@renaissance-labs) · 2022-02-11

---

Layer2是个大的话题。是否去中心化，是否安全，资金状态确认时间是Layer2的主要的讨论话题。最近有点时间，总结一下Layer2的理解和思考。

Layer2交互模型
----------

Layer2，相对于Layer1，在Layer1的基础上提供更丰富功能，更好的用户体验。抽象一下Layer2的逻辑以及交互模型如下：

[https://img.jinse.com/5497527\_image3.png](https://img.jinse.com/5497527_image3.png)

除了Layer1的交易外（入金），其他Layer2的交易都在Layer2执行。为了Layer2在必要时恢复交易状态，所有Layer2的交易数据需要安全存储。简单起见，也为了和Layer1保持一样的安全性，所有Layer2的交易数据一般存储在Layer1。这种交易数据的随时可访问，称为"Data Availability"（数据可用性）。所有的Layer2交易都在Layer2执行，并同步到Layer1。如何证明Layer2同步的状态正确，不同的layer2方案有不同的实现方法。

Layer2实现分类
----------

从Layer2状态同步方式，Layer2分为两类：一类是侧链实现（Side Chain），一类是Rollup。侧链，就是通过不同于Layer1的共识进行Layer2状态向Layer1的同步。仅从这一点，整个侧链的安全性，就降低到Layer2的共识的安全性。Rollup又分为两种：一种是zkRollup，一种是Optimistic Rollup。所谓Optimistic Rollup，乐观性Rollup，期望绝大多数情况下Rollup正确向Layer1同步状态。同时，为了防止同步错误的状态，提供了挑战机制。乐观预计挑战的机率比较小。在需要挑战的情况下，Layer1可以判断正确状态。zkRollup是最直接的状态同步方式，通过零知识证明技术，在向Layer1提交状态的同时提供状态变化的证明。Layer实现分类如下：

[https://img.jinse.com/5497477\_image3.png](https://img.jinse.com/5497477_image3.png)

zkRollup，按照采用的零知识证明协议又分为三类：1/ Groth16 2/ PLONK 3/ STARK。Groth16协议需要针对每一个电路进行初始设置(Trusted Setup)。PLONK协议在一定规模下的电路只需要一次初始设置。STARK协议不需要初始设置。但是，相对另外两种算法，STARK协议，证明数据量大，验证时间长。相对来说，在Layer2的场景下，PLONK是目前广泛使用的算法。

STARK协议和SNARK(Groth16/PLONK)协议比较（来源于Matter Labs的github链接）：

[https://img.jinse.com/5497478\_image3.png](https://img.jinse.com/5497478_image3.png)

[https://github.com/matter-labs/awesome-zero-knowledge-proofs](https://github.com/matter-labs/awesome-zero-knowledge-proofs)

总结一下，从安全性角度看，各种Layer2的排序如下：zkRollup，optimistic Rollup，侧链。从提现的时间也印证了安全性，zkRollup的提现是分钟级别，其他两种方案，小时甚至是天级别。zkSync是比较完善的zkRollup开源项目。

zkRollup，虽好，目前存在很大的缺陷：可编程性差。

细看zkRollup
----------

相对其他Rollup方案，zkRollup方案多了zk证明系统。也就是说，在Layer2每个交易除了“执行”外，还需要生成证明，证明执行过程的正确性。熟悉零知识证明技术的小伙伴都知道，零知识证明的安全性在于”电路“的安全性。对于Layer2，每种交易的处理”固化“为电路，电路逻辑完全公开。对应于每种电路，存在唯一的验证秘钥。验证秘钥用在Layer1验证状态证明。通过验证的状态证明，符合固化电路的逻辑。

[https://img.jinse.com/5497479\_image3.png](https://img.jinse.com/5497479_image3.png)

关键就在于Layer2交易的执行和固化电路语义是否一致。公开电路就是一种共识方式，供所有人查阅电路逻辑。简单的说，为了实现zkRollup，需要实现Layer2执行对应的电路。事实上，电路的实现相对复杂，没有高级语言，很多情况下都是手写R1CS。进一步，为了利用zk证明系统，为了优化电路的实现，整个Layer2的状态经常优化为电路友好结构（merkle树）。所以，zkRollup的系统需要考虑电路的结构，从而约束了Layer2交易以及账户模型。细心的小伙伴可以发现，不管是zksync/zkswap/loopring，都只实现了特定交易场景。

反过来说，如果需要通过zkRollup支持EVM的交易执行，需要将EVM的交易抽象成电路友好的账户模型。这种抽象并不容易，再者，EVM的描述电路可以预见比较大。从零知识证明的性能看，这方面会限制整个zkRollup的性能。

再看看zkRollup方案在Layer1的gas消耗。整个zkRollup方案的主要gas消耗为三部分（withdraw不考虑在内）：

*   Transaction Raw Data：在zksync中称为pub data。为了保证data availability，所有的Layer2的交易都会以裸数据的形式提交到Layer1。
    
*   Layer2 Block管理：在Layer2提交区块状态时，Layer1维护着Layer2的区块结构和状态。
    
*   验证Layer2 Block状态：在Layer2提交证明时，Layer1需要验证状态证明。
    

以一个区块350笔交易，每个交易的Transaction Raw Data的大小为20字节为例，一个区块处理的gas消耗：

[https://img.jinse.com/5497480\_image3.png](https://img.jinse.com/5497480_image3.png)

虽然上述的数据不是精确值，但是足以说明交易原始数据在整个zkRollup方案中的gas消耗占比是非常高的。从这个角度看，Layer2的有些项目选择通过其他链下的方式存储交易数据。

Optimism vs. Arbitrum
---------------------

Optimistic Rollup兼容EVM。也就是说，Layer2支持可编程性，并且在以太坊上的程序几乎无缝迁移。为了保证链上的状态正确，这两种方案都提供一段时间内的挑战机制。挑战者提供挑战的证据，Layer1抉择正确与否。

Optimism采用OVM执行Layer2交易。取名OVM是为了区分Layer1的EVM。因为提交到Layer1的状态需要检验正确性，Layer1需要“重放”Layer2的交易，也就是说，Layer1在有些情况下需要执行OVM交易的执行。Optimistic Rollup最复杂的地方也在于此，用EVM模拟OVM，并执行Layer2的交易。可想而知，在Layer1的EVM模拟OVM的执行是比较繁琐，消耗较大的操作。

Arbitrum也是采用挑战机制。为了避免挑战的gas费用低，Arbitrum引入了AVM：

[https://img.jinse.com/5497481\_image3.png](https://img.jinse.com/5497481_image3.png)

相对于EVM，AVM是一个相对简单的虚拟机。Arbitrum在AVM虚拟机上模拟EVM执行环境。也就是说，所有的Layer2交易都是在AVM执行，交易的执行状态可以用AVM状态表示。在提交到Layer1的状态有分歧时，挑战双方（Asserter和Challenger）先将状态分割，找出“分歧点”。明确分歧点后，挑战双方都可提供执行环境，Layer1执行相关操作确定之前提交的状态是否正确。在Layer1挑战的是AVM的状态，分歧点的AVM的指令执行。

简单的说，为了省挑战的gas费用，Arbitrum采用了精简的AVM（非常方便状态表示），通过快速分割，在链上只需要执行一个指令，判断状态是否执行正确。Arbitrum介绍文档中提到，整个挑战需要大概500字节的数据和9w左右的gas。在AVM的基础上，Arbitrum设计了mini语言和编译器，模拟了EVM的执行环境，从而兼容EVM。

总结
--

Layer2，相对于Layer1，在Layer1的基础上提供更丰富功能，更好的用户体验。资金状态确定性时长，安全性，可编程性是目前讨论的焦点。zkRollup是资金状态确定性最快的方案。optimistic Rollup/侧链具有可编程性。zkRollup支持EVM的证明是个期待的方向。

参考
--

\\Layer2的理解与思考\\

)

---

*Originally published on [Renaissance Labs](https://paragraph.com/@renaissance-labs/layer2)*
