--- sidebar_position: 1 --- # Groups You can write the doc here. Before pushing your changes we'll remove the text below. ___ ## Key points ### Merkle tree/groups relationship Groups are actually incremental Merkle trees and group members are tree leaves. Since the Merkle tree implementation we are using now is a binary Merkle tree, the max number of members of a group is equal to `2 ^ treeDepth`. We will allow devs to use different tree depths (probably a range from 16 to 32). It could make sense to show the different group sizes a dev could use based on tree depths: | Tree depth | Group max size | | -------- | -------- | | 16 | 2^16 = 65536 | | 17 | 2^17 = 131072 | | ... | ... | Merkle trees are very useful when you want to prove that a leaf is part of the tree without sharing the whole data structure, but only the path from the leaf to the root. Merkle proofs are part the Semaphore zero-knowledge proofs. ### `SemaphoreGroup.sol` contract Groups can be used by extending the `SemaphoreGroups.sol` contract. It contains 3 internal functions that must be called in the parent contract for group management (`_createGroup`, `_addMember`, `_removeMember`), and 3 public functions to get group information (`getRoot`, `getDepth`, `getNumberOfLeaves`). The extension contracts are a good example to see how Semaphore groups can be used. ## Suggestions * The guide could introduce the Semaphore groups by explaining what they are and why they are used. * The guide could explain how developers can use the `SemaphoreGroup.sol` contract and its functions.