---
sidebar_position: 1
title: Identidades
---

import Tabs from "@theme/Tabs"
import TabItem from "@theme/TabItem"

# Identidades Semaphore

Para unirse a un [grupo Semaphore](/V3/glossary#grupo-semaphore), un usuario primero deberá crear una [identidad Semaphore](/V3/glossary#identidad-semaphore).
Una identidad Semaphore contiene dos valores generados junto con la identidad:

- Identity trapdoor (Identidad trampilla)
- Identity nullifier (Anulador de identidad)

Para utilizar y verificar su identidad, la persona dueña de la identidad (usuario) debe conocer los valores trapdoor y nullifier.
Para prevenir fraudes, la persona dueña debe conservar de forma secreta ambos valores.

## Crear identidades

En su código, utilice la librería [`@semaphore-protocol/identity`](https://github.com/semaphore-protocol/semaphore/tree/main/packages/identity) para crear una identidad Semaphore *de forma determinística* (del hash de un mensaje) o *de forma aleatoria*.

- [**Crear identidades aleatorias**](#crear-identidades-aleatorias)
- [**Crear identidades determinísticas**](#crear-identidades-determinísticas)

### Instalar librería:

<Tabs
  defaultValue="npm"
  groupId="package-managers"
  values={[
{label: 'npm', value: 'npm'},
{label: 'Yarn', value: 'yarn'},
{label: 'pnpm', value: 'pnpm'}
]}
>
  <TabItem value="npm">
    ```bash
    npm install @semaphore-protocol/identity@^3
    ```
  </TabItem>

  <TabItem value="yarn">
    ```bash
    yarn add @semaphore-protocol/identity@^3
    ```
  </TabItem>

  <TabItem value="pnpm">
    ```bash
    pnpm add @semaphore-protocol/identity@^3
    ```
  </TabItem>
</Tabs>

### Crear identidades aleatorias

Para crear una identidad aleatoria, represente `Identity` sin algún parámetro. Por ejemplo:

```ts
import { Identity } from "@semaphore-protocol/identity"

const { trapdoor, nullifier, commitment } = new Identity()
```

La nueva identidad contiene dos valores aleatorios secretos: `trapdoor` y `nullifier`, y un valor público: `commitment`.

El hash Poseidon del identity nullifier y trapdoor se conoce como *identity secret* (el secreto de identidad),
y su hash es el *identity commitment* (compromiso de identidad).

Un identity commitment (compromiso de identidad), de forma similar a las direcciones Ethereum, es un valor público que se utiliza en los grupos Semaphore para representar la
identidad de un miembro del grupo. Los valores secretos son similares a las llaves privadas
Ethereum y se utilizan para generar pruebas de conocimiento cero (ZKP) Semaphore y autenticar señales.

### Crear identidades determinísticas

Si transmite un mensaje como un parámetro, Semaphore genera `trapdoor` y `nullifier`
del hash *SHA256* del mensaje.
El mensaje puede ser una contraseña o un mensaje que el usuario firma de forma criptográfica con una llave privada.

Al utilizar identidades determinísticas siempre deberá mantener secreto el mensaje.
Dado que el hash es determinístico, cualquier persona con el mismo mensaje puede recrear la misma identidad.

```ts
const identity = new Identity("secret-message")
```

:::tip
Crear un sistema que guarde o recupere valores secretos de identidades Semaphore no es trivial.
Puede elegir delegar este tipo de funcionalidad a carteras existente como Metamask. Por ejemplo:

1. En Metamask, un usuario firma un mensaje con la llave privada de su cuenta Ethereum.
2. En la aplicación que usted ofrece, el usuario crea una identidad determinística con el mensaje firmado.
3. Ahora el usuario puede recrear su identidad Semaphore cuando quiera al firmar el mismo mensaje con su cuenta Ethereum en Metamask.

:::

## Guarde sus identidades

Puede generar una identidad como una cadena de caractéres JSON que puede guardar y reutilizar más tarde.
El método `Identity.toString()` genera una matriz JSON a partir de una identidad. Por ejemplo:

```ts
console.log(identity.toString()) // Ver la identidad trampilla y anulador.

// '["8255d...", "62c41..."]'
```

La matriz contiene la trapdoor y el nullifier.

Para reutilizar la identidad guardada, transforme la cadena JSON al constructor `Identity()`.

```ts
const identity2 = new Identity(identity.toString())
```
