简析以太坊 Layer 2 技术方案及扩容特性

百款NFT链游免费玩 数字货币支付图解教程 区块链游戏获利技巧

ZK Rollup 是资金状态确定性最快的方案,Optimistic Rollup 和侧链具有更佳的可编程性。

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

Layer2 交互模型

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

除了 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 实现分类如下:

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

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

总结一下,从安全性角度看,各种 Layer2 的排序如下:zkRollup,optimistic Rollup,侧链。从提现的时间也印证了安全性,zkRollup 的提现是分钟级别,其他两种方案,小时甚至是天级别。zkSync 是比较完善的 zkRollup 开源项目,感兴趣的小伙伴可以查看之前的分析文章:

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

细看 zkRollup

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

关键就在于 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 消耗:

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

Optimism vs. Arbitrum

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

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

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

相对于 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 的证明是个期待的方向。

百款NFT链游免费玩 数字货币支付图解教程 区块链游戏获利技巧