Skip to main content
Version: v0.29.0
Noir Logo

Noir is a Domain-Specific Language for SNARK proving systems developed by Aztec Labs. It allows you to generate complex Zero-Knowledge Programs (ZKP) by using simple and flexible syntax, requiring no previous knowledge on the underlying mathematics or cryptography.

ZK programs are programs that can generate short proofs of a certain statement without revealing some details about it. You can read more about ZKPs 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.


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 library.


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.