Skip to main content
Version: V3

What Is Semaphore?

Overview​

Semaphore is a zero-knowledge protocol that allows you to cast a signal (for example, a vote or endorsement) as a provable group member without revealing your identity. Additionally, it provides a simple mechanism to prevent double-signaling. Use cases include private voting, whistleblowing, anonymous DAOs and mixers.

Features​

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

  1. Create a Semaphore identity.
  2. Add their Semaphore identity to a group (i.e. Merkle tree).
  3. Send a verifiable, anonymous signal (e.g a vote or endorsement).

When a user broadcasts a signal (for example: a vote), Semaphore zero-knowledge proofs can ensure that the user has joined the group and hasn't already cast a signal with their nullifier.

Semaphore uses on-chain Solidity contracts and off-chain JavaScript libraries that work in tandem.

  • Off chain, JavaScript libraries can be used to create identities, manage groups and generate proofs.
  • On chain, Solidity contracts can be used to manage groups and verify proofs.

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

Trusted Setup Ceremony​

The secure parameters for generating valid proofs with Semaphore circuits were generated in a Trusted Setup Ceremony that was completed with over 300 participants on 29 March 2022.

Audits​

VersionAuditorsReportScope
v2.0.0PSESemaphore_2.0.0_Audit.pdfcircuits, contracts
v2.5.0PSESemaphore_2.5.0_Audit.pdfcontracts, libraries
v3.0.0VeridiseSemaphore_3.0.0_Audit.pdfcircuits, contracts
info

If you are using one of the previous versions of Semaphore, see the Semaphore V1 or the Semaphore V2 documentation.