Skip to main content
Version: v0.36.0
Noir LogoNoir Logo

Noir is an open-source Domain-Specific Language for safe and seamless construction of privacy-preserving Zero-Knowledge programs, requiring no previous knowledge on the underlying mathematics or cryptography.

ZK programs are programs that can generate short proofs of statements without revealing all inputs to the statements. You can read more about Zero-Knowledge Proofs here.

What's new about Noir?

Noir works differently from most ZK languages by taking a two-pronged path. First, it compiles the program to an adaptable intermediate language known as ACIR. From there, depending on a given project's needs, ACIR can be further compiled into an arithmetic circuit for integration with the proving backend.

info

Noir is backend agnostic, which means it makes no assumptions on which proving backend powers the ZK proof. Being the language that powers Aztec Contracts, it defaults to Aztec's Barretenberg proving backend.

However, the ACIR output can be transformed to be compatible with other PLONK-based backends, or into a rank-1 constraint system suitable for backends such as Arkwork's Marlin.

Who is Noir for?

Noir can be used both in complex cloud-based backends and in user's smartphones, requiring no knowledge on the underlying math or cryptography. From authorization systems that keep a password in the user's device, to complex on-chain verification of recursive proofs, Noir is designed to abstract away complexity without any significant overhead. Here are some examples of situations where Noir can be used:

Noir Logo

Aztec Contracts leverage Noir to allow for the storage and execution of private information. Writing an Aztec Contract is as easy as writing Noir, and Aztec developers can easily interact with the network storage and execution through the Aztec.nr library.

Libraries

Noir is meant to be easy to extend by simply importing Noir libraries just like in Rust. The awesome-noir repo is a collection of libraries developed by the Noir community. Writing a new library is easy and makes code be composable and easy to reuse. See the section on dependencies for more information.