Saltar al contenido principal
Versión: V3

Gupos Semaphore

Un grupo Semaphore contiene los identity commitments (compromisos de identidad) de miembros del grupo. Estos son algunos ejemplos de uso de los grupos:

  • Encuesta con preguntas a la que se unen las personas que acudieron a un evento para calificarlo,
  • votaci√≥n a la que se unen los miembros para votar por una propuesta,
  • Denunciantes que est√°n verificados como empleados de una organizaci√≥n.

Un grupo Semaphore es un √°rbol de Merkle incremental, y los miembros del grupo (por ejemplo, identity commitments) son las hojas del √°rbol. Los grupos Semaphore determinan los siguientes dos par√°metro:

  • Group id: un identificador √ļnico para el grupo;
  • Tree depth: el n√ļmero m√°ximo de miembros que puede contener un grupo (max size = 2 ^ tree depth).

Aprenda cómo trabajar con grupos.

Grupos off-chain (externos a la cadena)‚Äč

Crear un grupo‚Äč

Utilice la clase Group de la librería @semaphore-protocol/group para crear un grupo off-chain con los siguientes parámetros:

  • Group id: un identificar √ļnico para el grupo;
  • Tree depth: (default 20) el n√ļmero m√°ximo de usuarios que puede contener un grupo, el valor por defecto es 20 (max size = 2 ^ tree depth).

Para crear un grupo con el n√ļmero de usuarios que aparece por defecto (20) treeDepth, llame la funci√≥n para construir un Group sin el segundo par√°metro. Por ejemplo:

import { Group } from "@semaphore-protocol/group"

const group = new Group(1)

El siguiente código de ejemplo pasa por treeDepth para crear un grupo para 2 ^ 30 = 1073741824 miembros:

import { Group } from "@semaphore-protocol/group"

const group = new Group(1, 30)

A√Īadir miembros‚Äč

Utiliza la funci√≥n Group addMember para a√Īadir un miembro (es decir su "identity commitment") a un grupo. Por ejemplo:

group.addMember(identityCommitment)

Para a√Īadir un lote de miembros a un grupo, pasa una selecci√≥n por la funci√≥n Group addMembers. Por ejemplo:

group.addMembers([identityCommitment1, identityCommitment2])
precaución

Cuando utiliza la misma identidad Semaphore en varios grupos, si un atacante toma control de esa identidad, todos los grupos de los que forma parte estar√°n comprometidos. Considere utilizar identidades diferentes para cada grupo.

Remover o actualizar miembros‚Äč

Para remover miembros de un equipo, pasa el índice del miembro por la función Group removeMember. Por ejemplo:

group.removeMember(0)

Para actualizar los miembros dentro de un grupo, pasa el índice del miembro y el nuevo valor por la función Group updateMember. Por ejemplo:

group.updateMember(0, 2)
precaución

Remover a un miembro de un grupo configura el valor del nodo a un valor especial (ejemplo, zeroValue). Dado que ese nodo no se remueve y el largo de la selección de group.members no cambia.

Grupos on-chain‚Äč

El contrato SemaphoreGroups utiliza la librería del IncrementalBinaryTree (árbol binario incremental) y provee métodos para crear y administrar grupos.

rmación

puede importar el contrato SemaphoreGroups.sol y otros contratos Semaphore del módulo NPM @semaphore-protocol/contracts.

Alternativamente, puede utilizar un contrato Semaphore.sol ya desplegado y utilizar sus funciones externas para grupos.

precaución

Semaphore.sol no revisa si un miembro con un identity commitment en específico ya existe en un grupo. Esta revisión se debe realizar off-chain.

precaución

Semaphore.sol incluye un mecanismo para verificar pruebas Semaphore creadas con raíces de árboles de Merkle antiguas. La duración de este mecanismo puede ser definido por el admin en la función createGroup. Por lo tanto, los miembros de un grupo pueden continuar generando pruebas válidas incluso después de ser removidos. Para más información ver el issue #98.