探索 zkEVM
在深入讨论这个主题之前,让我们花点时间探讨 zkEVM 是什么,零知识证明的理论基础,以及它如何在各种Layer2项目中迅速发展。本文旨在比较当前利用 zkEVM 的 ZK rollups 的特征,假设读者对以太坊、Layer2解决方案和零知识证明有基本了解。
区块链三难题指的是在区块链系统中同时实现去中心化、安全性和可扩展性的困难。区块链三难题的概念始于 2014 年左右,但至今仍是第一层解决方案尚未解决的挑战。已经提出了各种策略来增强第一层的可扩展性,在以太坊的情况下,它被认为在所有区块链中提供了最高水平的去中心化和安全性。然而,由于高交易费用和处理速度缓慢,它在可扩展性方面面临挑战。
一个最关键的解决方案是提高以太坊可扩展性的 Layer 2,通过在链下处理交易来提高速度并降低成本。Layer 2 解决方案可以根据其验证方法和数据可用性分为几种类型,如 Rollups、Plasma 和 Validium。在这些解决方案中,Rollups 是一种在链上发布交易数据的方法。
Rollups 可以广泛分类为 ZK-Rollups 和乐观 Rollups,主要区别在于是否提交有效性证明。乐观 Rollups 在“无罪推定”上运作,在Layer2不提交任何有效性证明,而是被动接受挑战。相反,ZK-Rollups 在每次将数据发布到第一层块时主动提交有效性证明。
本文将专注于使用 zkEVM 或 zkVM 生成证明的通用 ZK-Rollups。
在深入研究 zkEVM 之前,了解 ZK-SNARK 是很重要的,它主要用于生成有效性证明。ZK-SNARK 代表零知识简洁非交互式知识论证,这是一种证明构造,其中可以证明拥有某些信息(例如秘密密钥)而不泄露该信息,并且在证明者和验证者之间没有任何交互。它同时满足 ZK(隐藏)和 SNARK(非交互)的属性,允许简洁验证。
Setup 证明者和验证者各自具有用于生成和验证证明的参数的约定设置。
证明者(Prover)
将希望证明的功能转换为算术电路。然后将此电路转换为 Oracle(通常是多项式)形式。Oracle 经过密码编译成特定形式的承诺值,然后提交给验证者。
验证者(Verifier)
验证者通过验证逻辑计算从证明者接收的证明值,然后决定是否接受或拒绝证明。
ZK-SNARK 可以分为两部分:一部分表示程序的有效性作为一组约束,称为电路,另一部分将电路加密地转换为证明值。
ZK-SNARK 中有各种方案,每种方案都有其优缺点。因此,在选择用于 zkEVM 的证明方案时,重要的是仔细考虑 zkEVM 的形式和涉及的权衡。主要要考虑的特征主要包括:
可信设置: 每个电路的可信设置 — 需要为每个电路进行不同的可信设置(例如,Groth16)。
证明成本:证明者生成证明所涉及的复杂性。
验证成本:由于 ZK rollup 验证通常发生在链上,它直接影响Gas费用。
证明方案可以根据其使用的密码系统进行分类。每种方案的密码基础影响其成本(证明大小和验证器时间)。
此外,这些密码系统需要设置来生成协议中使用的参数。设置可以广泛分类为三种类型:
由于可信设置中参数的安全性取决于可信方,因此与透明设置相比,它被认为不太安全。此外,非通用设置需要为每个电路进行新设置,使得透明、通用和非通用设置的首选顺序依次为透明、通用和非通用。
下面是一个表格,说明了每种方案的复杂性和设置方法。
证明方案的分类 | 来源:zk-learning.org
因此,考虑到每种方案的复杂性和设置方法的差异,选择最符合使用协议特征的方案至关重要。
生成零知识证明的证明需要大量计算,但 ZKP 技术的进步,如查找和递归,使得能够高效生成更大电路的证明成为可能。 第一代 ZK-Rollups,如Polygon Hermez v1.0,是特定应用程序的 Rollups,只能处理特定功能,如转账。 ZK 技术的进步为构建通用 ZK-Rollups 奠定了基础。 通用 ZK-Rollups 利用 zkEVM,可以证明以太坊虚拟机上的操作的计算有效性。
现在,是时候更仔细地看一下zkEVM了。
如前所述,ZK-SNARK 是一种证明方法,它使用加密协议从一组约束(称为电路)生成证明。在 zkEVM 中,程序可以被视为以太坊虚拟机(EVM)本身,与 EVM 的逻辑有效性相关的约束可以被视为 zkEVM 电路。
zkEVM 是一个电路,用于证明所有交易是否已正确执行,从根本上验证 EVM 执行跟踪的正确性。需要证明的方面包括 EVM 中的字长是否为 256 位,操作码执行的结果是否正确,以及堆栈和内存中的值是否已正确读取和写入,涵盖了 EVM 执行有效性的所有方面。
zkEVM 证明者使用的输入数据如下:
利用这些数据,证明者验证所有执行跟踪的有效性,包括代码哈希、Gas 使用情况,以及程序计数器和堆栈指针处读取和写入的数据,还有操作码和执行有效性的所有其他方面。
上图是一个示例,展示了 ADD 操作的有效性。在 zkEVM 电路中,每个执行跟踪步骤有三种主要类型的约束:
步骤上下文
与上下文相关的约束,如程序计数器和堆栈指针,以及 Gas 使用情况。在示例中,它验证程序计数器和堆栈指针是否都增加了一个,并且是否消耗了 3 个 Gas 单位。
Case 开关
这检查该步骤中使用的操作码。每个操作码都存在作为选择器,并验证每个步骤中仅使用了一个操作码。
此外,为了确定每个步骤中的值是否已在堆栈、内存和存储中正确读取和写入,使用了一个 Lookup 参数。Lookup 参数是一种证明查找表中某个值存在的方法。
zkEVM 的结构因项目而异,但使其能够证明如此庞大电路的因素之一是上述的 Lookup 参数。 Lookup 是一种创新方法,不直接处理电路内的操作,而是证明预编译表中的值存在。 大多数 zkEVM 基本上都有一个 EVM 电路,用于验证 EVM 跟踪的正确性,以及用于希望证明的值的几个预编译 Lookup 表。例如,在电路中计算以太坊中使用的 Keccak 哈希函数将是昂贵的,但使用用于查找的预编译 Keccak 表可以减少约束。 因此,zkEVM 通常由用于验证执行跟踪的主要 EVM 电路和用于查找的辅助电路组成。
zkEVM 的另一个关键任务是如何减少证明数量,这取决于所使用的证明方案。在 ZCash 使用的 Halo2(IPA)中,证明通过使用 Pasta 曲线进行递归累积。而使用 Halo2(KZG)的 Scroll 则采用不支持循环的 BN254 曲线,需要另一个聚合电路来组合证明。
因此,zkEVM 利用 ZK-SNARKs 的特性 — 最小的证明大小和验证成本 — 将有效性证明提交到Layer1,有效解决了可扩展性问题。然而,使用 zkEVM 的 ZK-Rollup 面临的主要挑战是高昂的证明成本。正在努力从各个角度优化 zkEVM 以克服这一挑战。优化方法可以大致分为两类:
不同类型的 ZK-EVM | 来源:Vitalik’s 博客
Vitalik Buterin 对zkEVM的分类系统将其分为四类:
从Type 1 到Type 4,与以太坊的兼容性逐渐降低,但好处是生成证明的成本降低。 尽管Type 1 zkEVM 尚未商业化,但随着计算中的优化,如 Lookup 和 Recursion,变得足够先进,未来可能会出现它们的使用。
ZK-Rollup 仍然是一项新兴技术,还有很长的路要走。尽管已经尝试了许多优化计算的方法,但生成证明仍然需要高昂的成本,硬件要求也很高。 此外,这一领域的技术复杂性带来了很高的准入门槛,导致缺乏能够引领这一领域的专家和支持。 然而,不可否认的是,ZK-Rollup 正在以非常快的速度发展,并且是有望解决以太坊可扩展性问题的有希望的解决方案之一。
https://vitalik.eth.limo/general/2022/08/04/zkevm.html
https://docs.scroll.io/en/technology/zkevm/zkevm-overview/
https://www.iacr.org/archive/asiacrypt2010/6477178/6477178.pdf
https://zcash.github.io/halo2/
https://ethereum.org/en/layer-2/
https://ethereum.org/en/developers/docs/scaling/zk-rollups/
https://chain.link/education-hub/zero-knowledge-rollup
https://chain.link/education-hub/what-is-layer-2
本文由 AI 翻译,欢迎小伙伴们来校对。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!