# 介绍 Noir：零知识的通用语言

By [Aztec中文](https://paragraph.com/@aztecnetworkcn) · 2023-01-21

---

翻译自2022年10月7日的官方文章：

[https://medium.com/aztec-protocol/introducing-noir-the-universal-language-of-zero-knowledge-ff43f38d86d9](https://medium.com/aztec-protocol/introducing-noir-the-universal-language-of-zero-knowledge-ff43f38d86d9)

经过 18 个月的开发，我们很高兴推出 Noir：零知识证明的语言。

Noir 是一种基于 Rust 领域的特定语言 (DSL)，用于创建和验证零知识证明。这是编写与任何证明系统兼容的 zk 应用程序最简单的方法。

我们还宣布了两个新的Typescript库：NoirJS和Barretenberg.js，前者可以在浏览器中编译Noir系统，后者可以在浏览器中证明和验证这些系统。

**|** **_开始使用 Noir_**

**是什么阻碍了ZK应用程序的开发？**

目前的zk堆栈是繁琐的，很难理解。我们的zk系统建设是同行的，如Circom和ZoKrates，是强大而灵活的，但它们需要有加密概念的知识，为开发者的广泛采用造成了障碍。

现有的系统编程语言需要两个大脑。

1.一个了解证明系统、可信设置和一些低级密码学的**密码学大脑**，以及：

2.**应用程序开发人员的大脑**，可以直观地推理公共和私有状态以创建新颖的区块链应用程序

没有多少人有两个大脑！这意味着今天 zk 应用程序开发人员的数量只是区块链开发人员总数的一小部分。

Noir 的简单性意味着拥有一个大脑就足够了。

通过抽象出底层的密码复杂性，同时保留其他方式构建语言的所有功能和灵活性，Noir 允许任何开发人员——而不仅仅是那些具有密码学知识的开发人员——来构建 zk 应用程序。开发人员现在可以专注于设计私有应用程序背后的逻辑。

**单脑解决方案：Noir语言**

Noir 使创建 zk 系统和应用比以往任何时候都更容易。

**简单、熟悉的语法** Noir与Rust的相似性使其简单、熟悉、易于理解。

![](https://storage.googleapis.com/papyrus_images/9280d234540eb970155cdce72ffe0ef1c4a65c0d0e9c6f235f4065b4a73298e8.png)

创建条件就像写“if”一样简单。使用其他 zk 系统编写语言需要下载系统库，阅读它们以了解其底层逻辑，然后调用库实现基本功能。

许多像 Pedersen 哈希这样的基本函数不必在 Noir 系统中重新实现——它们已经融入了语言本身。

**｜_示例：_**[**_Circomlib 的多路复用器实现_**](https://github.com/iden3/circomlib/blob/master/circuits/mux1.circom)

Noir的简单性也意味着与其他系统编写语言相比，生活质量有极大的改进。

简易的依赖性管理。Noir有自己的软件包管理器 nargo ，它模拟了 Rust 的 crate 和软件包管理系统。nargo 支持使用上传到 Github 的依赖关系，允许开发者将 Noir 系统的依赖关系和集成这些系统的项目分开。

更简单的系统调试。开发人员还可以使用 nargo 来证明和验证系统，而不是编写脚本和下载证明和验证器密钥。

自主执行。最后，开箱即用的 Noir 允许你构建已编译的 Solidity 合约，以验证任何 EVM 兼容区块链上的证明。智能合约开发者现在可以根据 Noir 证明来执行逻辑。

**标准加密库**

Noir 还拥有一个在系统开发中常用的高度优化的标准函数库。

stdlib 使开发人员能够访问广泛使用的复杂算法，这些算法由 Aztec 团队手写并经过严格优化。抽象层的简单性和效率之间总是存在权衡——在这种情况下，程序转换为约束的效率如何。

标准库为开发人员提供了高水平的系统效率，同时与简单易用的抽象层进行交互。

**证明系统不可知**

最后，由于 Noir 并不直接编译成系统，而是编译成一种中介表示（类似于 LLVM ），所以它与多种后端证明系统兼容，包括 PLONK、Groth16 和 Marlin 。

我们称这种中间表示为 ACIR （抽象系统中间表示）。

Aztec Network 有一个运行在 Plonk 上的名为 Barretenberg 的证明系统后端。但是使用 Noir 进行开发意味着您可以根据需要插入任何基于 SNARK 的证明系统。

**Noir 的实践**

Noir 的直观性必须亲眼目睹才能相信，所以我们创建了一些 Noir 的系统实现样本，以向你展示它们与通用参考代码的对比：

🧠 **Mastermind**

[Mastermind](https://en.wikipedia.org/wiki/Mastermind_\(board_game\))是一个简单的数字猜测游戏，类似于疯狂流行的益智游戏 Wordle 。我们在 Noir中对 Mastermind 的实现大约是现有参考实现长度的一半。

**|** [_Mastermind in Circom_](https://github.com/vezenovm/week3/blob/master/Part1/contracts/circuits/hitandblow.circom)

**|** [_Mastermind in Noir_](https://github.com/vezenovm/mastermind-noir/blob/master/circuits/src/main.nr)

🌪️ **Tornado Cash** 引擎盖下的 Tornado Cash 允许用户证明他们拥有 Merkle Tree 中的给定票据。下面我们仅用 10 行就展示了类似 Merkle 成员资格证明的示例实现。

**|**[Tornado Cash in Circom](https://github.com/tornadocash/tornado-core/blob/master/circuits/withdraw.circom)

**|**[Tornado Cash in Nori](https://github.com/vezenovm/simple_shield/blob/master/circuits/src/main.nr)

**Barretenberg.js** 最后，在今天发布 Noir 的同时，我们还开发并发布了 Barretenberg.js --用于 Aztec 的 Barretenberg 后端的 Noir Typescript 包装。它允许应用开发者在 Javascript 中创建证明，而不是通过 Rust 命令。

该包装器可以在浏览器中直接构建证明，使 zk 开发人员能够快速、轻松地创建全栈 Noir 程序。

Noir 抽象出了大量密码学，使开发人员能够使用密码功能而不用担心安全问题，从而降低了开发障碍。

**Noir：语言**

Noir 语言是类似于 Rust 的语言，具有开箱即用的功能，任何应用程序开发者都应该熟悉这些功能：

*   函数
    
*   子模块
    
*   结构/用户定义的类型
    
*   If 语句
    
*   循环
    
*   全局常量
    

还有一些我们正在研究但尚未实现的功能，如泛型和高阶函数。

**用例**

现在 Noir 可以用来构建 zk 游戏，速度比以前快得多。Wordle、Battleships 和 Mastermind的实现可以在一个下午完成。

借助 Barretenberg.js 库，开发者还可以在 Aztec Connect 上创建会员和身份证明、盲拍和行动证明，从而获得私人空投。

我们相信 Noir 是实用 zk 开发的转型步骤。因此，我们目前正致力于使用 Noir 重写 Aztec 的核心系统，并且我们一直在努力提高其可用性。

**入门**

您听说过零知识证明。您甚至听说过SNARKs、PLONK和zkRollups。但您从来没有开始过，因为您没有多余的大脑来学习密码学。

今天一切都变了。以下是如何在 15 分钟内安装 Noir、编译您的第一个 zk 程序并在 Solidity 合约中验证它：

[**｜开始使用Noir**](https://docs.aztec.network/developers/noir)

一旦你起步，请向我们展示你所建立的成果。

我们还有一部分Aztec资助计划，专门资助有Circom、Zokrates或Leo等语言编写系统经验的Noir开发者。如果你有兴趣以早期测试者的身份积极参与Noir的开发，请查看我们的[赠款页面](https://aztec.network/grants/)以了解更多信息。

如果你要去哥伦比亚区块链周，我们会为 ETHBogota 提供 20,000 美元的奖金，奖励使用 Noir 构建的新颖的 zk 应用程序。

我们将发布更多关于Noir开发的指南，并增加其背后的工具基础设施，目的只有一个--让 Noir 成为零知识的通用语言。

生态系统 Noir 的生态系统刚刚起步。但既然我们已经向你展示了我们正在进行的工作，我们希望你能作出贡献。

目标不是[标准的肆意扩散](https://xkcd.com/927/)，而是一个语言栈，其普遍性和灵活性加强了它在整个生态系统中的实用性。

这意味着我们希望听到你的声音。为语言和Barretenberg库做出贡献，并加入我们的Discord，直接与Noir团队交谈：[discord.gg/aztec](http://discord.gg/aztec)

**加入我们**

我们正在寻找有才华的工程师和应用密码学家。如果加入为区块链带来可扩展隐私的使命让你感到兴奋，请查看我们的[空缺职位](https://angel.co/company/aztec-network/jobs)。

---

*Originally published on [Aztec中文](https://paragraph.com/@aztecnetworkcn/noir)*
