Skip to main content
Version: V2

What Is Semaphore?


Semaphore is a zero-knowledge protocol that allows users to prove their membership in a group and send signals such as votes or endorsements without revealing their identity. Additionally, it provides a simple mechanism to prevent double-signaling. Use cases include private voting, whistleblowing, anonymous DAOs and mixers.


With Semaphore, you can allow your users to do the following:

  1. Create a private identity and get a provable anonymous public identity.
  2. Add an anonymous public identity to a group (i.e. Merkle tree).
  3. Anonymously broadcast a signal if the user joined the group and hasn't yet used the nullifer.

Semaphore uses on-chain smart contracts and off-chain zero-knowledge components that work in tandem.

  • Off chain, zero-knowledge components allow users to generate identities and proofs.
  • On chain, smart contracts manage groups and verify proofs that, if valid, allow the smart contract to update its state.

Developer benefits

Semaphore is designed to be a simple and generic privacy layer for decentralized applications (dApps) on Ethereum. It encourages modular application design, allowing dApp developers to choose and customize the on-chain and off-chain components they need.

About the code

The core of the protocol is in the circuit logic. In addition to circuits, Semaphore provides Solidity contracts and JavaScript libraries that allow developers to generate zero-knowledge proofs and verify them with minimal effort.

The Semaphore V2 codebase was audited with a focus on the smart contracts and the Circom circuits. See the audit summary.


If you are using the previous version of Semaphore, see the Semaphore V1 documentation (code).