Skip to main content
Version: V4-beta

Contracts

Semaphore contracts are designed with minimal yet essential code, enabling developers to efficiently manage on-chain groups and verify or validate zero-knowledge proofs. There are three contracts:

info

To use Semaphore contracts and interfaces in your project, install the @semaphore-protocol/contracts NPM package.

SemaphoreVerifier.sol

SemaphoreVerifier.sol is an extended version of the Groth16 verifier generated by default with SnarkJS. It contains a function for verifying proofs and a list of verification keys parameters.

Since the Semaphore circuit is compiled with a MAX_DEPTH range from 1 to 32 during the trusted setup, the verifier must contain the parameters of the verification keys of each instance.

SemaphoreGroups.sol

SemaphoreGroups.sol is an abstract contract which contains the functions required to create on-chain groups, and add/remove/update members. Each group is assigned an admin, which can be an Ethereum account or another contract.

This contract uses the LeanIMT.sol ZK-Kit library, an optimized binary incremental Merkle tree with Poseidon.

Semaphore.sol

Semaphore.sol inherits SemaphoreGroups.sol and adds functions to verify (verifyProof) or validate (validateProof) a Semaphore proof. The only constructor parameter is the SemaphoreVerifier.sol address, which must be deployed separately.

The verifyProof function contains code for checking whether a Semaphore proof is true or false. It is a read-only view function that in addition to verifying the proof also includes a mechanism for keeping track of proofs generated with old Merkle roots, i.e. group instances that contained fewer or different members.

The validateProof function first checks whether a proof with the same nullifier has already been validated, and then verifies the proof with the verifyProof function and saves the nullifier. This function also creates a log with the group id and the proof, which can then additionally be verified off-chain.

info

Semaphore contracts are deployed on the main testnets and Arbitrum One. See the deployed contracts to check the addresses.