Scroll 架构拆解(zkRollup)

Scroll 是一种基于 zk-rollups 技术的 Layer 2 扩容解决方案,旨在提高以太坊网络的吞吐量和交易速度。相比常见的 Optimistic Rollup,Scroll 选择了基于零知识证明的扩容解决方案,并通过硬件加速 zkp 的生成和验证,实现了字节码级别的 EVM 兼容。这意味着开发人员可以使用 Solidity 等以太坊开发工具来构建智能合约,并将其部署到 Scroll 网络上。它的竞争对手包括 Optimism、zkSync 等其他 Layer 2 扩容解决方案。

一、zk Layer2 赛道现状

1、隐私和扩容

关于零知识证明,目前被大家讨论的比较多的可以总结为两方面:一个是隐私,另一个是扩容。隐私其实是零知识证明中零知识的特性,不需要像证明人提供任何信息即可实现证明。而扩容则是运用了 ZKP 的特性,Proof 实现了不同程度的信息压缩从而降低了主网的数据量。

当前的zkRollup,其实严格意义上来说不应该叫做零知识,因为数据都是完整保存到二层链上的,只是将数据量较小的 ZKP 传回 base 链,反而更像是一个 Validate proof 。但从技术角度来说,有效性证明和零知识证明在算法层面的差异很小,侧重隐私还是扩容,其实是一个tradeoff。对于隐私来说,zk的部分是一个刚需,但对于扩容来说并不是,所以可以减轻一部分算法的负担。

一般来说,zk在 UTXO 模型下是更好实现的,比如证明一笔交易,只需要验证 Merkel Tree Proof 是否为 yes 即可。但对于以太坊的账户模型来说,需要做一些加减和同态运算,所以很难进行耦合。

目前对于 Layer2 来说,需求更加偏向安全性和不被 sensor ,而链上公开的 Layer2 数据有利于抗审查,就算用户被 sensor,也能通过数据验证自己 calldata 回 layer1。

2、Snark 和 Stark

zk-SNARK 全称 Zero-Knowledge Succinct Non-interractive Argument of Knowledge(零知识简洁非交互式知识论证),zk-STARK 全称 Zero-Knowledge Scalable Transparent Argument of Knowledge(零知识可扩展透明知识论证)。对比 SNARKs 和 STARKs,SNARKs 和 STARKs 都有各自的优势,两者之间的选择取决于用户的具体用例需求。

支持者认为 SNARK 更高效、更快速,因为它们可以在几毫秒内得到验证。然而,这种效率是有代价的,因为一些 SNARK 依赖的可信设置仪式,有安全薄弱的环节。这意味着证明中使用的初始参数必须在安全环境中生成,参数的任何泄露都可能导致安全漏洞。

STARKs 不需要可信设置,从而提供更强的安全性,但可能需要更长的时间来验证,因此被认为效率较低。 STARK 的证明数据的大小比 SNARK 的大,这意味着验证 STARK 可能比 SNARK 花费更多的时间并且消耗更多的 gas。另一方面,由于可以在不依赖任何外部参数的情况下验证 STARKs 的证明,因此 STARKs 比 SNARKs 更容易审计,尽管这可能取决于具体的实施方式。与大多数 SNARK 不同,STARK 依赖于被认为是抗量子的哈希函数。

总的来说,两者的区别在密码学层面不是很大,体现在不同的tradeoff。zksnark的proof非常短,验证cost很低,生成proof的时间会更长,需要setup;zkstark的proof比较大,验证cost更高,但好处是生成zkp时间短,不需要setup。随着可插拔的多项式承诺技术的成熟,二者的区别在不断缩小,更多是marketing的区别。相关的设计主要涉及前端和后端,前端体现在电路的设计,后端体现在结合什么样的多项式承诺生成zkp。

3、ZKEVM和ZKVM

ZKEVM是一个兼容EVM的虚拟机,可以保证程序、操作和输入输出的正确性。ZKEVM 主要侧重点在于直接实现与现有EVM的兼容,以便无缝迁移现有的dapp和开发者工具。ZKEVM使用zkSNARKs证明执行的正确性,可以在 Layer2 中执行智能合约。

ZKVM的主要侧重点在于实现完全的扩容,旨在实现dapp的逻辑和性能的完全扩容。ZKVM使用zk-STARKs证明执行的正确性,可以在Layer2中执行智能合约。

以下是 ZkVM 与 ZkEVM 之间的的几个维度的不同之处:

1.兼容性:虽然都是扩容,但是侧重点并不同,ZkEVM 的侧重点在于直接实现与现有 EVM 的兼容,而 ZkVM 的定位在于实现完全的扩容,也就是将 dapp 的逻辑以及性能提升到最优,兼容性并不是首要的。底层搭好了,EVM 兼容也可以实现。

**2.性能:**两者都有比较可以预见的性能方面的瓶颈,ZkEVM 主要瓶颈在于兼容 EVM 这样一个并不适合封装在 ZK 证明系统时产生的多余成本。ZkVM 的瓶颈在于因为引入了指令集 ISA,导致最终输出的约束更复杂。

3.开发者体验:Type II ZkEVM ( 如 Scroll, Taiko) 主打的是对于 EVM Bytecode 的兼容,换句话说就是 Bytecode 级别及其以上的 EVM 代码都可以通过 ZkEVM 产生对应的零知识证明。对于 ZkVM 来说,有两个方向,一个方向是做自己的 DSL( 如 Cairo), 另一个则是目标兼容现有的比较成熟的语言如 C++/Rust(如 Risc0)。未来我们预计原生的 solidity 以太坊开发者会可以无成本迁移至 ZkEVM,而更新更强大的应用则会跑在 ZkVM 上。

总的来说,ZKEVM在技术层面要比ZKVM复杂,因为多了很多的条条框框。Scroll 目前的EVM兼容性很好,字节码级别的 EVM 兼容相当于做了编程语言逐句转换为电路的一个操作。而 zkSync 其实没有做到真正的evm兼容,只是做了一个compile。

4、基于电路和虚拟机的系统

如何在区块链中实现 ZK 证明系统呢?目前大致有两种方法实现电路 - 基于电路的系统 (circuit based) 以及基于虚拟机的系统 (vm-based)。

首先,基于电路的系统的功能是将程序 (program) 直接转化为约束条件 (constraints) 并送入证明系统 (proving system);基于虚拟机的系统通过指令集 (ISA) 执行程序,在此过程中产生执行轨迹 (execution trace)。这个执行轨迹之后会被映射成约束条件,然后被送入证明系统。

对于一个基于电路的系统,程序的计算由执行程序的每台机器 (machine) 进行约束。而对于基于虚拟机的系统,ISA 被嵌入到电路产生器 (circuit generator) 中,并产生程序的约束 (constraints),同时电路产生器有指令集、运行周期、内存等等限制。虚拟机提供了通用性,即任何机器都可以运行一个程序,只要该程序的运行条件在上述限制范围内。

在虚拟机中一个 zkp 程序大概经历如下的流程:

优缺点:

  • 从开发者 (developer) 的角度来看,在基于电路的系统中开发通常需要对每个约束条件的成本有深入的了解。然而,对于编写虚拟机程序来说,电路是静态的,开发者需要更关心的是指令 (instructions)。
  • 从验证者 (verifier) 的角度来看,假设使用相同的纯 SNARK 作为后端,基于电路的系统和虚拟机在电路的通用性方面有很大的不同。电路系统对每个程序产生不同的电路,而虚拟机对不同程序产生相同的电路。这意味着,在一个 rollup 中,电路系统需要在 L1 上部署多个验证合约 (verifier contract)。
  • 从应用 (application) 的角度来看,虚拟机通过将内存模型 (memory) 嵌入到设计中,使应用程序的逻辑更加复杂,而使用电路系统的目的是为了提高程序的性能。
  • 从系统复杂性 (complexity) 的角度来看,虚拟机将更多的复杂性纳入系统,如内存模型、主机 (host) 和客户 (guest) 之间的通信等,相比之下电路系统更简洁。

以下是目前 L1/L2 中基于电路和基于虚拟机的不同的项目预览:

二、Scroll 有什么不同

1、字节码级别 EVM 兼容

Scroll 的字节码级别 EVM 兼容是指,Scroll 的虚拟机可以直接执行 EVM 字节码,而无需进行任何修改。这意味着,现有的以太坊智能合约可以直接在 Scroll 上运行,而无需进行任何修改或迁移。这种兼容性是通过在 Scroll 的虚拟机中实现与 EVM 相同的操作码和指令集来实现的。同时,Scroll 的虚拟机还支持 zkSNARKs 证明执行的正确性,可以在 Layer2 中执行智能合约,从而实现高性能和低成本的交易处理。

在以太坊的生态系统中,EVM 字节码的兼容性是非常重要的,因为它可以使现有的以太坊智能合约无需进行任何修改或迁移,就可以在新的扩容方案中运行。然而,EVM字节码的兼容性也存在一些问题,例如:

  • EVM 本身存在一些问题,例如性能瓶颈和安全漏洞,这些问题可能会影响到新的扩容方案的性能和安全性。
  • 不同版本的 EVM 可能存在不兼容的问题,因此在进行字节码级别的兼容时需要注意选择正确的EVM 版本。在新的扩容方案中,可能需要对 EVM 字节码进行一些修改或优化,以便更好地适应新的环境和需求。

2、硬件加速

Scroll 的硬件加速方案主要是通过使用专用硬件来加速 zkSNARKs 证明的生成和验证过程,以提高 Scroll 的性能和吞吐量。这些专用硬件包括 ASIC(专用集成电路)、GPU(图形处理单元)和 FPGA(现场可编程门阵列)等。这些硬件加速器可以帮助提高零知识证明系统中证明者的计算性能,从而加速证明的生成和验证过程。

其他硬件加速方案还包括:

  1. 并行计算:Scroll 可以使用并行计算来加速证明的生成和验证过程。例如,可以将证明的生成和验证过程分解成多个子任务,并在多个处理器或计算节点上并行执行,从而提高计算性能和吞吐量。
  2. 缓存优化:Scroll可以使用缓存优化来加速证明的生成和验证过程。例如,可以使用高速缓存来存储中间结果和计算状态,以便更快地访问和重用这些数据,从而提高计算性能和吞吐量。

3、Layer3 战略

Layer3其实并不是大家想象的build一个金字塔式的结构,(其中的Dilemma在于:如果L3要可靠那么需要calldata到L1;如果不calldata那用链下存储数据的L2就可以)而是像Arbitrum一样基于现有框架为项目方提供更多的自治性。而当L2被视为base链时,L3才有价值。

三、Scroll 架构

Scroll 架构由三个基础组件组成:Scroll节点、Roller网络、Rollup和Bridge合约

将架构中的三个部分组合在一起,我们现在可以解释 Scroll的zkRollup工作流程,如下图所归纳的。

Scroll中的L2区块被生成,提交到以太坊基础层,并最终被确认,按照如下的顺序:

1、排序器生成一系列区块。对于第i个区块,生成执行踪迹T并将其发送给协调器。同时,它还将交易数据D作为calldata提交给以太坊上的Rollup合约,以获取数据可用性,并将生成的状态根和交易数据承诺作为状态提交给Rollup合约。

2、协调器随机选择一个Roller为每个区块踪迹生成有效性证明。为了加快证明生成过程,可以在不同的Rollers上并行生成不同区块的证明。

3、在为第i个区块生成区块证明P后,Roller将其发送回协调器。每经过k个区块,协调器将聚合任务分派给另一个Roller,以将k个区块的证明聚合成单个聚合证明A。

4、最后,协调器将聚合证明A提交给Rollup合约,Rollup合约再根据聚合证明来验证之前提交给Rollup合约的状态根和交易数据承诺,最终确定第i+1到i+k的L2区块。图 3说明了Scroll区块将在L1 上分多步最终确认。每个L2区块将经过如下三个阶段,直到最终确认。

Precommitted 表示一个区块已经被一个排序器提议并发送给Rollers。虽然 Precommitted区块还不是Scroll L2上的正式部分,因为它们还没有发布在以太坊基础层上,不过信任排序器的用户可以按预期进行下一步操作。

Committed 表示该区块的交易数据已经发布在以太坊的Rollup合约上。这确保了区块数据可用,但不能证明它是正确执行的。

Finalized 表示通过验证以太坊链上的有效性证明,已经验证此区块中的交易正确性。经过最终确认的区块被认为是Scroll L2链上的正式部分。

Prover网络:

在Scroll中,prover生成网络是指用于生成zkSNARKs证明的网络,它由多个计算节点组成,每个节点都可以处理交易和生成证明。prover生成网络的主要任务是生成zkSNARKs证明,证明的正确性可以被节点网络验证。在生成证明的过程中,prover生成网络需要执行一系列复杂的计算,例如多项式求值、多项式插值、FFT变换等。

参考

对话Scroll创始人张烨:https://www.youtube.com/watch?v=WOirgp2n58U