Noir: 简化零知识证明

本文介绍了Noir语言,它是一个面向特定领域的开源语言,旨在简化零知识证明的开发。文章深入探讨了零知识证明的复杂性及Noir如何通过高层抽象和中间表示(ACIR)来解决这些挑战,降低开发者的学习曲线。文章还比较了Noir与其他零知识语言的不同之处,并分析了其背后的架构与优化机制,展示了Noir在隐私保护和安全性方面的应用潜力。

"Noir: 简化零知识证明 - Three Sigma" banner

在Three Sigma,我们认识到Web3领域中的复杂机遇。我们团队位于里斯本,提供开发、安全和经济建模的顶级服务,推动你项目的成功。无论你需要精确的代码审计、高级经济建模还是全面的区块链工程,Three Sigma都是你值得信赖的合作伙伴。

访问我们的网站 website 了解更多信息。

我们不仅是代码、经济审计和区块链工程的专家——我们还热衷于拆解Web3概念,以推动行业的清晰度和采用。

1. Noir简介

Noir是一个开源的领域特定语言,旨在构建保护隐私的零知识(ZK)程序。它抽象了复杂的密码学概念,使即使没有深入数学知识的人也能轻松使用。Noir编译为一种称为ACIR的中间语言,然后可以进一步处理以适应不同的证明后端。这种灵活性使Noir适用于各种应用,从安全的链上验证到基于云的私有系统。它因其后端无关性及与Aztec等工具的集成而特别出名,以支持私有合约。

问题:ZK证明中的复杂性

由于复杂的密码学特性,零知识证明的实现传统上一直比较困难。开发者常常面临陡峭的学习曲线,包括理解复杂的数学原理和处理底层密码学库。尽管ZK证明在增强去中心化应用的隐私和安全性方面显示出巨大的潜力,这种复杂性限制了它们的采用。

解决方案:Noir的可访问ZK开发

Noir通过抽象复杂性来简化这些挑战,使ZK开发变得更加可访问。它允许开发者以高层次、直观的方式编写ZK程序,关注应用逻辑而不是密码学细节。通过将代码编译成ACIR(抽象电路中间表示),Noir弥合了高层次开发与高效密码学证明生成之间的差距。在第4节(Noir的内部运作)中,我们将解释是如何实现的。

与其他ZK语言的区别

比较介绍

本节提供三种突出零知识(ZK)编程语言的技术比较:NoirCircomZoKrates。这些语言用于开发ZK电路和应用,各有其独特的方法和特点。

  • Circom 是一种用于创建用于零知识证明的算术电路的领域特定语言。它允许开发者定义计算的约束,这些约束编译为与zk-SNARK证明系统(如Groth16)兼容的Rank-1 Constraint Systems(R1CS)。
  • ZoKrates 是一个工具包,提供一种高层次语言用于编写ZK电路。它将这些电路编译为R1CS,并包括用于见证计算、证明生成以及与以太坊智能合约的集成以进行链上验证的工具。

将Noir与Circom和ZoKrates进行比较,有助于突出它们在设计哲学、能力、可扩展性解决方案、证明机制和性能优化方面的差异。这一比较旨在为开发者提供技术洞见,以选择适合自己特定用例的零知识证明开发语言。

若要了解更多关于Noir、Circom和ZoKrates的信息,请查阅他们的文档:NoirCircomZokrates

2. 零知识证明和zk-SNARKs简介

如果你已经熟悉零知识证明和zk-SNARKs,可以跳过本节。

零知识证明(ZKPs)是一种密码学方法,用于证明对一条数据的知识,而不暴露该数据本身。这一技术是现代密码学的基础,使证明者能够在不透露任何关于基础信息的细节的情况下说服验证者某一陈述的有效性。ZKP建立在三个核心原则之上:

  • 完整性:如果证明者知道正确的数据,验证者将会相信。
  • 健全性:不诚实的证明者无法说服验证者一个虚假的陈述。
  • 零知识性:验证者不会超出陈述真实性的内容。

虽然ZKP可以是交互式或非交互式的,但关键的区别通常在于对验证者诚实性的假设。交互式证明通常依赖于诚实验证者,以保持零知识属性,这意味着验证者必须正确遵循协议。非交互式证明,如zk-SNARKs和zk-STARKs,在保证零知识性时消除了这种假设,即使针对恶意验证者。

示例:阿里巴巴洞穴

阿里巴巴洞穴的例子是用于概念化ZKP原则的经典插图。想象一个圆形的洞穴,只有一个入口,分为两条路径A和B,这两条路径在一个锁住的门口交汇。证明者Alice知道解锁这个门的秘密词,她想要说服验证者Bob,她知道这个词,但不透露它。

这个过程可以描述如下:

  1. 初始设置:Alice进入洞穴并随机选择一条路径(A或B),Bob不知道她选择的是哪条路径。
  2. 挑战发出:Bob在外喊出一个随机挑战,要求Alice通过特定路径(A或B)返回。
  3. 证明执行:如果Alice知道秘密词,无论Bob要求哪条路径,她都可以用这个词来解锁门。然后她从指定的路径退出。
  4. 验证:Bob观察Alice是否从正确的路径出现。如果她在多次迭代中始终从正确的路径返回,Bob对Alice知道秘密词的信心增加,尽管他从未得知这个词本身。

要了解更多关于ZKP的信息,你可以查看以下文章:ChainlinkZKP的示例以太坊Aztec

零知识SNARKs(zkSNARKs)

零知识简洁非交互密钥的证明是ZKP的一种特殊类型,证明者向验证者发送一条消息,证明对一个秘密的知识而无需交互。zkSNARKs提供了关键优势,包括简洁性(短证明)、非交互性和高效的验证

zkSNARKs的工作原理

zkSNARKs允许证明者在不透露秘密(w)的情况下,证明对该秘密的知识,遵循以下三步:

  1. 算术化:函数或陈述被转换为代数约束(多项式),证明者必须使用秘密来解决这些约束。这些约束形成一个系统,只有掌握正确秘密(w)的人才能满足它们。
  2. 证明生成:证明者创建一个证明(π),使用秘密和公共输入。这个证明是通过密码学技术生成的,可能需要值得信赖的设置以确保安全性。
  3. 验证:验证者使用公共输入检查证明与约束的匹配,确保证明者的知识,而不学习秘密。这个验证过程高效,通常可在毫秒内完成,使得zkSNARKs非常适合资源受限的环境,如区块链。

如果你想了解更多关于zkSNARKs的信息,可以查看这些文章:ENSCryptologieVitalik

3. Noir的内部运作

  1. ACIR:Noir将用户程序编译成ACIR字节码,表示零知识证明(ZKP)所必需的算术电路和约束。ACIR作为一个无后端证明系统的层,简化了Noir(前端)和ZK证明后端之间的通信。
  2. ACVM:ACVM负责解释和执行ACIR字节码,将其转换为底层证明系统所需的格式,比如Barretenberg。它处理ACIR中的操作码和约束,执行它们以为见证者(输入和中间结果)分配值,管理复杂的密码学任务,例如处理黑盒函数。
  3. PLONKish算术化:ACVM使用PLONKish算术化将ACIR约束转换为多项式形式。这使得证明系统(如Barretenberg)能够通过将计算减少为多项式方程来高效验证计算,这是生成可扩展且简洁的零知识证明的关键。
  4. 扩展PLONKish算术化:ACVM通过引入自定义门和高级约束处理来增强PLONKish算术化,以支持诸如Plonky2、UltraHonk和Halo2等证明系统。这些扩展实现了高效的递归证明生成(Plonky2)和针对特定电路的约束处理改进(TurboPlonk、Halo2),基于PLONK的核心原则构建。

ACIR

抽象电路中间表示(ACIR)作为高层次语言(如Noir)与证明系统(如Aztec的Barretenberg)所需的底层算术表示之间的桥梁。它将Noir中描述的计算抽象为零知识证明系统可以解释的格式,使得生成密码学证明不依赖于特定的证明架构。ACIR提供了一个通用层,使得不同的前端和后端能够无缝交互。

ACIR采用有向无环图(DAG)模型,其中门表示基本操作(例如,加法、乘法),通过指导数据流的线缆连接。该模型虽然受到硬件电路的启发,但专注于以零知识证明(ZKP)优化的方式捕获计算。ACIR使用约束来表达数据元素之间的关系,这些数据元素被称为见证,创造出灵活的数学基础方法。

中间表示和约束模型

当编译时,Noir程序转换为ACIR字节码,这是表示逻辑和算术操作的操作码序列。每个操作码生成必须在零知识证明中满足的约束。相比于用线路连接,这些约束表达关系,例如:

变为约束:

这些约束替代了直接的布线,确保在执行过程中输入和输出之间的关系严格被执行,这是生成有效ZK证明的关键。

求解、见证和证明生成

在ZK证明中,执行ACIR程序的过程被称为求解,目标是确定满足程序约束的见证值——输入和中间值。输入见证可以由用户提供,也可以在求解过程中派生。求解开始时为输入见证分配值,然后按顺序逐个求解每个操作码以计算其余的见证值。

ACIR确保见证值保持一致,证明生成的性能在很大程度上依赖于操作码的高效排序。一旦所有约束得到满足,则程序被认为已完全求解,随后后端证明系统(如Barretenberg)使用见证值和约束生成最终的密码学证明。ACIR的抽象使其字节码能够在不同的证明系统中运作,确保证明生成的灵活性和兼容性。

如需进一步阅读,请参考这份文档

ACVM

Noir中的抽象电路虚拟机(ACVM)解释ACIR字节码,求解见证值,并与后端证明系统交互。它确保ACIR中的所有约束都得到满足,从而促进零知识电路的执行。以下是其核心功能的详细介绍:

核心功能

抽象电路虚拟机(ACVM)在Noir中的核心职责是转换和优化ACIR电路以用于证明生成。这个过程发生在多个层次上:

  • 电路转换:ACVM将旧的、低效的操作重新映射为更新的、经过优化的版本。当某个计算超过系统的限制时,电路引入中间变量,以确保一切都保持在证明系统的边界内。
  • 表达分解:当ACIR表达式包含过多项时,CSAT变换器启动。通过使用中间变量将大的表达式分割成较小的表达式,变换器确保每个操作适合有限的证明系统宽度。这个过程确保约束是良好定义的,并且在目标ZK证明系统的可接受范围内。
  • 操作码管理:ACVM中的操作码管理在跟踪编译过程中对所有操作码所做的更改中起着关键作用。通过将旧索引映射到新索引,该映射确保证明生成器和系统的所有其他部分与转换后的电路保持同步。

优化层

效率在ZK系统中至关重要,ACVM具有多种优化机制:

  • 一般优化:它减少电路中的冗余和不必要的操作。通过运行不同的处理,系统消除无效操作,这些操作不会对电路的逻辑产生贡献。例如,冗余的范围约束被移除,而未使用的内存块被删除。
  • 见证求解:ACVM中的见证处理通过跟踪完全确定的变量值进行优化。这些变量被标记为“可求解”,以便进一步简化表达,在证明生成过程中减少约束的整体复杂性。通过将见证标记为可求解,ACVM确保了不必要的约束被最小化,提高了证明生成过程的效率。

证明生成工作流

ACVM中的证明见证生成器(PWG)在生成证明见证方面发挥着关键作用:

  • 表达求解器:PWG利用表达求解器等求解器解决ACIR中的算术约束。它试图通过评估已知变量和常量来计算见证值。如果表达式中的所有项都能被解决,则相应的见证会被分配其值。
  • 指令和操作码处理:除了算术表达式,PWG还解决了其他类型的操作码,如黑盒函数调用和Brillig虚拟机指令(非算术电路)。它处理将抽象高层命令(如ToLeRadix转换)转换为具体见证分配的过程。
  • 黑盒和范围约束:PWG还与表示ZK基本器(例如,哈希函数、Merkle树操作)的黑盒函数调用接口,并通过求解范围操作码来检查范围约束。这些调用确保见证值适合特定的比特范围或满足电路所需的密码学属性。

中间变量

ACVM通过中间变量管理复杂表达式:

  • 拆分大表达式:对于超过系统限制的表达式,ACVM使用中间变量拆分它们,以确保逻辑正确性而不超过操作边界。
  • 扇入减少:通过引入中间变量,ACVM减少表达式中的线性项数量,使它们适合于单个操作码约束。

ACVM中的回溯和递归处理

ACVM还支持递归优化过程:

  • 优化中的回溯:常数反向传播等技术涉及在电路中的递归传递,简化表达式,并将常数在电路中传播,以在最终证明生成之前减少约束。

有关更多详细信息,请查看官方GitHub仓库

PLONKish算术化

PLONKish算术化,源自UltraPLONK,是Noir ZK电路设计的基础,提供了通过先进门构造和查找论证的灵活性。它利用域论性质、多项式承诺和电路抽象构建安全、高效的系统。

矩阵结构和有限域算术

在PLONKish算术化中,电路被建模为有限域FFF上的二维矩阵。矩阵中的每一行表示计算过程中的一步,而列则分类为不同的数据类型:

  • 固定列:这些由电路设计预定义,其中选择特定值以驱动选择器、控制自定义门,以及操控多项式约束。
  • 建议列:建议列包含见证值,即证明者提供的私有输入。这里的主要挑战是在不向验证者透露这些私有输入的情况下,施加对这些私有输入的约束。
  • 实例列:实例列保存公共输入或通用值,通常在证明者和验证者之间共享。

有限域FFF在所有操作中施加了模运算。通常,行的数量nnn是2的幂,这促进了高效的快速傅里叶变换(FFT)技术以执行多项式评估。

多项式约束和多元系统

PLONKish算术化的核心在于使用多元多项式约束。矩阵的每一行必须满足一组多项式方程,确保电路所编码的操作对于给定的见证输入是有效的。

  • 行约束:每一行的多项式约束必须计算为零,代表有效的计算步骤。这些约束不仅参考当前行,还参考相邻行(以nnn为模的循环),使得顺序依赖能够有效编码。这一结构与循环群属性相似。
  • 度和约束复杂性:多项式约束的度是一个关键因素。较高的度约束允许跨行编码更复杂的操作,但也会增加证明生成的复杂性。管理约束度的增长对于保持证明系统的高效性能至关重要,同时保持表达能力。

查找论证和自定义门

查找论证使得电路能够有效处理非线性操作或预定义值集合,而无需高阶多项式约束:

  • 高效的非线性关系:查找表用于断言某些见证值属于预定义集合。这种方法对于诸如模运算或密码哈希函数等操作特别高效,因为直接编码约束会显得过于复杂。
  • 自定义门:Noir通过允许在选择多项式下有条件激活的自定义门扩展标准PLONK门集。这些选择器值位于固定列中,充当二元开关,决定哪些约束适用于特定的行。这个特性使得Noir能够高效地建模复杂的密码学操作(如椭圆曲线算术),而不增加多项式度。

相等约束和行间依赖性

相等约束是PLONKish算术化内另一个强大的工具。它们强制执行两个特定单元(跨不同的行或列)必须包含相同的值。这些约束对于确保电路内的一致性至关重要,特别是在处理不同操作之间的共享状态时。

在Noir中,相等约束允许在矩阵内进行全局引用。这在处理需要在多步计算(行)之间保持一致的证明时尤为重要。例如,确保一个步骤的输出(行)成为另一个步骤的输入,可以通过将相应单元通过相等约束连接在一起实现。

证明和验证密钥生成

从电路配置生成两个关键密钥:证明密钥和验证密钥。这些密钥编码电路的结构和约束,对于证明生成和验证至关重要。

  • 证明密钥:编码电路的多项式约束、查找论证和自定义门。在证明生成期间,证明者使用此密钥构建见证值,执行多项式评估,并生成有效的证明。
  • 验证密钥:编码电路结构的压缩描述,包括公共输入和固定列。验证者使用此密钥确认证明的正确性,而无需访问私有见证值。

有关更深入的信息,请参见Halo2书ZK术语解码器

Plonky2、UltraHonk和Halo2在Noir中的应用

扩展PLONKish算术化的证明后端集成到Noir中,增强了可扩展性、效率和证明生成。Plonky2、UltraHonk和Halo2各自优化了证明构建和验证的特定方面,使Noir能够针对广泛的ZKP应用。

扩展PLONKish算术化

这些系统在不同ZKP应用中增加了专业能力,基于PLONKish算术化进行构建:

  • Plonky2:专注于递归证明组合,使多个证明的高效聚合和验证成为可能,从而减少整体复杂性。
  • Halo2:消除了对可信设置的需求,使用多项式IOP进行递归证明,而不依赖于任何预先建立的可信参数。

Plonky2:递归证明和大字段算术

Plonky2在递归证明组合方面表现出色,使其理想适用于高吞吐量系统,例如zk-rollup,在这些系统中,多个证明被压缩为单个递归证明,从而大幅减少验证时间。

关键增强:

  • 递归证明组合:在Plonky2中,每个证明可以验证另一个,从而降低整体验证成本。这是通过递归多项式承诺实现的,其中证明Pi+1P i+1Pi+1验证PiP iPi,允许证明层级和压缩:

  • 快速多项式算术:Plonky2旨在在如2642^{64}264这样的大片场上工作,采用快速傅里叶变换(FFT)进行快速多项式乘法和评估。FFT降低大约束集的处理复杂性,使Plonky2在需要大字段算术的电路中高效。

在Noir中,当编译到Plonky2时,递归证明生成对于大型分层计算变得高效,使状态转换或多步骤加密协议的批处理成为可能。

Halo2:无信任的递归证明

Halo2消除对可信设置的需求,并利用多项式IOPs进行递归证明,使其非常适合需要最小化信任假设的去中心化应用程序。

关键增强:

  • 无可信设置:Halo2使用多标量乘法和多项式IOPs来递归地验证多项式约束,而无需预先建立的可信参数。多项式评估以高效的方式进行:

递归证明:Halo2支持如Plonky2的递归证明,但无需可信设置。这使得多阶段计算能够聚合为单一证明,无额外开销。

在Noir中,Halo2的无信任递归使其成为需要去中心化、可验证证明的应用程序的理想选择。当Noir为Halo2编译ACIR电路时,可以在没有任何依赖于可信设置的情况下生成递归证明,确保高安全性和可扩展性。

有关此ZK证明系统的进一步阅读,请参见Plonky2深入分析TurboPLONKHalo2书

4. Noir中的递归证明

Noir中的递归证明允许构建高级的零知识(ZK)电路,在单个证明内高效验证多个相互依赖的计算层。这一技巧对于需要验证一系列相互关联的计算的场景至关重要,例如分层审计或多阶段过程,其中每个证明基于前一个证明。递归证明使开发者能够逐步聚合证明,确保每个计算步骤在各个阶段符合预期规则。

递归证明的一个显著优势是它们能够并行化证明生成过程,将多个证明压缩为单个证明以优化验证,并支持像基于回合的游戏等点对点应用程序,其中参与者递归验证彼此的移动。通过将复杂计算拆分为独立的子任务,递归证明允许这些任务在多个较小的计算机上并发执行。这不仅减少了整体证明生成时间,还优化了计算资源,使其更具成本效益。能够通过并行处理处理复杂的多步骤计算是一个强大的特性。

示例:多步骤财务审计的递归证明

想象一个去中心化的金融系统,需要一个多步骤的审计过程,以确保不同账户间诸多交易的正确性。每个账户维护着交易的分类账,而审计人员需要验证的不仅是单个账户余额的正确性,还有父账户与其各自子账户之间的关系。递归证明使审计人员能够高效地通过多个层次验证整个结构,只需一个单一的证明。

递归过程遵循以下步骤:

  1. 交易验证:每个账户(A1、A2、B1)进行单独的交易审计。这些交易(Tx1、Tx2等)通过ZK证明进行验证,以确保其正确性。
  2. 账户审计:下一层聚合这些交易验证的结果。例如,账户A1的证明验证交易验证(Tx1和Tx2)。同样,账户A2和B1也验证其各自的交易审计。
  3. 分支和全局审计:最后一步涉及在分支级别的递归聚合。分支1(包括账户A1和A2)聚合来自子账户的证明结果并进行递归验证。分支2对账户B1做同样处理。这些分支证明随后递归组合成一个单一的全局审计证明。
1            全局证明
2            _____________
3           |             |
4     分支 1          分支 2
5    ______|______      _____|_____
6   |             |    |           |
7 账户 A1     账户 A2     账户 B1
8

5. 结论

总之,Noir为零知识证明开发提供了一种简化且易于访问的方法,使开发人员可以在没有深入密码学知识的情况下构建保护隐私的应用程序。

这结束了《Noir语言深入研究》的第一部分!

在下一章中,我们将通过构建一个去中心化的投票系统来应用这些概念。这个现实世界的例子将展示Noir的特性如何用来确保去中心化应用程序的隐私、安全性和完整性。

请联系Three Sigma,让我们经验丰富的专业团队自信地引导你穿越Web3领域。凭借我们在智能合约安全、经济建模和区块链工程方面的专业知识,我们将帮助你确保项目的未来。

今天就 联系我们,让你的Web3愿景成为现实!

  • 原文链接: threesigma.xyz/blog/noir...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Three Sigma
Three Sigma
Three Sigma is a blockchain engineering and auditing firm focused on improving Web3 by working closely with projects in the space.