Skip to main content
Version: V2

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.

Audits

VersionReportScope
v2.0.0Semaphore_2.0.0_Audit.pdfcircuits, contracts
v2.5.0Semaphore_2.5.0_Audit.pdfcontracts, libraries
info

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