Semaphore groups
Use Semaphore in your application or smart contract to create off-chain and on-chain groups.
A Semaphore group contains identity commitments of group members. Example uses of groups include the following:
- Poll question that attendees join to rate an event.
- Ballot that members join to vote on a proposal.
- Whistleblowers who are verified employees of an organization.
A Semaphore group is an incremental Merkle tree, and group members (i.e., identity commitments) are tree leaves. Semaphore groups set the following two parameters:
- Tree depth: the maximum number of members a group can contain (
max size = 2 ^ tree depth). - Zero value: the value used to calculate the zero nodes of the incremental Merkle tree.
Learn how to work with groups.
Off-chain groups
Create a group
Use the @semaphore-protocol/group library Group class to create an off-chain group.
Options
- Tree depth: (default
20) the maximum number of members a group can contain (max size = 2 ^ tree depth). - Zero value: (default
BigInt(0)) the value for a tree node that doesn't have a member assigned.
To create a group with default treeDepth and zeroValue, call the Group constructor without parameters--for example:
import { Group } from "@semaphore-protocol/group"
// Default parameters: treeDepth = 20, zeroValue = BigInt(0).
const group = new Group()
The following example code passes treeDepth to create a group for 2 ^ 30 = 1073741824 members:
import { Group } from "@semaphore-protocol/group"
const group = new Group(30)
The following example code creates a group with a zeroValue of BigInt(1):
import { Group } from "@semaphore-protocol/group"
const group = new Group(20, BigInt(1))
Add members
Use the Group addMember function to add a member (identity commitment) to a group--for example:
group.addMember(identityCommitment)
To add a batch of members to a group, pass an array to the Group addMembers function--for example:
group.addMembers([identityCommitment1, identityCommitment2])
Remove or update members
To remove members from a group, pass the member index to the Group removeMember function--for example:
group.removeMember(0)
To update members in a group, pass the member index and the new value to the Group updateMember function--for example:
group.updateMember(0, 2)
Removing a member from a group sets the node value to zeroValue.
Given that the node isn't removed, and the length of the group.members array doesn't change.
On-chain groups
The SemaphoreGroups contract uses the IncrementalBinaryTree library and provides methods to create and manage groups.
You can import SemaphoreGroups and other Semaphore contracts from the @semaphore-protocol/contracts NPM module.
Alternatively, you can use an already deployed Semaphore contract and use its group external functions.