简介
零知识证明,特别是 zk-SNARK (Succinct Non-interactive Arguments of Knowledge) 可能是 Web 3 前沿最重要的技术之一。虽然该子领域的大多数媒体和投资的关注都集中在 zk- Rollup 上,这种扩展解决方案为以太坊等 L1 区块链提供了巨大的可扩展性,但这绝不是 zk-SNARK 的唯一应用。在这篇文章中,我们将深入分析零知识汇编代码 ( 或 zkASM) 的概念,评估它在 zk- Rollup 和其他领域的用例,探索它在重新发明我们所知道的互联网方面的理论可能性。
技术原理
zk-ASM,顾名思义,主要包含两个技术部分:zk 和 ASM。zk 部分指的是 zk-SNARK,而 ASM 部分指的是汇编代码。要理解 zk-ASM 的潜力,我们必须首先理解这两个看似神秘的概念的理论基础。
zk-SNARK
zk-SNARK 是 zk-Proof 皇冠上的宝石:它们是一种简洁的证明,证明某个陈述是正确的,在证明时没有透露任何关于被证明数据的信息。例如,假设某人断言「我知道一个 m 使得 C(m) = 0」,其中 m 是一个千兆字节长的消息,C 是一个函数。zk-SNARK 将是一个非常简短的证明 (<1GB),可以快速验证,并且不会透露任何关于 m 的信息 ( 除了公开可用的信息 )。
那么 C(m) 到底是什么?它有什么用?这个函数实际上是一个算数电路,或者是我们想要执行的特定函数的有向无环图 (DAG) 表示,如图所示。「m」本质上是进入电路的输入数据,电路中的特定「节点」是单独的逻辑门或算数运算。例如,「+」节点可能有「2」和「3」作为输入,并将「5」输出到下一个运算符。因此,可以在「算数电路」中对任意算数或逻辑运算进行编码。
一旦我们有了这个算数电路作为我们想要运行 zk-SNARK 的代码的表示,我们就可以开始构建这个 zk-SNARK 了。从根本上说,因为「代数基本定理」,使得 zk-SNARK 是可能的,该定理指出,一个「d」次多项式最多有「d」个根。数学技巧分为两个步骤🙁1) 以某种方式将我们想要证明的函数「f(m)」转换为一个多项式 ( 并坚持下去 ),(2) 使用「代数基本定理」与多项式相互作用,并提供一个简洁的证明。在技术术语中,第一部分被称为「Polynomial Committment Scheme」(PCS:多项式承诺方案 ),第二部分被称为「Polynomial Interactive Oracle Proof」(PIOP)。
虽然 PCS 和 PIOP 的具体实现超出了本文的范围,但到目前为止,我们已经获得了 zk-SNARK 核心步骤的粗略草图:
- 想运行 zk-SNARK,就需要有一个函数的选择 ( 代码函数,数学方程等 );
- 将此函数编码为算数电路 C(m);
- 运行 PCS 得到该算数电路的多项式表示;
- 运行 PIOP 以获得原始「m」大小的对数的简洁证明。
我们有一个定制的 zk-SNARK 可以证明某人知道某个信息而不用透露信息是什么。
汇编代码
zk-ASM 的第二个难题是汇编代码的思想。汇编代码是一种包含非常低级语言指令的类语言,机器很容易阅读,但人类很难破译。与 Python、Java 等高级语言不同,汇编语言包含非常原始的函数,例如会在处理器和硬编码内存位置上的一系列数据寄存器上移动、比较、添加和跳转。例如,在屏幕上打印数字 1 到 9 的 Python 代码为 123456789:
下面是它的 x86 汇编版本:
对这么简单的操作来说,其实变得更麻烦了。那么为什么还要使用汇编语言呢?如上所述,虽然这些指令对人类来说可能不容易阅读,但它们很容易「组装」到 110011001 字节码中,供机器读取和执行 ( 这称为汇编程序 )。相对而言,Python 和 Java 等高级语言更易于阅读,但用这些语言编写的程序不能直接由处理器执行。相反,我们需要依赖于一个「编译器」,它咀嚼我们编写的 Python 或 Java 代码,并吐出一堆汇编代码,然后由机器组装和执行。我们可以期望同一段 Python 或 Java 在不同的处理器和不同的操作系统上平稳运行,因为编译器完成了繁重的工作,将源代码编译为特定于该处理器或操作系统的汇编语言。
因为所有语言都可以编译成汇编代码 ( 汇编代码本身可以编译成可执行的二进制代码 ),所以汇编程序本质上就像「所有语言之母」。现在假设我们能够将汇编语言 ( 如 x86 或 RISC-V) 中的所有操作数转换为一种算数电路表示,这样我们就能够提供这种汇编语言中所有操作数的 zk-SNARK 证明。这意味着理论上我们能够提供任何用任意高级语言 ( 如 Python 或 Java) 编写的程序的 zk-SNARK,这些程序可以编译成汇编语言。这就是为什么我们需要考虑 zk-ASM。
实际应用
zk-EVM Rollup:Polygon zk-ASM
zk-ASM 最重要的应用之一是创建与以太坊虚拟机兼容的 zk- Rollup,或 zk- EVM。zk-EVM 对于区块链的可扩展性非常重要,因为它允许程序员部署在基于 zk-Rollup 的 L2 链上,而无需修改太多 ( 如果有的话 ) 他们的代码]。在这个领域,Polygon 的 zk-EVM 是一个典型的案例研究,它展示了如何使用 zk-ASM 来实现这一目标。
当程序员在以太坊 L1 区块链上开发时,他们通常使用 Solidity 进行编码。这种 Solidity 代码在执行前会被编译成一系列 EVM 操作码,如 ADD、SLOAD 和 EQ。默认情况下,这个过程显然不会创建任何类型的 zk-Proof。Polygon 的诀窍是创建一个方法,将每个 EVM 操作码解释为它们自定义编写的 zk-ASM,这对 zk-SNARK 非常友好。然后,他们的 L2 zk-EVM 将执行 zk-ASM,同时还创建 ASM 的 zk-SNARK 电路,以创建 zk-SNARK 证明。例如,EVM 中的 ADD 操作码将被翻译成 Polygon 的 zk-ASM,如下图:
因为 Polygon zk-EVM 的招数在汇编级别上,它从普通以太坊程序员接触的代码中删除了两个级别,即「Solidity」级别。这就是为什么大多数开发人员可以将他们为以太坊主网构建的 EVM 代码直接移植到 Polygon zk-EVM 的原因。此外,由于 Polygon zk-EVM 将以太坊的技术堆栈「保持」到操作码级别,所有依赖于分析编译的操作码的调试基础设施都将保持可用和完整。这与其他一些 zk-EVM 设计不同,例如 zkSync,后者不提供操作码级别的 zk-Proof。因此,即使 Polygon 发明并证明了自己的汇编语言,Vitalik 写道:「它仍然可以验证 EVM 代码,它只是使用了一些不同的内部逻辑来完成它。」
超越 Rollup:zk-WASM
zk- EVM 绝不是 zk-ASM 的唯一应用程序。回想一下我们之前的断言,汇编语言本质上是「所有语言之母」,并且 zk-ASM 的创建将为用任何编译成该汇编语言的语言编写的通用程序解锁 zk-Proof。Web Assembly,或称 WASM,是最重要的新兴汇编语言之一。WASM 于 2018 年首次发布,其目的是创建一种汇编语言,以提高 Web 应用程序的执行速度,并为 Javascript (Web 背后的主要编码语言 ) 提供执行补充。
从本质上讲,随着 Web 多年来的发展,Web 应用程序的规模和复杂性不断增长,这意味着浏览器编译用 Javascript 编写的所有内容的速度通常非常慢,并且必须依赖复杂的编译 – 优化 – 重新加载周期。另一方面,WebAssembly 通过提供可移植的、模块化的、易于执行的汇编语言,消除了对复杂浏览器执行引擎的依赖。此外,作为一种汇编语言,WASM 允许程序员直接用 C 语言、C++、Rust、Java 或 Ruby 编写在浏览器中本机运行的代码片段。因此 WASM 已成为「提供分布式无服务器功能」的首选技术。
那么 zk-SNARK 为什么会出现,又是如何出现的呢?WASM 的独特之处在于它是一种客户端技术,能够直接与用户输入和数据交互。因为这通常包括敏感数据,如密码和个人信息,我们需要一种技术🙁1) 确保程序正确执行,(2) 我们的敏感信息不会被泄露。如上所述,zk-SNARK 是解决这两个问题的完美解决方案,因此是确保 WASM 安全的重要拼图。
虽然开发 zk-WASM 的工作仍处于早期阶段,但最近已经有一些项目发布了用于 WebAssembly 的 zk-SNARK 电路原型。例如,Delphinus Lab 的「ZAWA」zk-SNARK Emulator 提出了一种将 WASM 虚拟机的操作数和语义编码到算数电路中的方法,从而使其能够进行 zk-SNARK 证明。随着时间的推移,zk-WASM 电路无疑会不断优化,从而允许用通用语言 ( 如 C 语言、C++、Rust 和 Ruby) 编写的程序采用 zk-Proof 的范例。
结论
在这篇文章中,我们探索了 zk-ASM 的理论基础,并研究了 zk-ASM 的两个范例:Polygon 使用 zk-ASM 创建一个操作码级别的 zk-EVM,以及 zk-SNARK 在 WebAssembly 上的应用以创建 zk-WASM。最终,zk-ASM 的承诺是将 Web 2 的互操作性和规模与 Web 3 的可靠性和安全性结合在一起。
一方面,区块链越来越多地寻求超越当前吞吐量瓶颈的扩展,并有可能支持执行,而另一方面,Web 2 方法因未能充分保护用户数据和隐私而越来越受到攻击。由于程序员能够在他们的 Web 2 代码中使用 Web 3 设计范例,并在区块链上引入 Web 2 语言和代码,通用的 zk- ASM 可能代表 Web 2 和 Web 3 世界中的一个汇合点。正是在这个意义上,zk-ASM 可以让我们重新想象一个安全、无需信任的互联网。
(声明:请读者严格遵守所在地法律法规,本文不代表任何投资建议)